python 《我不是药神》豆瓣影评爬取

版权声明: 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()   #关闭文件

猜你喜欢

转载自blog.csdn.net/qq_34246164/article/details/81835258