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

纵饮孤独 提交于 2019-12-19 03:04:04

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条数据。
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!