Spider -- 多级页面 爬取
# 整体思路 1、爬取一级页面,提取 所需数据+链接,继续跟进 2、爬取二级页面,提取 所需数据+链接,继续跟进 3、... ... # 代码实现思路 1、所有数据最终都会在一级页面遍历每条数据时全部拿到 2、避免重复代码 - 请求、解析需定义函数
领取任务
# 地址 电影天堂 - 2019年新片精品 - 更多 # 目标 电影名称、下载链接 # 分析 *********一级页面需抓取*********** 1、电影详情页链接 *********二级页面需抓取*********** 1、电影名称 2、电影下载链接
实现步骤
-
1、确定响应内容中是否存在所需抓取数据
-
2、找URL规律
第1页 :https://www.dytt8.net/html/gndy/dyzz/list_23_1.html 第2页 :https://www.dytt8.net/html/gndy/dyzz/list_23_2.html 第n页 :https://www.dytt8.net/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 request import re from useragents import ua_list # 自己写的一个模块,提供 随机 User-Agent import time import random class FilmSkySpider(object): def __init__(self): # 一级页面url地址 self.url = 'https://www.dytt8.net/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 = re.compile(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 = 'https://www.dytt8.net' + href self.parse_two_page(two_url) # uniform: 浮点数,爬取1个电影信息后sleep time.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()