1. 程式人生 > >Python爬蟲運用正則表示式

Python爬蟲運用正則表示式

我看到最近幾部電影很火,查了一下貓眼電影上的資料,發現還有個榜單,裡面有各種經典和熱映電影的排行榜,然後我覺得電影封面圖還挺好看的,想著一張一張下載真是費時費力,於是突發奇想,好像可以用一下最近學的東西實現我的需求,學習了正則表示式之後,想著要感受一下它在爬蟲裡面的效果和優缺點。

目標:爬取Top100榜單上電影的封面圖 

Top100榜單規則:將貓眼電影庫中的經典影片,按照評分和評分人數從高到低綜合排序取前100名,每天上午10點更新。相關資料來源於“貓眼電影庫”。

下面是我做的步驟:

(1)檢視頁面元素,找到包含圖片的路徑的程式碼段落

(2)分析圖片在web上面的唯一屬性,便於之後獲取正確圖片位置資訊

(3)因為需要翻頁,觀察多個頁面的URL變化

(4)綜合以上幾個點,編寫合適的正則表示式

 1、python 標準庫中re模組提供了正則表示式的全部功能,直接引入;requests模組是http庫,爬蟲常用庫,而urllib.requests 則是最後用到寫入檔案的函式

import re
import requests
import urllib.request

2、先接收URL地址的HTML頁面,然後轉化為str形式(正則表示式是匹配字串),第一個pattern1縮小範圍,抓取目標部分,result1接收匹配的結果,這時候所有封面圖地址就在裡面了

response = requests.get(url)
response = str(response.content)
patttern1 = '<dl class="board-wrapper">.+?<div class="pager-main">'
result1 = re.compile(pat).findall(response)

3、第二個正則,匹配圖片的地址資訊

pat2 = '<img data-src="https://(.+?\.jpg)'
photos = re.compile(pat1).findall(re1[0])

這時候爬取到100張圖的資訊,如下圖:

 4、繼續下一步,把每張圖片命名好,需要正確的圖片地址,避免重複

x = 1
for imgurl in name:
    imgname = 'D:/Top 100/'+str(i/10)+str(x)+'.jpg'
    imgurl = 'https://'+imgurl
    urllib.request.urlretrieve(imgurl,filename=imgname)
    x += 1

5、最後一步了,因為需要翻頁爬取,所以加了一個迴圈,10頁內容爬取下來

for i in range(0, 100, 10):
    url = 'http://maoyan.com/board/4?offset='+str(i)
    get_one_page(url, i)
    #定義函式,多次呼叫

相對來說,這是一個很簡單的應用,也是自己學習之後的實踐,在這個例子中,我是用到正則表示式來實現的,還有其他方法,而且可能簡單,比如BeautifulSoup,XPath等方法,用在更加複雜的爬蟲專案裡面,需要的知識更多,方法更嚴謹,還需學習學