爬取准备

所需第三方库:requests,re,time,pymongo,random
爬取网站需联网

思路分析

网址: https://movie.douban.com/subject/26266893/reviews?start=0

网址: https://movie.douban.com/subject/26266893/reviews?start=20

由此分析,每页评论有20个,而网址的改变也只是在最后,网址的前半部分https://movie.douban.com/subject/26266893/reviews?start=都一样,而后面变的参数代表了第多少条评论,所以要爬取所以影评的动态网址的格式为:https://movie.douban.com/subject/26266893/reviews?start=加上20的倍数。

#前半部分固定的内容
url = r'https://movie.douban.com/subject/26266893/reviews?start='
page=0#表示评论页数
k = 0#表示评论条数
while page<1073:#检查网页可知流浪地球共有1073页影评urls = url+str(k)#获得一个完整的网址page = page+1k = k+20#每一页有20条评论

动态网页网址已经分析清楚后就可以直接用requests库抓取网页代码

import requests
while page<1073:urls = url+str(k)#拼接成完整的网址header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'}#根据HTTP协议,设置请求头response = requests.get(urls, headers=header)#获取源代码print(response.text)#打印网页源代码

影评格式:

网页中需要提取的目标字段包括作者,评价星级,发布时间及影评内容,所以我采用的是正则匹配来获取

#将提取目标字段的功能封装成函数
import re
def re_select(string):# 取出作者字段pat_author = r'class="name">(.*?)</a>'re_au = re.compile(pat_author, re.S)auList = re_au.findall(string)#获取目标文档中的所有符合条件的字段# 取出评价等级字段pat_level = r'main-title-rating" title="(.*?)"></span>'re_level = re.compile(pat_level, re.S)levelList = re_level.findall(string)# 取出影评内容pat_story = r'<div class="short-content">(.*?) &nbsp;'re_story = re.compile(pat_story, re.S)storyList = re_story.findall(string)for i in range(len(storyList)):#将获取的字段进行格式调整storyList[i] = storyList[i].strip()#去掉字段中的空白字符storyList[i] = re.sub(r"[a-z\s\"\<\>\/\=\-]", "", storyList[i])#删除多余的字符# 取出评价时间pat_time = r'class="main-meta">(.*?)</span>'re_time = re.compile(pat_time, re.S)timeList = re_time.findall(string)#返回所有的目标字段列表return auList,levelList,storyList,timeList

获取数据后可以选择保存为文件格式,也可以保存到本地数据库中。我选择的是保存到本地mongodb数据库中,也将其封装为函数:

#连接数据库
def linkmongo():# 连接mongodb数据库myclient = pymongo.MongoClient("mongodb://localhost:27017")# 查看数据库名dblist = myclient.list_database_names()# 指定mydb数据库mydb = myclient.mydb# 指定mydb数据库里豆瓣集合collection = mydb.douban# 返回游标return collection
#调用函数,只调用一次,不要加在后面的循环中
collection = linkmongo()

最后就是把所有功能整合就行了,但是还需要提高代码健壮性,本应该加一个异常处理,但是不想搞了,所有直接将出现异常的数据不要,直接请求下一页,总共几万条数据,少几条也没啥事,就这样吧!!!
总代码:

