python 版本3.6
爬取豆瓣上的《我不是藥神》的評論,代碼直接粘貼在下面了,注意把其中的headers,替換成自己的。具體的方法是打開豆瓣官網,然後 右鍵 審查元素,點擊network,刷新,找到第一個鏈接就能點擊, 然後右側就能出現了,之後下來會看到requests headers,那裏就是,如下圖所示:
之後將那裏面的東西複製出來,粘貼到代碼裏的headers出就可以了。有寫的不明白的地方,歡迎在下面留言,我們一起交流啊
import requests
from bs4 import BeautifulSoup
from urllib import parse
import time
import random
headers = {
"""
換成你自己的headers(字典格式)
"""
}
session = requests.Session()
session.headers.update(headers)
file = open('yaoshen.txt','a',encoding='utf-8')
def url_create():
"""
創建url
"""
start_url = "https://movie.douban.com/subject/26752088/comments?"
for page in range(11):
#這些參數可以在headers下面的query string parameters 裏面
params = {
'start':page*20, #這個是控制當前頁的
'limit':20, #每頁限制的數量
'sort':'new_score',
'status':'P',
}
url = start_url + parse.urlencode(params)
yield url
def html_get(url, num_retries=2):
"""
獲取網頁源代碼,網絡連接有風險,注意用try...except..else...finally 結構
"""
global session
try:
time.sleep(random.random()*5) #設計隨機延時,防止被封ip
html = session.get(url).content #獲取html
except:
if num_retries > 0:
html_get(url, num_retries-1)
else:
print("下載失敗:",url)
else:
return html
def info_get(html):
"""
信息獲取了很多,比如網友暱稱,個人主頁鏈接,頭像,參與投票人數,評論內容,至於日期沒有加 上去,有興趣的話,可以自己加上
"""
info_item = {} #存儲字典
soup = BeautifulSoup(html, 'lxml')
comments = soup.find(id='comments')
for comment in comments.find_all(class_="comment-item"):
print(len(comments))
#print(comment)
ava_a = comment.find(class_="avatar").find('a')
info_item = {
'nickname':ava_a.attrs['title'],
'link': ava_a.attrs['href'],
'img_link': ava_a.find('img').attrs['src'],
}
com = comment.find(class_="comment")
#print(com)
info_item['votes'] = com.find(class_="comment-vote").find(class_="votes").string
info_item['content'] = com.find('p').find('span').string.replace('\n','')
yield info_item #將提取的信息返回
def info_show(item):
"""
因爲我接下來想做文本分析,並將最終的評論結果做成詞雲,找出其中出現次數最多的詞,所以這裏只保存了評論,還是將結果保存到了文本里,想保存全部結果的話,因爲數據不是很多,可以採用csv,需要在開頭加上 import csv, 之後添加csv的保存模塊就可以了
"""
global file
print("短評內容是:",item['content'])
file.write(item['content'] + ' ')
def main():
"""
調度程序
"""
for url in url_create():
html = html_get(url)
#對結果進行判斷
if html == None:
print('html出錯:', html)
else:
item_list = info_get(html)
for item in item_list:
info_show(item)
if __name__ == '__main__':
try:
main()
finally:
file.close() #關閉文件