1. 實戰(zhàn)任務(wù):運用正則表達(dá)式爬取貓眼電影排行
- 爬取網(wǎng)站:https://maoyan.com/board/4
- 爬取內(nèi)容:電影名稱(name),演員(actor),上映時間(year),評分(score)
2 實戰(zhàn)練習(xí)
2.1 爬蟲思路
- 用requests庫get請求爬取相關(guān)信息,加入請求頭,防止被絆;
- 用re庫對爬取的數(shù)據(jù)進(jìn)行篩選(主要使用findall方法,并添加re.S修飾符);
- 爬取的數(shù)據(jù)進(jìn)行csv存儲;
- 為防止被絆,代碼中加入time sleep(2),每爬取一次休息2s;
- 由于進(jìn)行的是跨頁篩選,url找規(guī)律并使用循環(huán)語句,爬取信息策略封裝為1個小函數(shù),進(jìn)行循環(huán)爬取。
2.2 爬蟲步驟
## 利用正則表達(dá)式爬取貓眼電影排行(rank,name,actor,play_time,score)
# 導(dǎo)入庫,做好存儲預(yù)備工作
import requests
import re
import time
import csv
f = open('C:/Users/home/Desktop/2.csv','w+',encoding='utf-8',newline='')
writer = csv.writer(f)
writer.writerow(['rank','name','actor','play_time','score'])
# 加入請求頭,利用requests請求,爬取數(shù)據(jù)
headers = {
'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
# 利用findall方法篩選所需數(shù)據(jù),將該步驟封裝為函數(shù)get_info
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(' <a href="/films/.*?" title="(.*?)"',res.text,re.S)
actors = re.findall('<p class="star">.*?主演:(.*?)</p>',res.text,re.S)
play_times = re.findall('<p class="releasetime">上映時間:(.*?)</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(),play_time,score[0]+score[1])
# # 設(shè)循環(huán)語句,循環(huán)爬取數(shù)據(jù),每次中斷2s防止被絆
if __name__ == '__main__':
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)
2.3 爬蟲結(jié)果

貓眼電影排行
4 學(xué)習(xí)心得
- 照葫蘆畫瓢寫出了上述代碼,開始re庫篩選數(shù)據(jù)時有打印結(jié)果無問題,未去除多余內(nèi)容,score分整數(shù)和小數(shù)部分,也未作處理。
- 處理對策:開始是url寫錯了,{}后多了一個/,所以導(dǎo)致獲取不到爬蟲結(jié)果。去除多余內(nèi)容方法actor.strip(),該方法在豆瓣爬蟲中未成功使用;小數(shù)合并方法使用字符串加法,score[0] + score[1]。
- 爬蟲代碼寫好了,運行過程也未報錯,要仔細(xì)檢查每行代碼的正確性,確保都能print再一起運行。