昨天我们已经实现了如何抓取豆瓣上的热门电影信息,虽然不多,只有几百,但是足够我们进行分析了。
今天我们来讲一下如何获取某一部电影的所有短评论信息,并保存到mongodb中。

反爬虫

豆瓣设置的反爬虫机制是比较简单的,我们可以通过selenium模拟浏览器登陆这种终极办法来绕过,但是更加有效率的方法是设置请求头信息的cookie,是豆瓣认为在访问的就是一个用户,而不是机器。
【插入图片,我的cookie】

我们首先要登陆自己的豆瓣账户,随便点击一个评论页面,在请求信息里面,找到cookie,保存下来。

分析评论页

我们先看一下评论页面的url特点,或者说请求网址的构成。
https://movie.douban.com/subject/26378579/comments?start=20&limit=20&sort=new_score&status=P&percent_type=
一看上面的url,我们就能分析出来这又是一个参数传递的url,前面的地址是这部电影的url,我们通过昨天的学习,应该能够得到并且已经保存在数据库中了。
【插入图片,评论url参数】

改变start的值,就可以得到很多个页面了。

值得注意的是,评论并不是通过ajax加载的,而是在html的响应中存在的,我们解析url的响应内容,就可以获取评论。我还是喜欢用最方便的PyQuery来解析源代码。

然后我们分析一下评论的源代码构成:
【插入图片,所有评论的源码】

所有的评论内容都在一个class属性为comment-item的div标签里面,每页有大概20个。进一步来分析:
【插入图片,评论所在的div】

其实所有的评论内容,都能从一个class属性为comment的div标签里面获取,这个div是comment-item的子标签,我们直接获取这个标签就可以。
通过pyquery可以直接得到这些div,我们将其转换成list方便操作,还有一个就是用来判断何时停止迭代页面。

【插入图片,没有评论了】

如上所示,我们需要判断一下,start什么时候就要停止迭代,因为评论不可能是无穷多的。
我们发现在没有评论的页面,是没有comment的div存在的,也就是上面提到的list的长度应该是0.
这里有一个坑,最后我再讲给大家。

解析评论的组成

【插入图片,评论的组成部分】

我们看上面的图片,大致关心的内容包括评论用户、评论时间、评论内容以及对这条评论的投票数量。
一一来讲。

【插入图片,评论用户名】

用户名在一个class属性为comment-info的span标签内容的a标签的text。

【插入图片,评论内容】

评论内容在我们div下面唯一的p标签里面。

【插入图片,评论vote】

vote内容在一个class为votes的span里面。
评论时间在一个class为comment-time的span里面。

全部源码

我在每一条短评中假如了电影的名字,这样可以将多个电影的评论都放入一个mongodb表中。
我们设置了一个布尔值flag,用于判断什么时候结束翻页,并且在每次解析页面的时候返回一个bool值。当返回False的时候,就停止迭代了。

import requests
from urllib.parse import urlencode
import re
from pyquery import PyQuery
import pymongo'''MONGO设置'''
MONGO_URL = 'localhost'
MONGO_DB = 'douban'
MONGO_Table = '热门电影评论'
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]def get_one_page(start_no):data = {'start': start_no,'limit': 20,'sort': 'new_score','status': 'P','percent_type': ''}url = 'https://movie.douban.com/subject/26378579/comments?' + urlencode(data)headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393','Cookie': 'ck=midm; __utmc=30149280; bid=4MkCJCpc9l0;'' __utma=30149280.714093067.1510577422.1512480946.1512561835.4;'' __utmz=30149280.1510577422.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; ''ll=108296; ps=y; dbcl2=170663415:1SxzYXxCPoE; __utmb=30149280.0.10.1512561835; ''push_noty_num=0; push_doumail_num=0; __utmc=223695111;'' _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1512561809%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D;'' _pk_id.100001.4cf6=f414e971fcd4f788.1511518102.3.1512561978.1512480916.;'' _pk_ses.100001.4cf6=*;'' __utma=223695111.1064880032.1511518153.1512480946.1512561835.3;'' __utmz=223695111.1511518153.1.1.utmcsr=douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/;'' __yadk_uid=sC5FTKHfpeiLyKd7wwi41h2JVxoLBNaF; __utmb=223695111.4.10.1512561835; __utmt=1'}try:response = requests.get(url, headers=headers)if response.status_code == 200:# print(response.text)return response.textexcept Exception:print('访问页面' + url + '出错!')return Nonedef parse_one_page(html):doc = PyQuery(html)title = doc.find('#content > h1:nth-child(1)').text()# print(title[:-2])items = list(doc('div.comment').items())length = len(items)# print(length)if length != 0:for item in items:commnet = {'movie': title,'comment user': item.find('span.comment-info').find('a').text(),#PyQuery的特点,可以连续使用find'comment': item.find('p').text(),'vote': item.find('span.votes').text(),'comment time': item.find('span.comment-time').text()}save_to_db(commnet)return Trueelse:print('已没有短评了!')return False#没有使用到
def get_commnets_number():html = get_one_page(0)pattern = re.compile('<span>看过(.*?)</span>')number = re.search(pattern, html).group(1)number = int(number[1:-1])page_number = number // 20print(page_number)def save_to_db(film):try:if db[MONGO_Table].insert(film):print('保存成功', film)except Exception:print('保存出错', film)passdef main():i = 0flag = Truewhile flag:html = get_one_page(i * 20)flag = parse_one_page(html)i += 1if __name__ == '__main__':main()

