10分鐘用Python爬取最近很火的復聯4影評

欲直接下載代碼文件,關注咱們的公衆號哦!查看歷史消息便可!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()

運行結果:

相關文章
相關標籤/搜索