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