【插入图片,评论结果】

遇到的一个大坑

上面的代码中有一部分内容,让我烦恼了很久。
如果我们这么写,先获取items,然后使用len(list(items))获取这个items的长度,在if判断之后,for循环根本就不会运行。

经过多次长度,改成现在的版本能够实现我要的功能了。
大家可以试一下。

爬虫实战【12】使用cookie登陆豆瓣电影以及获取单个电影的所有短评相关推荐

  1. Python网络爬虫实战12:爬取豆瓣电影中热门电影数据

    代码实例 # coding:utf8 import json import requests from bs4 import BeautifulSoup import openpyxlwb = ope ...

  2. app小程序手机端Python爬虫实战12实现自动化退出考研帮app并清空缓存

    app小程序手机端Python爬虫实战11实现自动化退出考研帮app并清空缓存 一.捕获安卓吐司的消息 结束安卓的吐司操作: while True:if self.d.toast.get_messag ...

  3. Python Scrapy爬虫实战(1):豆瓣网站图书信息案例- Scrapy初体验

    Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.Scrapy吸引人的 ...

  4. Python爬虫实战 | (12) 爬取万方数据库文献摘要并存入MongoDB

    之前在Python爬虫实战(7)中曾爬取过万方,本篇博客的爬取解析过程和之前几乎完全一样,不同的是数据存储方式,之前是存储到文件中(csv,txt,json,excel等),这次我们将提取的论文信息存 ...

  5. Python爬虫实战+数据分析+数据可视化(豆瓣八佰电影影评)

    一.爬虫部分 爬虫说明: 1.本爬虫是以面向对象的方式进行代码架构的 2.本爬虫爬取的数据存入到MongoDB数据库中 3.爬虫代码中有详细注释 代码展示 import re import time ...

  6. python3爬取视频原理_Python3爬虫实战:以爬取豆瓣电影为例

    爬虫又称为网页蜘蛛,是一种程序或脚本. 但重点在于,它能够按照一定的规则,自动获取网页信息. 爬虫的基本原理--通用框架 1.挑选种子URL: 2.讲这些URL放入带抓取的URL列队: 3.取出带抓取 ...

  7. Python爬虫实战(一):爬取豆瓣电影top250排名

    先上代码 #coding=utf-8 import re import urllib.requestdef getHtml(url):page = urllib.request.urlopen(url ...

  8. python爬取豆瓣电影top250_Python爬虫实战(一):爬取豆瓣电影top250排名

    先上代码 #coding=utf-8 import re import urllib.request def getHtml(url): page = urllib.request.urlopen(u ...

  9. Python爬虫实战003:爬取豆瓣电影分类排行榜

    import requests import jsonif __name__ == '__main__':url = "https://movie.douban.com/j/chart/to ...

最新文章

  1. python调试器的功能,python调试器是什么
  2. RAS RC4 AES 加密 MD5
  3. 优化if-else代码的八种方案!
  4. python3 shutil模块
  5. Javascript對表格的操作[知識積累帖]
  6. localdate存mysql相差一天_如何在保存到mySQL数据库时阻止LocalDate更改
  7. Virtual Box下配置Host-Only联网方式详解
  8. Visual Basic的调试和错误处理
  9. 图片处理应用:固定容器缩略图实现
  10. jemalloc 内存分配器 是什么
  11. 计算机cad运行缓慢怎样处理,AutoCAD运行卡顿怎么办-AutoCAD运行卡顿的解决方法 - 河东软件园...
  12. 招聘网站数据分析岗位数据分析(Excel实现)
  13. Linux du命令详解
  14. Thinkphp开发无需挂机开源版本支付系统原码带云端ZFB和WX免输入金额跳转支付
  15. 无U盘 安装纯净win7系统
  16. 第一个C编译器的诞生图
  17. 中国流量排名前一百名网站
  18. 网站被K多种情况解析 怎么做才能快速恢复?
  19. 邱锡鹏神经网络答案github,邱锡鹏神经网络怎么样
  20. Enterprise Architect使用

热门文章

  1. iptables设置映射通过外网端口代理ssh登录内网服务器
  2. vue项目在ie浏览器中不兼容问题的处理
  3. java当中怎么测试异步接口【杭州多测师_王sir】【杭州多测师】
  4. 微信小程序之根据经纬度反查地址
  5. 使用ffmpeg将图片合成为视频(附完整参数介绍)
  6. U盘用作启动盘后空间变为原来的一半
  7. java基于ssm+vue的的KTV点歌歌曲播放系统 element
  8. IOS9禁用UIWebView的放大镜
  9. 爷青回!最近很火的朋友圈怀旧小电视源码来啦!看到最后一个视频我大呼好家伙!
  10. 利用Termux在手机上运行爬虫下载漫画