摘要:,借鑒之前使用的經(jīng)驗(yàn),嘗試直接使用與發(fā)現(xiàn),豆瓣的短評,最一開始還好,但是在爬取將近十多頁的短評時,會報(bào)出的異常,查詢后得知,應(yīng)該是豆瓣對于游客用戶的限制,需要登錄才可以。爬蟲實(shí)踐戰(zhàn)狼豆瓣影評分析
豆瓣上有著大量的影視劇的評論,所以說,要是想要實(shí)現(xiàn)對廣大人民群眾的觀點(diǎn)的分析,對一部片子的理解,綜合來看大家的評論是很有必要的。而短評作為短小精干的快速評論入口,是值得一談的。
所以先要實(shí)現(xiàn)對其的數(shù)據(jù)的爬取。
目前來看,基本內(nèi)容是可以爬取的。最大的問題在于速度。后續(xù)考慮準(zhǔn)備運(yùn)用多線程的方式處理下。以及可以嘗試其他提速的方法。
下面是這個程序的構(gòu)思編寫過程。
構(gòu)思準(zhǔn)備 爬取的思路,及反省與思考 盲目狀態(tài)最初,并不知道豆瓣對于未登陸用戶的限制,盲目的爬取,看著評論文件,發(fā)現(xiàn)行數(shù)太少,也就是說評論內(nèi)容太少,感覺不對勁。
我利用了即時打印寫入內(nèi)容的方式,發(fā)現(xiàn),到了第十頁左右的時候,出現(xiàn)無法獲得頁面內(nèi)評論內(nèi)容,思考了下后,試著將頁面源代碼打印出來,發(fā)現(xiàn)到了后面,就出現(xiàn)提示權(quán)限不足。我一下子知道了,是因?yàn)闆]有登錄的原因。
登錄之前看過內(nèi)容,明白這時候應(yīng)該借助cookie的方式了。
但是又要處理驗(yàn)證碼。而且,似乎初次登陸的時候并不需要驗(yàn)證碼。為了方便,下面直接使用了存在驗(yàn)證碼的方式。
由于開始不了解,不知道應(yīng)該提交哪些信息,多方查找后,終于明白,就是在登錄頁面登陸后,打開瀏覽器的開發(fā)者工具里,查看里面的網(wǎng)絡(luò),注意關(guān)注里面的方法一列中的post所在行那項(xiàng)。在登陸點(diǎn)擊后,隨著頁面的跳轉(zhuǎn),會出現(xiàn)一個post頁面,點(diǎn)擊后查看其參數(shù),若是火狐的話有個專門的參數(shù)窗口,其中就有要提交的參數(shù)了。包括用戶信息,還有登錄跳轉(zhuǎn)頁面(redir)等等。
在最初,我直接將https://accounts.douban.com/login選作登錄地址,當(dāng)然也將從其登陸的信息復(fù)制了出來,但是發(fā)現(xiàn)登錄到redir還可以,要是用opener.open()再登錄 "https://movie.douban.com/subject/26934346/comments?start=" + str(start) + "&limit=20&sort=new_score&status=P" 這里構(gòu)造的頁面是登不上的。這里我也是測試了好久才發(fā)現(xiàn)的問題。具體原因我不清楚??赡苁怯心男┲R我是遺漏了的。
后來覺察到這一點(diǎn)后,我嘗試使用現(xiàn)在的信息登錄,如下。
main_url = "https://accounts.douban.com/login?source=movie" formdata = { "form_email":"你的郵箱", "form_password":"你的密碼", "source":"movie", "redir":"https://movie.douban.com/subject/26934346/", "login":"登錄" } user_agent = r"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36" headers = {"User-Agnet": user_agent, "Connection": "keep-alive"}
誒,竟然登上去了!
關(guān)于驗(yàn)證碼的糾結(jié)思考由于豆瓣的驗(yàn)證碼是登一次變一次的。所以在發(fā)生上面的問題時,在沒有找到正確的處理辦法之時,我懷疑是因?yàn)轵?yàn)證碼,在我獲取上一次驗(yàn)證碼圖片,并將驗(yàn)證信息輸入到formdata這個提交信息的字典中后,再次使用request.Request(url=main_url, data=logingpostdata, headers=headers)與opener.open(req_ligin).read().decode("utf-8")的時候,會不會驗(yàn)證碼發(fā)生了變化?而我提交的是剛才的驗(yàn)證碼?
又開始查資料,后來終于明白,這里提交的信息中指定了驗(yàn)證碼的圖片的captchaID,這樣使得提交信息時候,返回來的驗(yàn)證碼圖片也就是這個,圖片id是唯一的,當(dāng)你自己修改了提交內(nèi)容,豆瓣也會使用你提供的這個id來獲取服務(wù)器里的驗(yàn)證碼圖片,所以保證了圖片的一致。(這是我的理解,覺得有問題,或者更精確的理解的,歡迎留言)
使用庫的考慮 BeautifulSoup, re準(zhǔn)備嘗試下beautiful soup這個庫,對于拆解html頁面很便利。但是在實(shí)踐中,還是可能會用到正則表達(dá)式re模塊??梢姡齽t表達(dá)式還是很重要的。掌握基本可以查表使用時必須的。
在代碼中可以看出,我對于該庫的使用還是有些粗,不巧妙,還有待加強(qiáng)。
不過,今天嘗試了下,用CSS選擇器還是很方便的。select()方法,很方便,可以參考從瀏覽器開發(fā)者工具里選擇元素對應(yīng)的CSS選擇器,很直接。
urllib.request,http.cookiejar借鑒之前使用urllib.request的經(jīng)驗(yàn),嘗試直接使用urllib.request.Request(url, headers=headers)與urllib.request.urlopen(request, data=None, timeout=3)發(fā)現(xiàn),豆瓣的短評,最一開始還好,但是在爬取將近十多頁的短評時,會報(bào)出Forbidden的異常,查詢后得知,應(yīng)該是豆瓣對于游客用戶的限制,需要登錄才可以。參考網(wǎng)上一些其他教程,可以使用設(shè)置cookie的方法來處理。
使用了cookiejar.CookieJar()聲明對象,來保存cookie到了變量中。利用的request.HTTPCookieProcessor()來創(chuàng)建cookie處理器。利用request.build_opener()構(gòu)造了一個 opener,后面利用opener.open()來打開直接網(wǎng)頁或者處理請求。
socket類似上一個爬蟲里的設(shè)置,這里直接使用了全局的超時設(shè)定。
import socket timeout = 3 socket.setdefaulttimeout(timeout)
限制三秒,超出就拋出socket.timeout異常。捕獲后重新連接。
# 超時重連 state = False while not state: try: html = opener.open(url).read().decode("utf-8") state = True except socket.timeout: state = Falsetime
為了防止爬取過快,設(shè)置了循環(huán)的延時。
for ...: ... time.sleep(3)完整代碼
# -*- coding: utf-8 -*- """ Created on Thu Aug 17 16:31:35 2017 @note: 為了便于閱讀,將模塊的引用就近安置了 @author: lart """ # 用于生成短評頁面網(wǎng)址的函數(shù) def MakeUrl(start): """make the next page"s url""" url = "https://movie.douban.com/subject/26934346/comments?start=" + str(start) + "&limit=20&sort=new_score&status=P" return url # 登錄頁面信息 main_url = "https://accounts.douban.com/login?source=movie" formdata = { "form_email":"你的郵箱", "form_password":"你的密碼", "source":"movie", "redir":"https://movie.douban.com/subject/26934346/", "login":"登錄" } user_agent = r"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36" headers = {"User-Agnet": user_agent, "Connection": "keep-alive"} # 保存cookies便于后續(xù)頁面的保持登陸 from urllib import request from http import cookiejar cookie = cookiejar.CookieJar() cookie_support = request.HTTPCookieProcessor(cookie) opener = request.build_opener(cookie_support) # 編碼信息,生成請求,打開頁面獲取內(nèi)容 from urllib import parse logingpostdata = parse.urlencode(formdata).encode("utf-8") req_ligin = request.Request(url=main_url, data=logingpostdata, headers=headers) response_login = opener.open(req_ligin).read().decode("utf-8") # 獲取驗(yàn)證碼圖片地址 from bs4 import BeautifulSoup try: soup = BeautifulSoup(response_login, "html.parser") captchaAddr = soup.find("img", id="captcha_image")["src"] # 匹配驗(yàn)證碼id import re reCaptchaID = r" p") for text in comments: file.write(text.get_text().split()[0] + " ") print(text.get_text()) limit_num = 0 if item == pagenum - 1: limit_num =+ 1 if limit_num == commentnum: break time.sleep(3) print("采集寫入完畢")結(jié)果
可見至少也有9200條評論,不管是否有所遺漏,基數(shù)已經(jīng)基本無差。
后續(xù)處理數(shù)據(jù)已經(jīng)到手,怎樣玩耍就看自己的想法了,近期看到了一篇文章,講了利用詞頻制作詞云,生成圖片,有點(diǎn)意思,決定模仿試試。
Python 爬蟲實(shí)踐:《戰(zhàn)狼2》豆瓣影評分析
github:amueller/word_cloud
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40735.html
摘要:對之前我的那個豆瓣的短評的爬蟲,進(jìn)行了一下架構(gòu)性的改動。同時也添加了多線程的實(shí)現(xiàn)。我的代碼中多線程的核心代碼不多,見下。注意使用多線程時,期間的延時時間應(yīng)該設(shè)置的大些,不然會被網(wǎng)站拒絕訪問,這時你還得去豆瓣認(rèn)證下我真的不是機(jī)器人尷尬。 對之前我的那個豆瓣的短評的爬蟲,進(jìn)行了一下架構(gòu)性的改動。盡可能實(shí)現(xiàn)了模塊的分離。但是總是感覺不完美。暫時也沒心情折騰了。 同時也添加了多線程的實(shí)現(xiàn)。具體...
摘要:準(zhǔn)備把豆瓣上對它的影評短評做一個分析。這樣就得到了最新電影的信息了。例如戰(zhàn)狼的短評網(wǎng)址為其中就是電影的,表示評論的第條評論。如下圖所示好的,至此我們已經(jīng)爬取了豆瓣最近播放電影的評論數(shù)據(jù),接下來就要對數(shù)據(jù)進(jìn)行清洗和詞云顯示了。 簡介 剛接觸python不久,做一個小項(xiàng)目來練練手。前幾天看了《戰(zhàn)狼2》,發(fā)現(xiàn)它在最新上映的電影里面是排行第一的,如下圖所示。準(zhǔn)備把豆瓣上對它的影評(短評)做...
摘要:用戶就我們這一個宿舍而其中電影的資源則是選擇來自有大量電影電視劇信息的豆瓣。爬蟲應(yīng)對反爬蟲機(jī)制目前來說豆瓣的反爬蟲機(jī)制算是可以接受。 前言 前段時間和室友鬧劇荒,于是萌生出一種做個私人化推薦系統(tǒng)想法。(用戶就我們這一個宿舍)而其中電影的資源則是選擇來自有大量電影電視劇信息的豆瓣。 目前,電影的信息已經(jīng)抓取完畢,共有11159條JSON格式的數(shù)據(jù),內(nèi)容包括: 題目 時長 類型 導(dǎo)演 主...
摘要:本文代碼地址爬取豆瓣電影爬取拉勾網(wǎng)職位信息模擬登陸知乎為什么沒人給我點(diǎn)贊。職位名職位信息運(yùn)行結(jié)果模擬登錄知乎通過開發(fā)者工具,獲取的數(shù)據(jù)。 我開通了公眾號【智能制造專欄】,以后技術(shù)類文章會發(fā)在專欄。用Python寫爬蟲是很方便的,最近看了xlzd.me的文章,他的文章寫的很到位,提供了很好的思路。因?yàn)樗奈恼虏糠执a省略了。下面是基于他的文章的三個代碼片段:基于Python3,Pytho...
摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標(biāo)配系統(tǒng)。 爬蟲修煉之道——從網(wǎng)頁中提取結(jié)構(gòu)化數(shù)據(jù)并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關(guān)注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網(wǎng)絡(luò)爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉(zhuǎn)為絕對URL,如何限速,...
閱讀 1830·2021-10-09 09:44
閱讀 2703·2021-09-22 15:38
閱讀 2499·2021-09-09 09:33
閱讀 703·2021-09-07 09:58
閱讀 1830·2021-09-02 15:41
閱讀 2515·2019-08-30 15:55
閱讀 1804·2019-08-30 15:55
閱讀 549·2019-08-30 15:44