抓取貓眼電影排行

2022-03-27 23:33:20 字數 3982 閱讀 8393

抓取貓眼電影排行

1. 抓取分析

需要抓取的目標url為:開啟之後便可以檢視到電影的排行,如下圖:

可以發現第二頁的url為第三頁的url為以此類推。

2. 抓取第一頁

定義乙個函式用於抓取乙個頁面,函式的引數就是url,將我們要抓取頁面的url傳給函式,返回的結果就是伺服器端的響應。

import

requests

defget_one_page(url):

headers =

response = requests.get(url,headers=headers)

if response.status_code == 200:

return

response.text

return none

傳送請求的函式很快就定義了,剩下的問題就是呼叫這個函式去發請求了,這裡我們通過main方法來呼叫:

def

main():

url = '

'html =get_one_page(url)

print

(html)

if__name__ == '

__main__':

main()

可以發現上面拿到的html就是第一頁的原始碼了,接下來要做的就是從原始碼裡面將我們需要的資訊抽取出來(這裡通過正規表示式實現):

從原始碼分析,一部電影的資訊就用乙個dd標籤存著。首先,需要提取電影的排名資訊,而這個資訊正好在calss為board-index的i節點內,這裡使用非貪婪匹配來提取i節點內的資訊,正規表示式為:'.*?board-index.*?>(.*?)';

隨後需要提取電影的,可以看到,後面有a節點,其內部有兩個img標籤,經過測試,第二個img標籤的data-src屬性就是的連線,所以這裡提取的就是這個屬性的值:'.*?board-index.*?>(.*?).*?data-src="(.*?)"' ;

再往後,需要抓取電影的名稱,它在後面的p標籤內,class為name,所以,可以用name做乙個標誌位,然後進一步提取到其內a節點的標籤體:'.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?)' ;

最後提取主演、上映時間、評分等內容:

'.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star.*?>(.*?)

.*?releasetime.*?>(.*?)

.*?integer.*?>(.*?).*?fraction.*?>(.*?).*?'

通過這樣的乙個正規表示式就可以將我們需要的資料都提取出來了,然後這裡也是通過乙個函式去解析乙個網頁:

def

parse_one_page(html):

pattern = re.compile('

.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star.*?>(.*?)

.*?releasetime.*?>(.*?)

.*?integer.*?>(.*?).*?fraction.*?>(.*?).*?

',re.s)

items =re.findall(pattern,html)

for item in

items:

yield

這樣就可以將我們需要的資料封裝成乙個物件返回,接下來就是資料的儲存了,這裡先使用文字直接儲存:

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

main(offset):

url = '

?offset=

' +str(offset)

html =get_one_page(url)

for item in

parse_one_page(html):

write_to_file(item)

if__name__ == '

__main__':

for i in range(10):

main(offset=i*10)

3. 完整**

import

requests

from requests.exceptions import

requestexception

import

reimport

json

import

time

defget_one_page(url):

try:

headers =

response = requests.get(url,headers=headers)

if response.status_code == 200:

return

response.text

return

none

except

requestexception:

return

none

defparse_one_page(html):

#定義正規表示式,獲取電影的排名,名稱,主演,上映時間,評分

pattern =re.compile(

'.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star.*?>(.*?)

.*?releasetime

' + '

.*?>(.*?)

.*?integer.*?>(.*?).*?fraction.*?>(.*?).*?

',re.s

)items =re.findall(pattern,html)

print

(items)

for item in

items:

yield

defwrite_to_file(content):

with open(

'result.txt

','a

',encoding='

utf-8

') as f:

f.write(json.dumps(content,ensure_ascii=false) + '\n'

)def

main(offset):

url = '

?offset=

' +str(offset)

html =get_one_page(url)

for item in

parse_one_page(html):

write_to_file(item)

if__name__ == '

__main__':

for i in range(10):

main(offset=i*10)

#防止反爬蟲機制

time.sleep(2)

抓取貓眼電影排行

首先將第乙個頁面抓取下來 import requests 抓取乙個 def get one page url headers response requests.get url,headers headers 判斷響應的狀態碼 if response.status code 200 return r...

抓取貓眼電影排行

今天學習 python3網路爬蟲 第三章時,在章節尾部的爬取貓眼電影排行練習中成功實現,但這一部分有點不明白,先記錄下來 def get one page url try headers response requests.get url,headers headers if response.st...

學習抓取貓眼電影排行

抓取目標貓眼電影top100的電影資訊 使用requests和正規表示式 抓取分析 站點url為,開啟看到榜單資訊等 跳轉第二頁url變為?offset 10,第三頁?offset 20,對比不難發現url中引數offset代表電影序號偏移量。抓取首頁 import requests def get...