使用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爬取Coursera课程资源的详细过程
Nov 04 Python
详解在Python和IPython中使用Docker
Apr 28 Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
May 31 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
python中int与str互转方法
Jul 02 Python
python 爬取疫情数据的源码
Feb 09 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
Jan 18 Python
python基于turtle绘制几何图形
Jun 15 Python
Python编程源码报错解决方法总结经验分享
Oct 05 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+ajaxfileupload+jcrop插件完美实现头像上传剪裁
2014/06/09 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
基于jQuery实现模拟页面加载进度条
2013/04/01 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
checkbox使用示例
2013/08/23 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
javascript实现table表格隔行变色的方法
2015/05/13 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
python 实现插入排序算法
2012/06/05 Python
简述Python中的面向对象编程的概念
2015/04/27 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
UNIX特点都有哪些
2016/04/05 面试题
药物学专业学生的自我评价
2013/10/27 职场文书
大专应届生个人的自我评价
2013/11/21 职场文书
大学自我鉴定范文
2013/12/26 职场文书
学生检讨书
2015/01/27 职场文书
开除员工通知
2015/04/22 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
对Keras自带Loss Function的深入研究
2021/05/25 Python