欲直接下載代碼文件,關注咱們的公衆號哦!查看歷史消息便可!html
《復仇者聯盟4:終局之戰》已經上映快三個星期了,全球票房破24億美圓,國內票房破40億人民幣。瀏覽器
雖然如今熱度逐漸降低,可是咱們仍是恬不知恥地來蹭一蹭熱度。上映伊始《復聯4》的豆瓣評分曾破了9分。app
後來持續走低,如今《復聯4》的評分穩定在8.6分。雖然豆瓣平常被人吐槽注水嚴重,惡意評分不少,可是因爲它好爬鴨~,咱們仍是選擇豆瓣做爲爬取對象。豆瓣的長評論有文字和圖片等其它元素,簡單起見,此次只爬短評。函數
在瀏覽器中查看豆瓣關於復聯4的短評,先來看看url的結構:編碼
https://movie.douban.com/subject/26100958/comments?start=20&limit=20&sort=new_score&status=Purl
可見,咱們能夠經過修改start的值進入不一樣的頁面:spa
右鍵查看源代碼能夠看到瀏覽器獲取到的html頁面代碼。Ctrl F搜索第一條影評的關鍵詞,快速定位到影評的標籤:code
能夠看到影評內容在span標籤中,class爲「short」。htm
總覽一下爬取內容的步驟:對象
1) 訪問url,獲取html頁面文本,這一步咱們要用到的是requests模塊。
2) 解析返回的文本,提取出爬蟲內容,這一步要用的是beautifulSoup模塊。
這兩個模塊均可以經過pip直接下載。
首先是main函數:
def main(): discuss = [] a = 0 for i in range(0,100,20): url = 'https://movie.douban.com/subject/26100958/comments?start='+ str(i) +'&limit=20&sort=new_score&status=P' HTMLpage = getHTML(url) #print(HTMLpage) for t in parseHTML(HTMLpage): discuss.append(t) for i in discuss: print(str(a) + ':' + i) # print(i) a = a + 1
因爲豆瓣一頁顯示20條影評,咱們爬前100條,因此這裏訪問了前5個頁面:
def getHTML(url): try: r = requests.get(url) r.raise_for_status() print("get html successfully") r.encoding = 'utf-8' #print(r.text) return r.text except: return ""
在getHTML函數中,咱們申請訪問目標頁面,並返回html頁面文本。注意這裏應該將編碼方式設置爲utf-8,實測若是設置成r.encoding = r.apparent_encoding,程序並不能猜想到正確的編碼方式。
當r.raise_for_status() 沒有拋出異常時,程序通知咱們獲取html成功。若是有異常,返回空字符串。
下一步是解析:
如前所述影評是class爲short的span,因此能夠直接使用bs4的find_all()函數獲得一個含有全部影評的tag的列表。咱們只須要把tag中的文字提取出來就能夠返回到主函數了。
首先要生成一個beautifulSoup類的對象,使用html的解析器。html頁面是樹狀分佈的,能夠經過各類樹的遍歷找到咱們須要的標籤,這裏bs4提供了一個簡單粗暴的find_all,能夠直接使用。
find_all()函數返回的是一個保存着tag的列表。
def parseHTML(html): try: soup = BeautifulSoup(html,"html.parser") A = soup.find_all('span',attrs = {'class':'short'}) B = [] for i in A: B.append(i.get_text()) return B except: return []
用get_text函數去掉span標籤,只留下內容的文本,加入到B列表裏。而後就能夠返回了。同理,若是出錯了,返回空列表。
好了以上就是一個很是簡單的小爬蟲,經過修改爬取的數量能夠爬取任意頁面的評論。固然了後續還會對這些數據進行一些有趣的分析,請關注咱們。同時由於做者本人能力有限,本系列可能又要無限託更了/呲牙
下附完整版代碼和運行結果【代碼下載移步留言區】:
import requests from bs4 import BeautifulSoup def getHTML(url): try: r = requests.get(url) r.raise_for_status() print("get html successfully") r.encoding = 'utf-8' #print(r.text) return r.text except: return "" def parseHTML(html): try: soup = BeautifulSoup(html,"html.parser") A = soup.find_all('span',attrs = {'class':'short'}) B = [] for i in A: B.append(i.get_text()) return B except: return [] def main(): discuss = [] a = 0 for i in range(0,100,20): url = 'https://movie.douban.com/subject/26100958/comments?start='+ str(i) +'&limit=20&sort=new_score&status=P' HTMLpage = getHTML(url) #print(HTMLpage) for t in parseHTML(HTMLpage): discuss.append(t) for i in discuss: print(str(a) + ':' + i) # print(i) a = a + 1 if __name__ == "__main__": main()
運行結果: