1. 程式人生 > >正則匹配的抓取貓眼電影排行Top100

正則匹配的抓取貓眼電影排行Top100

本案例,我們利用requests庫和正則表示式來抓取貓眼電影TOP100的相關內容。

1.目標

提取貓眼電影Top100的電影名稱、時間、評分、圖片(下載),提取的站點URL為:http://maoyan.com/board/4,圖片將儲存到指定資料夾中。

2.準備工作

需要安裝requests包(安裝方式:在配好的環境中:pip install requests即可)

3.抓取分析

通過開啟網頁,找到網頁之間的規律,如圖:
這裡寫圖片描述
可以發現頁面的URL變成:http://maoyan.com/board/4?offset=10,比之前的URL多一個引數,offset=10,並且目前顯示的結果是:11~20名的電影,由此可以找到其他排名電影頁面的URL規律。

4. 正則提取分析

在瀏覽器端的開發者模式下的Network監聽元件下檢視原始碼,如圖:
這裡寫圖片描述
而每個電影的內容都在一個dd標籤下:
這裡寫圖片描述
正則表示式書寫:

<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         + '.*?integer">(.*?)</i
>
.*?fraction">(.*?)</i>.*?</dd>

需要說明的是:以上的每個括號表示的就是要獲取的內容。

5.寫入檔案

在獲取提取的結果後,我們將資料寫到一個txt文件中,這裡資料是使用json格式的內容書寫的。

6.下載圖片

涉及到語言、圖片、視訊的時候,我們可以使用:with open("",'rb')的形式書寫。儲存。

7.程式碼詳解

#爬蟲庫
import requests
#json資料格式庫
import json
#requests異常
from requests.exceptions import RequestException
#正則表示式
import re #延遲函式 import time #定義一個讀取一個url並返回相應資訊的函式 def get_one_page(url): try: #偽裝瀏覽器 headers={ "User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' } #讀取網頁 response=requests.get(url,headers=headers) #判斷是否讀取成功 if response.status_code==200: #返回讀取的內容(html程式碼) return response.text return None except RequestException: return None #定義一個解析html程式碼的函式 def parse_one_page(html): #編譯成一個正則表示式物件 pattern = re.compile(r'<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a' + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>' + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S) #開始查詢 items = re.findall(pattern, html) #遍歷查詢到的內容 for item in items: #使用關鍵字yield 類似於return 返回的是一個生成器物件 yield { 'index': item[0], 'image': item[1], 'title': item[2], 'actor': item[3].strip()[3:], 'time': item[4].strip()[5:], 'score': item[5] + item[6] } #將結果寫到一個txt文件中 def write_to_file(content): with open('result.txt', 'a', encoding='utf-8') as f: f.write(json.dumps(content, ensure_ascii=False) + '\n') #圖片下載 def pic_download(url,title): r=requests.get(url) with open("pics/"+title+".jpg",'wb') as f: f.write(r.content) #開啟需要爬取得所有網頁,並進行爬取 def main(offset): #網頁連結 url='http://maoyan.com/board/4?offset='+str(offset) #請求網頁,獲取html html=get_one_page(url) #遍歷處理後的html結果 for item in parse_one_page(html): #下載圖片 pic_download(item['image'], item['title']) #寫入到檔案中 write_to_file(item) if __name__ == '__main__': for i in range(10): main(offset=i*10) #延遲1秒,避免反爬機制 time.sleep(1)

8.執行結果

這裡寫圖片描述

這裡寫圖片描述
這裡寫圖片描述