失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 电影天堂二级页面抓取案例

电影天堂二级页面抓取案例

时间:2022-11-06 03:37:45

相关推荐

电影天堂二级页面抓取案例

# 地址电影天堂 - 新片精品 - 更多# 目标电影名称、下载链接# 分析*********一级页面需抓取***********1、电影详情页链接*********二级页面需抓取***********1、电影名称2、电影下载链接

实现步骤

1、确定响应内容中是否存在所需抓取数据2、找URL规律

第1页 :/html/gndy/dyzz/list_23_1.html第2页 :/html/gndy/dyzz/list_23_2.html第n页 :/html/gndy/dyzz/list_23_n.html

3、写正则表达式

1、一级页面正则表达式<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">.*?</table>2、二级页面正则表达式<div class="title_all"><h1><font color=#07519a>(.*?)</font></h1></div>.*?<td style="WORD-WRAP.*?>.*?>(.*?)</a>

4、代码实现

from urllib import requestimport refrom useragents import ua_listimport timeimport randomclass FilmSkySpider(object):def __init__(self):# 一级页面url地址self.url = '/html/gndy/dyzz/list_23_{}.html'# 获取html功能函数def get_html(self,url):headers = {'User-Agent':random.choice(ua_list)}req = request.Request(url=url,headers=headers)res = request.urlopen(req)# 通过网站查看网页源码,查看网站charset='gb2312'# 如果遇到解码错误,识别不了一些字符,则 ignore 忽略掉html = res.read().decode('gb2312','ignore')return html# 正则解析功能函数def re_func(self,re_bds,html):pattern = pile(re_bds,re.S)r_list = pattern.findall(html)return r_list# 获取数据函数 - html是一级页面响应内容def parse_page(self,one_url):html = self.get_html(one_url)re_bds = r'<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">.*?</table>'# one_page_list: ['/html/xxx','/html/xxx','/html/xxx']one_page_list = self.re_func(re_bds,html)for href in one_page_list:two_url = '' + hrefself.parse_two_page(two_url)# uniform: 浮点数,爬取1个电影信息后sleeptime.sleep(random.uniform(1, 3))# 解析二级页面数据def parse_two_page(self,two_url):item = {}html = self.get_html(two_url)re_bds = r'<div class="title_all"><h1><font color=#07519a>(.*?)</font></h1></div>.*?<td style="WORD-WRAP.*?>.*?>(.*?)</a>'# two_page_list: [('名称1','ftp://xxxx.mkv')]two_page_list = self.re_func(re_bds,html)item['name'] = two_page_list[0][0].strip()item['download'] = two_page_list[0][1].strip()print(item)def main(self):for page in range(1,201):one_url = self.url.format(page)self.parse_page(one_url)# uniform: 浮点数time.sleep(random.uniform(1,3))if __name__ == '__main__':spider = FilmSkySpider()spider.main()

练习

把电影天堂数据存入MySQL数据库 - 增量爬取

# 思路# 1、MySQL中新建表 urltab,存储所有爬取过的链接的指纹# 2、在爬取之前,先判断该指纹是否爬取过,如果爬取过,则不再继续爬取

代码实现

# 建库建表create database filmskydb charset utf8;use filmskydb;create table request_finger(finger char(32))charset=utf8;create table filmtab(name varchar(200),download varchar(500))charset=utf8;

from urllib import requestimport refrom useragents import ua_listimport timeimport randomimport pymysqlfrom hashlib import md5class FilmSkySpider(object):def __init__(self):# 一级页面url地址self.url = '/html/gndy/dyzz/list_23_{}.html'self.db = pymysql.connect('192.168.153.151', 'tiger', '123456', 'filmskydb', charset='utf8')self.cursor = self.db.cursor()# 获取html功能函数def get_html(self, url):headers = {'User-Agent': random.choice(ua_list)}req = request.Request(url=url, headers=headers)res = request.urlopen(req)# 通过网站查看网页源码,查看网站charset='gb2312'# 如果遇到解码错误,识别不了一些字符,则 ignore 忽略掉html = res.read().decode('gb2312', 'ignore')return html# 正则解析功能函数def re_func(self, re_bds, html):pattern = pile(re_bds, re.S)r_list = pattern.findall(html)return r_list# 获取数据函数def parse_page(self, one_url):html = self.get_html(one_url)re_bds = r'<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">.*?</table>'# one_page_list: ['/html/xxx','/html/xxx','/html/xxx']one_page_list = self.re_func(re_bds, html)for href in one_page_list:two_url = '' + href# 生成指纹 - md5加密s = md5()s.update(two_url.encode())two_url_md5 = s.hexdigest()# 判断链接是否需要抓取if self.is_go_on(two_url_md5):self.parse_two_page(two_url)# 爬取完成此链接后将指纹放到数据库表中ins = 'insert into request_finger values(%s)'self.cursor.execute(ins, [two_url_md5])mit()# uniform: 浮点数,爬取1个电影信息后sleeptime.sleep(random.uniform(1, 3))def is_go_on(self, two_url_md5):# 爬取之前先到数据库中查询比对sel = 'select finger from request_finger where finger=%s'# 开始抓取之前,先来判断该链接之前是否抓取过result = self.cursor.execute(sel, [two_url_md5])if not result:return True# 解析二级页面数据def parse_two_page(self, two_url):item = {}html = self.get_html(two_url)re_bds = r'<div class="title_all"><h1><font color=#07519a>(.*?)</font></h1></div>.*?<td style="WORD-WRAP.*?>.*?>(.*?)</a>'# two_page_list: [('名称1','ftp://xxxx.mkv')]two_page_list = self.re_func(re_bds, html)item['name'] = two_page_list[0][0].strip()item['download'] = two_page_list[0][1].strip()ins = 'insert into filmtab values(%s,%s)'film_list = [item['name'], item['download']]self.cursor.execute(ins, film_list)mit()print(film_list)def main(self):for page in range(1, 201):one_url = self.url.format(page)self.parse_page(one_url)# uniform: 浮点数time.sleep(random.uniform(1, 3))if __name__ == '__main__':spider = FilmSkySpider()spider.main()

如果觉得《电影天堂二级页面抓取案例》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。