使用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 解析XML文件
Apr 15 Python
浅谈Python中copy()方法的使用
May 21 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
详解TensorFlow在windows上安装与简单示例
Mar 05 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
使用pytorch和torchtext进行文本分类的实例
Jan 08 Python
python清空命令行方式
Jan 13 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 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使用curl获取https请求的方法
2015/02/11 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
js日期时间补零的小例子
2013/03/05 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
2017/07/10 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
[54:56]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第三局
2016/03/06 DOTA
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
一个超级简单的python web程序
2014/09/11 Python
python实现俄罗斯方块
2018/06/26 Python
pymongo中聚合查询的使用方法
2019/03/22 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
使用Python爬取弹出窗口信息的实例
2020/03/14 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
详解python爬取弹幕与数据分析
2020/11/14 Python
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
介绍一下gcc特性
2012/01/20 面试题
九月份红领巾广播稿
2014/01/22 职场文书
税务会计岗位职责
2014/02/18 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
股份转让协议书范本
2015/01/27 职场文书
年度考核表个人总结
2015/03/06 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
javascript数组includes、reduce的基本使用
2021/07/02 Javascript
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python