#author  mjz
#data     2019/12/4/16:19
import requests
import re
import time
import pymongo
import randomurl = r'https://movie.douban.com/subject/26266893/reviews?start='
#定义一个内核列表
u_a = [ 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0','Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0']def linkmongo():# 连接mongodb数据库myclient = pymongo.MongoClient("mongodb://localhost:27017")# 查看数据库名dblist = myclient.list_database_names()# 指定mydb数据库mydb = myclient.mydb# 指定mydb数据库里user集合collection = mydb.doubanreturn collection
collection = linkmongo()
def re_select(string):# 取出作者字段pat_author = r'class="name">(.*?)</a>'re_au = re.compile(pat_author, re.S)auList = re_au.findall(string)# 取出评价等级字段pat_level = r'main-title-rating" title="(.*?)"></span>'re_level = re.compile(pat_level, re.S)levelList = re_level.findall(string)# 取出影评内容pat_story = r'<div class="short-content">(.*?) &nbsp;'re_story = re.compile(pat_story, re.S)storyList = re_story.findall(string)for i in range(len(storyList)):storyList[i] = storyList[i].strip()storyList[i] = re.sub(r"[a-z\s\"\<\>\/\=\-]", "", storyList[i])# 取出评价时间pat_time = r'class="main-meta">(.*?)</span>'re_time = re.compile(pat_time, re.S)timeList = re_time.findall(string)return auList,levelList,storyList,timeListpage=0
k = 0
while page<1073:urls = url+str(k)user = random.randint(0, 2)header = {'User-Agent': u_a[user]}response = requests.get(urls, headers=header)page = page + 1#防止短时间内请求次数过多被网站封IP,所有爬一个页面后休息5秒,爬100个后休息一分钟if page % 100 == 0:time.sleep(60)else:time.sleep(5)k = k + 20if response.status_code == 200:print("成功爬取评论第%d页......" % page)auList, levelList, storyList, timeList = re_select(response.text)length = len(len(auList))#如果提取的页面信息有缺失,则不要当前页面的信息,直接跳转到下一页面继续爬取if(len(levelList)!=length or len(levelList)!=length or len(timeList)!=length):continuefor i in range(len(auList)):di = {'作者': auList[i], '评级': levelList[i], '评论': storyList[i], '评论时间': timeList[i]}collection.insert(di)else:print("爬取失败.......")

因为这次用的是单线程,要爬完得很久,没有等到运行结束,但是也运行了两百多个页面,代码还是稳定的,应该没问题的。。。

运行截图:

所有的东西就是这样了,算是敏捷开发吧,只实现了功能,要修改也有许多地方可以修改,就当开源吧,希望有人能帮我完善哈。。。

python爬取豆瓣影评相关推荐

  1. 用 Python 爬取 500 条豆瓣影评,看看《蚁人2》是否有看点?

    作者 | 量化小白H 责编 | 郭芮 "不以大小论英雄."<蚁人2>已热映多天,本文就来看看豆瓣电影上的这部片子评分如何,从代码和数据层面给出最客观的解读. 作为练手, ...

  2. 基于selenium+scrapy爬取复仇者联盟4豆瓣影评数据

    基于selenium+scrapy爬取复仇者联盟4豆瓣影评数据 参考资料: 黑马程序员爬虫教程 静觅爬虫教程 mac下anaconda安装selenium+PhantomJS scrapy下载中间件结 ...

  3. python爬取豆瓣影评理论依据_我用Python爬取了豆瓣的影评

    使用Python爬取豆瓣的影评,比爬取网易云简单,因为不需要设置特定的headers,关于网易云说几句,很难爬取,对请求头有着严格的要求,前几年那会还好些. 爬取结果分为:用户名,评价的星级,评论的内 ...

  4. 用python爬取豆瓣影评及影片信息(评论时间、用户ID、评论内容)

    爬虫入门:python爬取豆瓣影评及影片信息:影片评分.评论时间.用户ID.评论内容 思路分析 元素定位 完整代码 豆瓣网作为比较官方的电影评价网站,有很多对新上映影片的评价,不多说,直接进入正题. ...

  5. Python爬取豆瓣网影评展示

    Python爬取豆瓣网影评展示 需要的库文件 requests beautifulsoup wordcloud jieba matplotlib 本文思想 1.访问指定的网页 #获取指定url的内容 ...

  6. 完全小白篇-用python爬取豆瓣电影影评

    完全小白篇-用python爬取豆瓣影评 打开豆瓣电影 随机电影的所有影评网页 跳转逻辑 分析影评内容获取方法 逐一正则提取影评 针对标签格式过于多样的处理 针对提出请求的频率的限制 存储方式(本次sq ...

  7. Python爬取豆瓣《哪吒之魔童降世》影评

    这几天朋友圈,微博都被<哪吒之魔童降世>这部电影刷屏了,有人说它是"国漫之光",上映4天,票房已经突破9亿了.口碑上,影片自点映开分以来,口碑连续十天稳居所有在映影片榜 ...

  8. Python爬取唐人街探案3豆瓣短评并生成词云

    爬取唐人街探案3短评过程 要爬取的URL: https://movie.douban.com/subject/27619748/comments?start=20&limit=20&s ...

  9. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  10. Python爬取豆瓣Top250电影中2000年后上映的影片信息

    Python爬取豆瓣Top250电影中2000年后上映的影片信息 前言 双十一前加在京东购物车的一个东西,价格330,Plus会员用券后差不多310.双十一当天打开看了下399,还得去抢满300减10 ...

最新文章

  1. linux sar 命令详解
  2. load generator 与ip Spoofer的区别
  3. 博图读取温度的指令_1200读取温度巡检仪 16路
  4. 沭阳县依托运用大数据推进平安建设
  5. 【Python-ML】神经网络-多层感知器
  6. pythonrequests下载大文件_Python3 使用requests模块显示下载大文件显示进度
  7. 一个虐你千百遍的问题:“RPC好,还是RESTful好?”
  8. 一年毕业 5000 多博士,发 18000 多篇 SCI,这所“双非”高校实力不输清北!
  9. stm32 usb 虚拟串口 相同_为什么说你要学习USB?(一)
  10. mysql.5.5.21_centos6下mysql-5.5.21的安装
  11. linux修改su的PAM配置文件,linux pam安全认证模块su命令的安全隐患
  12. zoj1095 Humble Numbers(DP)
  13. IdentityServer(14)- 通过EntityFramework Core持久化配置和操作数据
  14. 稀疏光流python_【原创】OpenCV-Python系列之稀疏光流(五十九)
  15. oracle skipscan,查询条件包含组合索引所有键为啥执行计划走的是index skip scan???...
  16. 7种不同的数据标准化(归一化)方法总结
  17. android在adb下刷机教程,adb sideload刷机教程
  18. 解决在使用rtx2060跑算法时遇到显存不足的问题
  19. php比较asc,php中ASCⅡ码
  20. 刘宇凡:一棵树给我的真理

热门文章

  1. Oulipo[字符串哈希]
  2. 应用基准化分析—Benchmark
  3. Oracle EBS 导入日记账提示警告 GL_INTERFACE 错误代码ECW1,EC11
  4. Windows10连接Google手机,短信照片同步折腾记录
  5. ESO和滑模的一些讨论
  6. 【职场】关于公司各职位的英文缩写!
  7. 安卓手机扫二维码从FTP服务器下载apk
  8. Date转LocalDateTime
  9. python import turtle as t_Python Turtle模块的简单应用
  10. 计算机汉字字模信息怎么算,汉字字模库字模.PPT