python爬取豆瓣影评并写入文件

1.获得豆瓣影评接口
在这里插入图片描述

按浏览器F12调试,点开参数,查看url一栏:
所有评论:url:https://movie.douban.com/subject/27119724/comments?status=P
某一页的评论:url: https://movie.douban.com/subject/27119724/comments?start=40&limit=20&sort=new_score&status=P
对比第一条和第二条就可以得出规律,key:start表示从哪一条评论开始,key:limit表示每次展示多少条数据。所以可以用代码实现request请求,获取相应页面的数据。

2.用到了pyquery库来解析返回的html数据 :pip install pyquery

3.在print()评论的时候,出现了乱码,所以加上这一行代码可以解决:
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=‘gb18030’)

4.代码实现:

#coding=utf-8
import requests
import pyquery
import io
import sys
import time
import random
#cmd不能很好地兼容utf8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
# 通过session会话访问评论内容
s = requests.session()
headers= {
        #"Content-Type": "application/x-www-form-urlencoded",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
        #"Referer": "https://accounts.douban.com/passport/login?source=movie"
        }

def data_html():
    #登录请求地址
    url = 'https://accounts.douban.com/j/mobile/login/basic?'
    #body数据
    data={
    'name':'xxx',   #账号
    'password':'xxx',    #密码
    'remember':'false',
    }
    #发送post请求,登录豆瓣
    r=requests.post(url,data=data,json='',headers=headers)
    # 判断是否登录成功
    if '成功' in r.text:
        print('登录成功')
    else:
        print('登录失败')

def data_pinlun(count =0):
    print("开始爬取第%d页" % int(count))
    #全部评论内容
    start = int(count * 20)
    url2 = 'https://movie.douban.com/subject/27119724/comments?start=%d&limit=20&sort=new_score&status=P' %(start)
    r2 = s.get(url2,headers=headers).content
    #解析html
    doc = pyquery.PyQuery(r2)
    #print(doc)
    items = doc('.comment-item').items()
    print(items)
    isover = 1
    #循环读取信息
    for i in items:
        #评论昵称
        name = i('.comment-info a').text()
        if not name:
            isover = 0    #如果name为空则返回0,表示结束查询
            return isover
        #评论内容
        content = i('.short').text()
        with open('12.txt','a+',encoding='utf-8') as fp:
            fp.write('{name}:\n{content}\n\n'.format(name = name,content = content))
    return isover

def data_data():
    data_html()
    count = 0
    while data_pinlun(count):
        count += 1
        time.sleep(random.random()*3)
    print('爬取完毕')
data_data()

5.检查结果在这里插入图片描述

一共是爬到了220条评论。
在这里插入图片描述
没登录的情况下只能爬到220条。

其实这也好解决,在登录的时候,把cookie保存下来,然后在请求数据的时候将cookie添加header中,就可以获取所有页面评论,没有限制。下面是用postman来模拟获取第300-320条数据。
在这里插入图片描述

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值