使用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 相关文章推荐
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
Python单元测试实例详解
May 25 Python
对Python w和w+权限的区别详解
Jan 23 Python
Python魔法方法功能与用法简介
Apr 04 Python
wxpython绘制圆角窗体
Nov 18 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
python高级特性简介
Aug 13 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
python删除文件、清空目录的实现方法
Sep 23 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
PHP Pear 安装及使用
2009/03/19 PHP
PHP 危险函数全解析
2009/09/09 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
php mysql 封装类实例代码
2016/09/18 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
JavaScript 学习笔记(四)
2009/12/31 Javascript
js输出列表实现代码
2010/09/12 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
jquery ajax异步提交表单数据的方法
2017/10/27 jQuery
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
浅析Python中yield关键词的作用与用法
2016/11/29 Python
在Python的一段程序中如何使用多次事件循环详解
2017/09/07 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
Python线程指南分享
2019/11/19 Python
python plotly画柱状图代码实例
2019/12/13 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
幼儿教师研修感言
2014/02/12 职场文书
企业承诺书格式
2014/05/21 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android