使用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 相关文章推荐
使用pdb模块调试Python程序实例
Jun 02 Python
python函数装饰器用法实例详解
Jun 04 Python
Python tkinter事件高级用法实例
Jan 31 Python
python的pip安装以及使用教程
Sep 18 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 Python
详解python调用cmd命令三种方法
Jul 08 Python
python 的 openpyxl模块 读取 Excel文件的方法
Sep 09 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
解决python中import文件夹下面py文件报错问题
Jun 01 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
python七种方法判断字符串是否包含子串
Aug 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
AM/FM收音机的安装与调试
2021/03/02 无线电
PHP 批量删除数据的方法分析
2009/10/30 PHP
PHP页面间参数传递的四种方法详解
2013/06/09 PHP
php判断数组元素中是否存在某个字符串的方法
2014/06/14 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
JS 判断undefined的实现代码
2009/11/26 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
浅析python打包工具distutils、setuptools
2018/04/20 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
tensorflow之并行读入数据详解
2020/02/05 Python
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
化妆品店促销方案
2014/02/24 职场文书
十佳护士先进事迹
2014/05/08 职场文书
初中体育教学随笔
2015/08/15 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
ant design vue的form表单取值方法
2022/06/01 Vue.js