使用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下函数参数的传递(参数带星号的说明)
Sep 19 Python
python写的一个文本编辑器
Jan 23 Python
Python实现读取字符串按列分配后按行输出示例
Apr 17 Python
Python线程下使用锁的技巧分享
Sep 13 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
python3+selenium实现126邮箱登陆并发送邮件功能
Jan 23 Python
Python3中exp()函数用法分析
Feb 19 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
Apr 26 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 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
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
php类常量用法实例分析
2015/07/09 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP微信API接口类
2016/08/22 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
公共js在页面底部加载的注意事项介绍
2013/07/18 Javascript
clipboard.js无需Flash无需依赖任何JS库实现文本复制与剪切
2015/10/10 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
React组件生命周期详解
2017/07/03 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
python类定义的讲解
2013/11/01 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
Django 生成登陆验证码代码分享
2017/12/12 Python
详解Django的CSRF认证实现
2018/10/09 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
python如何使用Redis构建分布式锁
2020/01/16 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
开放系统互连参考模型
2016/06/29 面试题
十佳中学生事迹材料
2014/06/02 职场文书
药品营销专业毕业生自荐信
2014/07/02 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
Pytest中skip和skipif的具体使用方法
2021/06/30 Python