標籤:

基於cookie登錄爬取豆瓣舌尖短評信息並做詞雲分析

前言:對於豆瓣網站來說,是有一定的反爬蟲機制的。1,封號處理。2,封ip。3,http頭信息。

一,網站分析

1,當我們進入短評首頁時,地址為

https://movie.douban.com/subject/25875034/comments?sort=new_score&status=P

並不能看出什麼規律,然後點擊後頁

https://movie.douban.com/subject/25875034/comments?start=20&limit=20&sort=new_score&status=P&percent_type=

我們就會發現幾個有意義的參數,start,limit這兩個參數,分別別表示當前頁的特徵值和當前頁顯示的條數。於是在點擊後頁

https://movie.douban.com/subject/25875034/comments?start=40&limit=20&sort=new_score&status=P&percent_type=

發現start的值變成了40,我們便發現規律,每一頁start的值加20就是下一頁。或許這只是一般的網站可以這麼推論,面對大網站或許在前面是這個規律,後面的就不是這個規律了。所以我們採取另外一種方式,獲取後頁標籤的鏈接中start的值。然後修改爬蟲鏈接的start的值來爬取數據。

2,爬蟲時發現在start為200之後,就需要登陸才可以查看評論,於是我們需要在爬蟲時,加上cookies。

cookie = {Cookie:bid=scHeqJpnF6o; __yadk_uid=qlDdMu48WIu36JOYmllYOtDYBxVYtAB0; ll="118318"; gr_user_id=b35adfb4-3cdc-4974-be78-d8574e158bf8; _vwo_uuid_v2=A6D48BE905547F801BB1CB3916B40700|0c961b1f186d09164aa312118dea72e5; viewed="27147922"; __utmc=30149280; __utmz=30149280.1520149744.22.20.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; ps=y; ue="956641976@qq.com"; push_noty_num=0; push_doumail_num=0; __utma=30149280.714108626.1492390399.1520149744.1520152611.23; ap=1; _pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1520153866%2C%22https%3A%2F%2Fmovie.douban.com%2Fsubject%2F25875034%2Fcomments%3Fstart%3D220%26limit%3D20%26sort%3Dnew_score%26status%3DP%26percent_type%3D%22%5D; _pk_ses.100001.8cb4=*; __utmv=30149280.17165; _pk_id.100001.8cb4=f6cdd3dbfbeca200.1492390394.22.1520153885.1520149778.; __utmb=30149280.4.10.1520152611; dbcl2="171657323:dfrcBK5rVxI"; ck=X1VR}

3,為防止我們的爬蟲行為被針對,我們需要添加時鐘機制,來控制每隔多久來爬取一次。我們設置2-5秒。

time.sleep(random.randint(2, 5))

二,提取數據

1,我們的目標數據就是評論的內容,於是我們直接使用正則表達式就會很容易得到我們的數據。

data = re.findall(r<p class=""> (.*?)
.*?</p>, html.text, re.S)

2,但還需要提取後頁標籤中的start值,我們同樣使用的正則表達式獲取。

start = re.findall(r<a href="?start=(d+)&amp;limit=20&amp;sort=new_score&amp;status=P&amp;percent_type=" data-page="" class="next">後頁 ></a>,html.text, re.S)[0]

三,寫進文件

1,直接寫進本地文件

with open(rF:spiderdouban_shejian.txt, a, encoding=utf-8) as f: f.write(one_data +
)

四,做詞雲

1,登陸BDP個人版上傳數據,點擊詞雲即可

完整代碼如下

import requestsimport reimport timeimport randomheaders = {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36}cookie = {Cookie:bid=scHeqJpnF6o; __yadk_uid=qlDdMu48WIu36JOYmllYOtDYBxVYtAB0; ll="118318"; gr_user_id=b35adfb4-3cdc-4974-be78-d8574e158bf8; _vwo_uuid_v2=A6D48BE905547F801BB1CB3916B40700|0c961b1f186d09164aa312118dea72e5; viewed="27147922"; __utmc=30149280; __utmz=30149280.1520149744.22.20.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; ps=y; ue="956641976@qq.com"; push_noty_num=0; push_doumail_num=0; __utma=30149280.714108626.1492390399.1520149744.1520152611.23; ap=1; _pk_ref.100001.8cb4=%5B%22%22%2C%22%22%2C1520153866%2C%22https%3A%2F%2Fmovie.douban.com%2Fsubject%2F25875034%2Fcomments%3Fstart%3D220%26limit%3D20%26sort%3Dnew_score%26status%3DP%26percent_type%3D%22%5D; _pk_ses.100001.8cb4=*; __utmv=30149280.17165; _pk_id.100001.8cb4=f6cdd3dbfbeca200.1492390394.22.1520153885.1520149778.; __utmb=30149280.4.10.1520152611; dbcl2="171657323:dfrcBK5rVxI"; ck=X1VR}start = 0while True: try: time.sleep(random.randint(2, 5)) url = https://movie.douban.com/subject/25875034/comments?start= + start + &limit=20&sort=new_score&status=P&percent_type= html = requests.get(url, headers=headers, cookies=cookie) start = re.findall(r<a href="?start=(d+)&amp;limit=20&amp;sort=new_score&amp;status=P&amp;percent_type=" data-page="" class="next">後頁 ></a>,html.text, re.S)[0] data = re.findall(r<p class=""> (.*?)
.*?</p>, html.text, re.S) if html.status_code == 200: print(正在獲取start為 + start + 的數據) for one_data in data: with open(rF:spiderdouban_shejian.txt, a, encoding=utf-8) as f: f.write(one_data +
) except Exception as e: print(e) break

運行結果

總結:1,每一個url構成下一頁時,不一定就是按規律累加

2,面對反爬蟲應該加入時鐘機制

3,需要登陸的網站可以直接寫入cookies即可


推薦閱讀:

四、BeautifulSoup庫
利用requests爬取表情包
網易雲音樂Ajax Post參數加密方法
使用requests+beautifulsoup爬取你想要的數據
愛奇藝人物信息scrapy-redis

TAG:python爬蟲 |