使用Python抓取豆瓣影评数据的方法


Posted in Python onOctober 17, 2018

抓取豆瓣影评评分

正常的抓取

分析请求的url

https://movie.douban.com/subject/26322642/comments?start=20&limit=20&sort=new_score&status=P&percent_type=

里面有用的也就是startlimit参数,我尝试过修改limit参数,但是没有效果,可以认为是默认的
start参数是用来设置从第几条数据开始查询的

  • 设计查询列表,发现页面中有url中的查询部分,且指向下一个页面

使用Python抓取豆瓣影评数据的方法

于是采用下面的代码进行判断是否还有下一个页面

if next_url:
    visit_URL('https://movie.douban.com/subject/24753477/comments'+next_url)
  • 用requests发送请求,beautifulsoup进行网页解析

使用Python抓取豆瓣影评数据的方法

把数据写入txt

import requests
from bs4 import BeautifulSoup
first_url = 'https://movie.douban.com/subject/26322642/comments?status=P'
# 请求头部
headers = {
  'Host':'movie.douban.com',
  'Referer':'https://movie.douban.com/subject/24753477/?tag=%E7%83%AD%E9%97%A8&from=gaia_video',
  'Upgrade-Insecure-Requests':'1',
  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
}
def visit_URL(url):
  res = requests.get(url=url,headers=headers)
  soup = BeautifulSoup(res.content,'html5lib')
  div_comment = soup.find_all('div',class_='comment-item') # 找到所有的评论模块
  for com in div_comment:
    username = com.find('div',class_='avatar').a['title']
    comment_time = com.find('span',class_='comment-time')['title']
    votes = com.find('span',class_='votes').get_text()
    comment = com.p.get_text()
    with open('1.txt','a',encoding='utf8') as file:
      file.write('评论人:'+username+'\n')
      file.write('评论时间:'+comment_time+'\n')
      file.write('支持人数:'+votes+'\n')
      file.write('评论内容:'+comment+'\n')
  # 检查是否有下一页
  next_url = soup.find('a',class_='next')
  if next_url:
    temp = next_url['href'].strip().split('&') # 获取下一个url
    next_url = ''.join(temp)
    print(next_url)
  # print(next_url)
  if next_url:
    visit_URL('https://movie.douban.com/subject/24753477/comments'+next_url)
if __name__ == '__main__':
  visit_URL(first_url)

模仿移动端

很多时候模仿移动端获得的页面会比PC端的简单,更加容易解析,这次模拟移动端,发现可以直接访问api获取json格式的数据,nice!

使用Python抓取豆瓣影评数据的方法

至于怎么模拟移动端只需要将user-agent修改为移动端的头

useragents = [
  "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/47.0.2526.70 Mobile/13C71 Safari/601.1.46",
  "Mozilla/5.0 (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
  "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)"

怎么获取这些头部?用火狐的插件user-agent switcher

之后的操作就是解析json

import random
import requests
import json
import time
first_url = 'https://m.douban.com/rexxar/api/v2/tv/26322642/interests?count=20&order_by=hot&start=0&ck=dNhr&for_mobile=1'
url = 'https://m.douban.com/rexxar/api/v2/tv/26322642/interests'
# 移动端头部信息
useragents = [
  "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/47.0.2526.70 Mobile/13C71 Safari/601.1.46",
  "Mozilla/5.0 (Linux; U; Android 4.4.4; Nexus 5 Build/KTU84P) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
  "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)"
]
def visit_URL(i):
  print(">>>>>",i)
  # 请求头部
  headers = {
    'Host':'m.douban.com',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':random.choice(useragents)
  }
  params = {
    'count':'50',
    'order_by':'hot',
    'start':str(i),
    'for_mobile':'1',
    'ck':'dNhr'
  }
  res = requests.get(url=url,headers=headers,params=params)
  res_json = res.json()
  interests = res_json['interests']
  print(len(interests))
  for item in interests:
    with open('huge.txt','a',encoding='utf-8') as file:
      if item['user']:
        if item['user']['name']:
          file.write('评论用户:'+item['user']['name']+'\n')
      else:
        file.write('评论用户:none\n')
      if item['create_time']:
        file.write('评论时间:'+item['create_time']+'\n')
      else:
        file.write('评论时间:none\n')
      if item['comment']:
        file.write('评论内容:'+item['comment']+'\n')
      else:
        file.write('评论内容:none\n')
      if item['rating']:
        if item['rating']['value']:
          file.write('对电影的评分:'+str(item['rating']['value'])+'\n\n')
      else:
        file.write('对电影的评分:none\n')
if __name__ == '__main__':
  for i in range(0,66891,20):
    # time.sleep(2)
    visit_URL(i)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
pycharm 使用心得(二)设置字体大小
Jun 05 Python
go语言计算两个时间的时间差方法
Mar 13 Python
python opencv3实现人脸识别(windows)
May 25 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
python实现flappy bird游戏
Dec 24 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
python获取txt文件词向量过程详解
Jul 05 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
python pyenv多版本管理工具的使用
Dec 23 Python
Python sep参数使用方法详解
Feb 12 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
python3中TQDM库安装及使用详解
Nov 18 Python
python 对key为时间的dict排序方法
Oct 17 #Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 #Python
通过python将大量文件按修改时间分类的方法
Oct 17 #Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 #Python
python按时间排序目录下的文件实现方法
Oct 17 #Python
python3 读取Excel表格中的数据
Oct 16 #Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 #Python
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
php 小乘法表实现代码
2009/07/16 PHP
php HandlerSocket的使用
2011/05/02 PHP
php连接sftp的作用以及实例代码
2019/09/23 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
详解Python中的__init__和__new__
2014/03/12 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
python将视频转换为全字符视频
2019/04/26 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
Python dict的常用方法示例代码
2020/06/23 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
优质服务活动实施方案
2014/05/02 职场文书
高中同学会活动方案
2014/08/14 职场文书
个人四风对照检查材料
2014/09/26 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
个人求职自荐信范文
2015/03/06 职场文书
离婚纠纷代理词
2015/05/23 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
创业计划书之网吧
2019/10/10 职场文书