版权声明: https://blog.csdn.net/qq_34246164/article/details/81835258
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() #关闭文件