bs4爬取的时候有两个标签相同_10分钟用Python爬取最近很火的复联4影评
《復仇者聯盟4:終局之戰》已經上映快三個星期了,全球票房破24億美元,國內票房破40億人民幣。
雖然現在熱度逐漸下降,但是我們還是恬不知恥地來蹭一蹭熱度。上映伊始《復聯4》的豆瓣評分曾破了9分。
后來持續走低,現在《復聯4》的評分穩定在8.6分。雖然豆瓣日常被人吐槽注水嚴重,惡意評分很多,但是由于它好爬鴨~,我們還是選擇豆瓣作為爬取對象。豆瓣的長評論有文字和圖片等其它元素,簡單起見,這次只爬短評。
?在瀏覽器中查看豆瓣關于復聯4的短評,先來看看url的結構:
https://movie.douban.com/subject/26100958/comments?start=20&limit=20&sort=new_score&status=P
可見,我們可以通過修改start的值進入不同的頁面:
右鍵查看源代碼可以看到瀏覽器獲取到的html頁面代碼。Ctrl F搜索第一條影評的關鍵詞,快速定位到影評的標簽:
可以看到影評內容在span標簽中,class為“short”。
總覽一下爬取內容的步驟:
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 requestsfrom bs4 import BeautifulSoupdef 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()運行結果:
注:本文作者來自小編一同學。
他的公眾號:木白瞎說。大家可以關注一下。
掃碼入QQ群,獲取更多的運籌優化算法及人工智能算法學習資料
↓↓↓
注:微信群請在公眾號菜單點擊
資源下載->微信粉絲群
獲取最新群邀請鏈接。
總結
以上是生活随笔為你收集整理的bs4爬取的时候有两个标签相同_10分钟用Python爬取最近很火的复联4影评的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作文第一次用计算机350,第一次考试作文
- 下一篇: jekenis父子结构项目打包_全栈之D