查閱了網上的大部分資料,大概都是經過抓包獲取。可是抓包有點麻煩,嘗試了F12,也能夠獲取到評論。以電視劇《在一塊兒》爲例子。評論最底端有個查看更多評論猜想過去應該是 Ajax 的異步加載。
網上的大部分都是構建評論的網址,經過 requests 獲取,正則表達式進行數據處理。本文也利用該方法進行數據處理,其實利用 scrapy 會更簡單。
根據前輩給出的經驗,順利找到了評論所在的連接。html
在新標籤中打開,該網址的連接。python
評論都在"content":"xxxxx"
裏面,全部能夠經過正則表達式獲取。
那麼如今要開始構建網址,找到其規律。
在查找評論連接的過程當中無心發現,點擊影評旁邊的評論總數,能夠獲取到更爲乾淨的評論界面。結果是同樣的。git
既然是要爬取全部的評論,因此知道評論數是必不可少的。github
再經過F12獲取到評論連接,找到網址的規律,構建網址,加載三四個評論就好了。這裏加載了四個網址。把全部網址複製到文本文件中,進行對比分析。正則表達式
觀察發現只有 cursor 和 source 進行了改變,其餘是不變的,二 source 是在第一個的基礎上進行加一操做,因此只須要獲取到 cursor 便可。咱們打開一個評論連接的網址,咱們能夠知道,cursor 實際上是上一頁 最後一個用戶的ID碼。因此咱們只須要在爬取上一頁的時候一塊兒爬蟲了。而後就能夠構建網址。docker
這個代碼仍是簡單的。套用以前上課作的模板就能夠直接進行爬蟲了。
經過正則表達式獲取評論,返回一個列表;
正則表達式得到的 cursor 碼是列表,因此要轉化爲字符串使用;
source 很簡單了,直接在上一個的基礎上加一便可。python爬蟲
def getComment(html): # 爬取單頁評論 findeComment = re.compile(r'"content":"(.*?)"', re.S) comment = re.findall(findeComment, html) # print(comment) return comment def getCursor(html): # 獲取下一頁的cursor碼 findeCursor = re.compile(r'"last":"(.*?)"', re.S) cursor = re.findall(findeCursor, html)[0] # print(cursor) return cursor def getSource(source): # 獲取下一頁的source碼 source = int(source) + 1 return str(source)
有點難度的可能就送弄代理吧,可是代理能夠模仿網上其餘人的寫法,因此仍是不是很難。dom
#添加用戶代理 def ua(uapools): thisua = random.choice(uapools) # print(thisua) headers = ("User-Agent", thisua) opener = urllib.request.build_opener() opener.addheaders = [headers] # 設置爲全局變量 urllib.request.install_opener(opener)
仔細查看了源碼,發現評論主要在 data 下面的 oriCommList 列表裏,其餘範圍的評論爲子評論。我的認爲子評論也算有效評論,目前不打算處理。
異步
嘗試了 xpath 和 requests 發現不能獲取所有評論數,因此目前只能經過 selenium 獲取,可是 selenium 效率過低了,就獲取一個評論總數,還不如打開源碼直接修改評論總數,因此暫時沒有修改scrapy
由於以前爬蟲過不少網站,同一個 user-agent 很容易被 ban ,因此目前構建了用戶代理,而後進行隨機。其實還想加一個 ip 代理的,可是使用了 ip 代理的網址,上面寫的正常的 ip ,在使用的時候,拒絕鏈接。也嘗試過構建代理池。可是代理池通常都是使用docker 和 Redis 進行獲取。暫時沒有選用,之選用了用戶代理,而後在獲取 headers 的時候加個 time.sleep(1)。目前仍是正常的。
'utf-8' codec can't decode byte 0xff in position 1: invalid start byte
遇到這個問題,實在無語,我懷疑後面的評論是新出的 emjoy,而後utf-8不能識別,程序掛掉了。可是選取其餘格式,在解釋的過程估計還會掛掉,就暫時爬到1萬條吧。
Python爬蟲實戰:爬取騰訊視頻的評論
python爬蟲(3)——用戶和IP代理池、抓包分析、異步請求數據、騰訊視頻評論爬蟲
應對反爬蟲最簡單的策略——隨機UA+遞歸request