簡介
目標(biāo):利用python爬蟲强重,獲取貓眼電影Top100榜單數(shù)據(jù)(排名、電影名纱意、演員婶溯、上映時(shí)間及國家、評(píng)分)偷霉,并以CSV格式儲(chǔ)存迄委。
主要內(nèi)容及爬取思路:
1.導(dǎo)入所需python庫(requests/re/time/csv)、headers等必備信息
2.以首頁為例类少,獲取首頁源代碼叙身,利用正則表達(dá)式提取各類所需要的信息
3.觀察頁面URL變化規(guī)律,構(gòu)造鏈接池
4.將所獲取數(shù)據(jù)硫狞,寫入CSV文件儲(chǔ)存
以貓眼電影Top榜單首頁為例信轿,提取各類所需信息
鏈接地址:https://maoyan.com/board/4?offset=0
右鍵點(diǎn)擊檢查晃痴,分別找到排名、電影名财忽、主演倘核、上映時(shí)間及評(píng)分的源代碼
利用正則表達(dá)式,在排名源代碼基礎(chǔ)上進(jìn)行更改即彪,構(gòu)造出可以提取整個(gè)頁面所有排名信息的表達(dá)式紧唱。
rank = re.findall('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
輸出結(jié)果如下
同樣的方法,分別找到其他信息的源代碼進(jìn)行更改
以下分別為:排名隶校、電影名漏益、演員、上映時(shí)間惠况、分?jǐn)?shù)
rank = re.findall('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
name = re.findall('</i>.*?<a href="/films/.*?" title="(.*?)"',res.text,re.S)
actor = re.findall('<p class="star">.*?主演:(.*?)</p>',res.text,re.S)
time = re.findall('<p class="releasetime">上映時(shí)間:(.*?)</p>',res.text,re.S)
score1 = re.findall('<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>',res.text,re.S)
構(gòu)造能夠獲取所有頁面的鏈接表達(dá)式
通過觀察遭庶,每一分頁的鏈接表達(dá)式分別為:
第一頁:https://maoyan.com/board/4?offset=0
第二頁:https://maoyan.com/board/4?offset=10
第三頁:https://maoyan.com/board/4?offset=20
可以發(fā)現(xiàn)規(guī)律,每一分頁只有在后面的參數(shù)發(fā)生了變化稠屠,所以如果想獲取 TOP100 電影峦睡,只需要分開請(qǐng)求 10 次,而 10 次的 offset 參數(shù)設(shè)置為 0权埠,10榨了,20,…攘蔽,90 即可龙屉。
可使用一個(gè)for循環(huán),循環(huán)10次即可满俗。為了防止網(wǎng)頁對(duì)爬蟲進(jìn)行封殺转捕,將休眠時(shí)間time定為2秒,階段代碼如下唆垃。
urls = ['https://maoyan.com/board/4?offset={}'.format(str(i))for i in range(0,100,10)]
for url in urls:
get_info(url)
time.sleep(2)
將所獲取數(shù)據(jù)存儲(chǔ)進(jìn)CSV文件
f = open('D:\PycharmProjects/1.csv','w+')
writer = csv.writer(f)
writer.writerow(['XXX','XXX','XXX'])
代碼匯總
將階段性代碼封為函數(shù)五芝、
import requests
import re
import time
import csv
f = open('D:\PycharmProjects/2.csv','w+',encoding='utf-8',newline='')
writer = csv.writer(f)
writer.writerow(['rank','name','actor','time','score'])
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
}
def get_info(url):
res = requests.get(url, headers=headers)
ranks = re.findall('<i class="board-index board-index-.*?">(.*?)</i>',res.text,re.S)
names = re.findall('</i>.*?<a href="/films/.*?" title="(.*?)"',res.text,re.S)
actors = re.findall('<p class="star">.*?主演:(.*?)</p>',res.text,re.S)
times = re.findall('<p class="releasetime">上映時(shí)間:(.*?)</p>',res.text,re.S)
scores = re.findall('<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>',res.text,re.S)
for rank, name, actor, play_time, score in zip(ranks,names,actors,play_times,scores):
writer.writerow([rank,name,actor.strip(),time,score[0]+score[1]])
if __name__ == '__main__':
urls = ['http://maoyan.com/board/4?offset={}'.format(str(i)) for i in range(0,100,10)]
for url in urls:
get_info(url)
time.sleep(2)
運(yùn)行結(jié)果
初學(xué)正則表達(dá)式,如有錯(cuò)誤辕万,請(qǐng)多指教枢步!