基於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+)&limit=20&sort=new_score&status=P&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+)&limit=20&sort=new_score&status=P&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爬蟲 |