re和requests库爬取豆瓣电影短评

本文介绍了一种使用Python的requests库和re库爬取豆瓣电影《我不是药神》的短评数据的方法,详细展示了如何解析URL规律、设置请求头、使用正则表达式抓取评论内容、评论时间、评星数等信息,并利用pandas库将数据存储为Excel文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 从url分析可以知道,每翻一页评论的话,url只是在start=的位置发生变动。因此分析出规律后,不断循环迭代即可爬取多页评论资源。

 

2  此次爬取的主要内容是,短评内容,有用数,评论者昵称,评论时间,评星数。这五方面的内容。下面直接上代码。

def get_info(page_num):
        # 导入相应的库
        import requests
        import re
        comment_texts = []
        comment_stars = []
        comment_votess = []
        comment_times = []
        user_infos = []
        for i in range(page_num):
            # 待爬取的链接
            url = \
                'https://movie.douban.com/subject/26752088/comments?start='+str(i*20) + \
                '&limit=20&sort=new_score&status=P'
            # 自定义请求头
            headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)\
            Chrome/73.0.3683.86 Safari/537.36 '}
            # 设置cookies
            cookies = {'cookie': '你自己的cookie'} # 此处需要你自己的登录cookie
            res = requests.get(url, headers=headers, cookies=cookies)
            # 判断请求是否正常,若不正常则抛出异常
            if res.status_code != 200:
                res.raise_for_status()
            else:
                print('请求正常,正在爬取第{}页'.format(i+1))
            # 使用re库匹配相应评论内容
            # 评论内容
            comment_text = re.findall(re.compile('<span class=\"short\">(?s)(.+?)</span>'), res.text)
            # 评论时间
            comment_time = re.findall(r'<span class=\"comment-time \" title=\"(\d{4}-\d{2}-\d{2})', res.text)
            # 评论星数
            comment_star = re.findall(re.compile(r'(?:<span class=\"allstar\d{2} rating\" title=\"(\w+.?)\">'
                                                 r'</span>)*(?:\s*?)<span class=\"comment-time \"'), res.text)
            # 评论用户昵称
            user_info = re.findall(re.compile(r'<a title=\"(.+?)\" href'), res.text)
            # 评论有用数
            comment_vote = re.findall(re.compile(r'<span class=\"votes\">(.+?)</span>'), res.text)
            # 扩展一下信息
            comment_times.extend(comment_time)
            comment_texts.extend(comment_text)
            comment_stars.extend(comment_star)
            comment_votess.extend(comment_vote)
            user_infos.extend(user_info)
        # 综合一下信息
        comment_info = dict(评论者昵称=user_infos, 评论时间=comment_times, 评论星数=comment_stars,
                            评论点赞数=comment_votess, 评论内容=comment_texts)
        return comment_info
def savedata(data):
    import pandas as pd
    dataframe = pd.DataFrame(data)
    dataframe.to_excel(r'E:\douban.xlsx')
    print('一共抓取了{}条数据'.format(dataframe.shape[0]))
def main():
    """
    设计要求:
    1 使用requests库+re库爬取豆瓣电影《我不是药神》的短评
    2 数据存储用pandas库存储在本地磁盘
    """
    # 导入相应模块
    from spider_douban import get_info, savedata
    # 设置爬取的页数
    page_num = 50
    # 获取数据
    data = get_info.get_info(page_num)
    # 保存数据
    savedata.savedata(data)
    print('数据已经保存完毕')


if __name__ == '__main__':
    main()

3 爬取结果:

4 经验总结:

1 如果只是简单的设置了请求头user_agent。只能爬取10页的内容。超过10页,出现403.服务器拒绝响应,这是豆瓣的反爬虫措施之一。

2 传入cookie,可以爬取500条数据,即25页数据。(自己手动正常浏览也是25页)可以看出豆瓣为了反爬虫,直接一刀切,不让用户看到过多的数据。

3 在获取评论内容的时候。需要注意,有些评论内容中带有换行符,如果只是简单的(.+?)这种表达式,没有办法匹配到,因此可能会出现有的页面你只能匹配到19或者18条数据。解决办法就是,带上扩展符号,re.s(即申明,. 可以匹配包括换行符在内的所有字符)

4 匹配评星数的时候,有的用户没有评星。因此在源码中就可以看到,用户评论信息中没有这一条。此时编写正则表达式,就不是仅仅依靠span标签那一行的内容。而是将表达式扩展一些(可以包含下面相邻的字段信息)

比如:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值