抓取貓眼電影


注意:抓取內容之前一定要查看下Robots協議

1、准備工作

  1》第一步,安裝python,安裝requests、json庫。

2、抓取分析

  1》接下來我們打開網頁分析下貓眼電影排行榜

  2》貓眼電影排行榜的網址(http://maoyan.com/board/4)

   

 

    3》拉到最下面,可以看到第一頁只有10個,點擊下一頁

      http://maoyan.com/board/4?offset=10,網址變了,添加了offset=10,那也就是說TOP100,offset=10、20、30...

    

 

   

3、抓取首頁

  開始抓取貓眼電影排行的首頁

 1 import requests
 2 
 3 
 4 def get_one_page(url):
 5     headers = {
 6         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理瀏覽器
 7             + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
 8     }
 9     response = requests.get(url, headers = headers)   # 響應頭
10     if response.status_code == 200:        # 判斷是否成功響應
11         return response.text
12     return None
13 
14 def main():
15     url = 'http://maoyan.com/board/4'        # 定義網址
16     html = get_one_page(url)        # 獲取對應的HTML
17     print(html)            # 控制台答應HTML
18 
19 main()

   截取其中一個的界面  

  上面我們獲取到了html,接下來我們嘗試提取其中我們想要的內容

 

4、正則提取

  

 1 import requests
 2 import re  3 
 4 
 5 def get_one_page(url):
 6     headers = {
 7         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理瀏覽器
 8             + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
 9     }
10     response = requests.get(url, headers = headers)   # 響應頭
11     if response.status_code == 200:        # 判斷是否成功響應
12         return response.text
13     return None
14 
15 def parse_one_page(html): 16     pattern = re.compile( 17             '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
18             + '*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S # 正則表達式匹配 19  ) 20     items = re.findall(pattern, html)    # 提取匹配項 21     for item in items: 22         yield{ 23             'index':item[0], 24             'image':item[1], 25             'title':item[2].strip(), 26             'actor':item[3].strip()[3:], 27             'time':item[4].strip()[5:], 28             'score':item[5] + item[6] 29  } 30 
31 
32 def main():
33     url = 'http://maoyan.com/board/4'        # 定義網址
34     html = get_one_page(url)        # 獲取對應的HTML
35     for item in parse_one_page(html):    # 遍歷輸出
36         print(item)            
37 
38 main()

 

  我們看下我們抓取第一頁后的結果

 

5、寫入文件

  抓取完成后,接下來寫入文件

 1 import requests
 2 import re
 3 import json  4 
 5 
 6 def get_one_page(url):
 7     headers = {
 8         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理瀏覽器
 9             + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
10     }
11     response = requests.get(url, headers = headers)   # 響應頭
12     if response.status_code == 200:        # 判斷是否成功響應
13         return response.text
14     return None
15 
16 def parse_one_page(html):
17     pattern = re.compile(
18             '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
19             + '*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S
20         )
21     items = re.findall(pattern, html)
22     for item in items:
23         yield{
24             'index':item[0],
25             'image':item[1],
26             'title':item[2].strip(),
27             'actor':item[3].strip()[3:],
28             'time':item[4].strip()[5:],
29             'score':item[5] + item[6]
30         }
31 
32 def write_to_file(content): 33     with open('result.txt', 'a', encoding = 'utf-8') as f: 34         f.write(json.dumps(content, ensure_ascii=False) + '\n') 35 
36 def main():
37     url = 'http://maoyan.com/board/4'        # 定義網址
38     html = get_one_page(url)        # 獲取對應的HTML
39     for item in parse_one_page(html):
40         print(item)            # 控制台答應HTML
41  write_to_file(item) 42 
43 main()

 

  看下我們寫入的文件,默認在該文件同意目錄下

 

  到現在為止才抓取到第一頁,接下來抓取其他頁

6、分頁爬取

  

 1 import requests
 2 import re
 3 import json
 4 import time
 5 
 6 
 7 
 8 def get_one_page(url):
 9     headers = {
10         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理瀏覽器
11             + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
12     }
13     response = requests.get(url, headers = headers)   # 響應頭
14     if response.status_code == 200:        # 判斷是否成功響應
15         return response.text
16     return None
17 
18 def parse_one_page(html):
19     pattern = re.compile(
20             '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
21             + '*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S
22         )
23     items = re.findall(pattern, html)
24     for item in items:
25         yield{
26             'index':item[0],
27             'image':item[1],
28             'title':item[2].strip(),
29             'actor':item[3].strip()[3:],
30             'time':item[4].strip()[5:],
31             'score':item[5] + item[6]
32         }
33 
34 def write_to_file(content):
35     with open('result.txt', 'a', encoding = 'utf-8') as f:
36         f.write(json.dumps(content, ensure_ascii=False) + '\n')
37 
38 def main(offset):
39     url = 'http://maoyan.com/board/4?offset=' + str(offset)        # 定義網址
40     html = get_one_page(url)        # 獲取對應的HTML
41     for item in parse_one_page(html):
42         print(item)            # 控制台答應HTML
43         write_to_file(item)
44 
45 if __name__ == '__main__':
46     for i in range(10):
47         main(offset=i * 10)
48         time.sleep(1)

 

  這樣就把所有的內容爬取下來了

  

  我們看下我們的result.txt文件

  

 

7、整合代碼

  最后一步,所有的代碼整合下

  

 1 import requests
 2 import re
 3 import json
 4 import time
 5 from requests.exceptions import RequestException
 6 
 7 
 8 def get_one_page(url):
 9     try:
10         headers = {
11             'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理瀏覽器
12                 + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
13         }
14         response = requests.get(url, headers = headers)   # 響應頭
15         if response.status_code == 200:        # 判斷是否成功響應
16             return response.text
17         return None
18     except RequestException:
19         return None
20 
21 def parse_one_page(html):
22     pattern = re.compile(
23             '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
24             + '*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S
25         )
26     items = re.findall(pattern, html)
27     for item in items:
28         yield{
29             'index':item[0],
30             'image':item[1],
31             'title':item[2].strip(),
32             'actor':item[3].strip()[3:],
33             'time':item[4].strip()[5:],
34             'score':item[5] + item[6]
35         }
36 
37 def write_to_file(content):
38     with open('result.txt', 'a', encoding = 'utf-8') as f:
39         f.write(json.dumps(content, ensure_ascii=False) + '\n')
40 
41 def main(offset):
42     url = 'http://maoyan.com/board/4?offset=' + str(offset)        # 定義網址
43     html = get_one_page(url)        # 獲取對應的HTML
44     for item in parse_one_page(html):
45         print(item)            # 控制台答應HTML
46         write_to_file(item)
47 
48 if __name__ == '__main__':
49     for i in range(10):
50         main(offset=i * 10)
51         time.sleep(1)    # 休息1秒,防止抓取數據太快,被封IP

 

   以上呢,利用正則表達式抓去了貓眼電影Top100

8、總結分析

  如果我們需要抓取某些TOP排行榜的網站,我們可以利用requests庫,json庫。。。去抓取

  1、首先獲取首頁

  2、分析首頁,利用正則表達式,匹配自己需要的信息

  3、分頁抓取我么所需要的內容

  4、遍歷寫入到文件

  這樣就算是大功告成了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM