1. 程式人生 > >記一次簡單爬蟲(豆瓣/dytt)

記一次簡單爬蟲(豆瓣/dytt)

 

磕磕絆絆學python一個月,這次到正則表示式終於能寫點有趣的東西,在此作個記錄:

 

—————————————————————————————————————————————————

 

1.爬取豆瓣電影榜前250名單

 

執行環境:

pycharm-professional-2018.2.4

3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)]   

 

成品效果:

 

相關程式碼:

 1
from urllib.request import urlopen 2 import re 3 # import ssl # 若有數字簽名問題可用 4 # ssl._create_default_https_context = ssl._create_unverified_context 5 6 7 # 寫正則規則 8 obj = re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?導演:(?P<daoyan>.*?)&nbsp;.*?
' 9 r'主演:(?P<zhuyan>.*?)<br>\n (?P<shijian>.*?)&nbsp;/&nbsp;(?P<diqu>.*?)&nbsp;' 10 r'/&nbsp;(?P<leixing>.*?)\n.*?<span class="rating_num" property="v:average">(?P<fen>.*?)</span>.*?<span>
' 11 r'(?P<renshu>.*?)評價</span>.*?<span class="inq">(?P<jianping>.*?)</span>',re.S) # re.S 幹掉換行 12 13 # 轉碼 獲取內容 14 def getContent(url): 15 content = urlopen(url).read().decode("utf-8") 16 return content 17 18 # 匹配頁面內容 返回一個迭代器 19 def parseContent(content): 20 iiter = obj.finditer(content) 21 for el in iiter: 22 yield { 23 "name":el.group("name"), 24 "daoyan":el.group("daoyan"), 25 "zhuyan":el.group("zhuyan"), 26 "shijian":el.group("shijian"), 27 "diqu":el.group("diqu"), 28 "leixing":el.group("leixing"), 29 "fen":el.group("fen"), 30 "renshu":el.group("renshu"), 31 "jianping":el.group("jianping") 32 } 33 34 35 for i in range(10): 36 url = "https://movie.douban.com/top250?start=%s&filter=" % (i*25) # 迴圈頁面10 37 print(url) 38 g = parseContent(getContent(url)) # 匹配獲取的內容返回給g 39 f = open("douban_movie.txt",mode="a",encoding="utf-8") 40 for el in g: 41 f.write(str(el)+"\n") # 寫入到txt 注意加上換行 42 43 # f.write("==============================================") # 測試分頁 44 f.close()

 

 

2.爬取某站最新電影和下載地址

 

執行環境:

pycharm-professional-2018.2.4

3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)]   

 

成品效果:

 

相關程式碼:

 1 from urllib.request import urlopen
 2 import json
 3 import re
 4 
 5 # 獲取主頁面內容
 6 url = "https://www.dytt8.net/"
 7 content = urlopen(url).read().decode("gbk")
 8 # print(content)
 9 
10 # 正則
11 obj = re.compile(r'.*?最新電影下載</a>]<a href=\'(?P<url1>.*?)\'>', re.S)
12 obj1 = re.compile(r'.*?<div id="Zoom">.*?<br />◎片  名(?P<name>.*?)<br />.*?bgcolor="#fdfddf"><a href="(?P<download>.*?)">', re.S)
13 
14 
15 def get_content(content):
16     res = obj.finditer(content)
17     f = open('movie_dytt.json', mode='w', encoding='utf-8')
18     for el in res:
19         res = el.group("url1")
20         res = url + res  # 拼接子頁面網址
21 
22         content1 = urlopen(res).read().decode("gbk")  # 獲取子頁面內容
23         lst = obj1.findall(content1)  # 匹配obj1返回一個列表
24         # print(lst)  # 元組
25         name = lst[0][0]
26         download = lst[0][1]
27         s = json.dumps({"name":name,"download":download},ensure_ascii=False)
28         f.write(s+"\n")
29     f.flush()
30     f.close()
31 
32 
33 get_content(content)  # 呼叫函式 執行