1. 實戰(zhàn)任務(wù):運用正則表達(dá)式爬取豆瓣電影排行
- 爬取網(wǎng)站:https://movie.douban.com/top250
- 爬取內(nèi)容:電影排行(rank)刮吧,名稱(name)承边,演員(actor),評分(score)毡鉴,評價(comment)崔泵,引用(quote)
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边器,score,comment托修,quote)
# 導(dǎo)入庫忘巧,做好存儲預(yù)備工作
import requests
import re
import time
import csv
f = open('C:/Users/home/Desktop/3.csv','w+',encoding='utf-8',newline='')
writer = csv.writer(f)
writer.writerow(['rank','name','actor','score','comment','quote'])
# 加入請求頭,利用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'
}
url = 'https://movie.douban.com/top250'
# 利用findall方法篩選所需數(shù)據(jù),將該步驟封裝為函數(shù)get_info
def get_info(url):
res = requests.get(url, headers=headers)
ranks = re.findall(' <em class="">(.*?)</em>',res.text,re.S)
names = re.findall('<span class="title">(.*?)</span>.*?<span class="title"> / (.*?)</span>.*?<span class="other"> / (.*?) / (.*?)</span>',res.text,re.S)
actors = re.findall('<p class="">.*?(.*?) (.*?)...<br>.',res.text,re.S)
scores = re.findall('<span class="rating_num" property="v:average">(.*?)</span>',res.text,re.S)
comments = re.findall('<span property="v:best" content="10.0"></span>.*?<span>(.*?)人評價</span>.*?</div>',res.text,re.S)
quotes = re.findall('<span class="inq">(.*?)</span>',res.text,re.S)
for rank,name,actor,score,comment,quote in zip(ranks,names,actors,scores,comments,quotes):
writer.writerow([rank,name,actor,score,comment,quote])
# 設(shè)循環(huán)語句袋坑,循環(huán)爬取數(shù)據(jù),每次中斷2s防止被絆
if __name__ == '__main__':
urls = ['https://movie.douban.com/top250?start={}&filter='.format(str(i)) for i in range(0,250,25)]
for url in urls:
get_info(url)
time.sleep(2)
2.3 爬蟲結(jié)果
豆瓣電影排行
2.4 存在的問題
上述代碼基本可以獲取想要的數(shù)據(jù),但存在很多問題:
- 爬取數(shù)據(jù)有間斷枣宫,未獲取250條信息婆誓,原因在哪?
- 去多余行時難使用.strip()功能也颤,提醒元組不具備該功能洋幻?
- 如何將電影名不同語言拆分,是在excel里相關(guān)功能執(zhí)行還是python本身有此功能翅娶?
-
def get_info(url):出現(xiàn)過多次如下報錯文留,原因在哪?
報錯信息