# 地址
電影天堂 - 2019年新片精品 - 更多
# 目標
電影名稱、下載鏈接
# 分析
*********一級頁面需抓取***********
1、電影名稱
2、電影鏈接
*********二級頁面需抓取***********
1、下載鏈接
實現步驟
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">(.*?)</a>.*?</table> 2、二級頁面正則表達式 <td style="WORD-WRAP.*?>.*?>(.*?)</a>
4、代碼實現
from urllib import request import re from useragents import ua_list 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,html): re_bds = r'<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">(.*?)</a>.*?</table>' # one_page_list: [('/html/xxx','幸福獵人'),()] one_page_list = self.re_func(re_bds,html) item = {} for film in one_page_list: item['name'] = film[1].strip() link = 'https://www.dytt8.net' + film[0] item['download'] = self.parse_two_page(link) # uniform: 浮點數,爬取1個電影信息后sleep time.sleep(random.uniform(1, 3)) print(item) # 解析二級頁面數據 def parse_two_page(self,link): html = self.get_html(link) re_bds = r'<td style="WORD-WRAP.*?>.*?>(.*?)</a>' # two_page_list: ['ftp://xxxx.mkv'] two_page_list = self.re_func(re_bds,html) download = two_page_list[0].strip() return download def main(self): for page in range(1,11): url = self.url.format(page) html = self.get_html(url) self.parse_page(html) # uniform: 浮點數 time.sleep(random.uniform(1,3)) if __name__ == '__main__': spider = FilmSkySpider() spider.main()