前言

本爬虫大致流程为:
(1)分析网页——分析网站结构
(2)发送请求——通过requests发送请求
(3)响应请求——得到请求响应的页面
(4)解析响应——分析页面,得到想要的数据
(5)存储文本——以txt格式存储

使用环境

  • anaconda3
  • python3.6
  • jupyter notebook

用到的库

  • requests
  • lxml
  • urllib
  • re

库的安装很简单,自行百度

中文简体和繁体转换所需Python库,用于将评论中的繁体字转为简体字

下载zh_wiki.py 和 langconv

  • zh_wiki.py: https://github.com/skydark/nstools/blob/master/zhtools/zh_wiki.py
  • langconv.py: https://github.com/skydark/nstools/blob/master/zhtools/langconv.py

下载后,将这两个py文件放在代码同一个目录下,即可

(1)分析网页

豆瓣电影Top250打开如下图:

下面我们点击下一页,观察网址的变化

一开始打开第一页时为 https://movie.douban.com/top250 ,我们点击第2页后再点击第1页,发现如下:

  • 第1页:https://movie.douban.com/top250?start=0&filter=
  • 第2页:https://movie.douban.com/top250?start=25&filter=
  • 第3页:https://movie.douban.com/top250?start=50&filter=

我们发现,只有start变量在变化,而且每次加25,正好是每页电影的个数
要想获得每部电影的评论,我们首先要进入这部电影评论的地方

下面我们就要看每部电影的评论

随便点击一部电影,https://movie.douban.com/subject/1292052/

查看全部评论

同样,一开始第一页的参数不全,我们先点评论第2页,再点第1页,如上图:

我们发现,每页评论的链接如下:
第1页:https://movie.douban.com/subject/1292052/comments?start=0&limit=20&sort=new_score&status=P
第2页:https://movie.douban.com/subject/1292052/comments?start=20&limit=20&sort=new_score&status=P
第3页:https://movie.douban.com/subject/1292052/comments?start=40&limit=20&sort=new_score&status=P
只有start变量在变,每次增加20,正好是每页的评论数目

再点击其他一部,https://movie.douban.com/subject/1291546/

我们发现,https://movie.douban.com/subject/1291546/comments?start=0&limit=20&sort=new_score&status=P
每部电影之间除了中间的数字1291546不一样,这个应该是电影的编号,在每个编号下,评论链接的变化规律是一样的
要是我们知道每一部电影的编号,那岂不是所有的问题都解决了?
很庆幸,这个编号是很容易获取的。

在top250页面下打开开发者工具(F12)

图中红框内,便是评论链接的前部分,那我们就可通过top页面,获取每一个中每部电影的评论链接
通过一系列链接的拼接就可以获得每部电影的评论地址,然后再通过评论链接获取评论页面,再获取评论文本,这样就可以了

流程如下:

(2)发送请求,响应请求,解析网页

需要导入的库:

import requests  # 请求库
from urllib.parse import urlencode  # 解析链接
from lxml import etree  # 解析页面import langconv
import re   # 正则表达式,用去匹配去除评论中的符合
  • 获取Top250页面
# 获取电影排行页面
def get_top_page(start):params = {'start': start,'filter': '',}url = 'https://movie.douban.com/top250?' + urlencode(params)print(url)try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:print('get_top_page() Error')return None# 测试
top_page = get_top_page(0)  # 获取第1页的页面html
print(top_page)
  • 获取每页电影链接
# 获取每页每部电影的评论链接前部分
def get_comment_link(top_page):html = etree.HTML(top_page)result = html.xpath('//div[@class="hd"]//a/@href')  # 分析上面得到的页面获得return result# 测试
comment_link = get_comment_link(top_page)
print(comment_link)

这样我们就获得了第1页里面每部电影的评论链接的前部分

  • 获取评论页面
# 根据评论链接,获取评论页面
def get_comment_page(comment_link,start):params = {'start': start,'limit': '20','sort':'new_score','status':'P'}url = comment_link +'comments?'+ urlencode(params)try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn 'Error'except RequestException:print('get_comment_page() Error')return None
  • 根据评论页面获取评论
# 根据评论页面获取评论
def get_comment(comment_page):html = etree.HTML(comment_page)result = html.xpath('//div[@class="mod-bd"]//div/div[@class="comment"]/p/span/text()') # 类似前面的方法,找节点return result

(3)存储数据

  • 繁体字转为简体字
import langconv
def Traditional2Simplified(sentence):  # 将sentence中的繁体字转为简体字sentence = langconv.Converter('zh-hans').convert(sentence)return sentence
  • 评论数据清理
import re
# 清理一下评论数据
def clear(string):string = string.strip()  # 去掉空格等空白符号string = re.sub("[A-Za-z0-9]", "", string)  # 去掉英文字母 数字string = re.sub(r"[!!?。。,&;"★#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃「」『』【】"r"〔〕〖〗〘〙#〚〛〜〝〞/?=~〟,〰–—‘’‛“”„‟…‧﹏.]", " ", string)  # 去掉中文符号string = re.sub(r"[!\'\"#。$%&()*+,-.←→/:~;<=>?@[\\]^_`_{|}~", " ", string)  # 去掉英文符号return Traditional2Simplified(string).lower()  # 所有的英文都换成小写
  • 存为txt文件
# 存储评论
def save_to_txt(results):for result in results:result = clear(result)# print(result)with open('comment1.txt','a',encoding='utf-8') as file:file.write(result)file.write('\n'+'='*50+'\n')

完整代码

import requests  # 请求库
from urllib.parse import urlencode  # 解析链接
from lxml import etree  # 解析页面import langconv
import re   # 正则表达式,用去匹配去除评论中的符合# 获取电影排行页面
def get_top_page(start):params = {'start': start,'filter': '',}url = 'https://movie.douban.com/top250?' + urlencode(params)print(url)try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:print('get_top_page() Error')return None# 获取每页每部电影的评论链接
def get_comment_link(top_page):html = etree.HTML(top_page)result = html.xpath('//div[@class="hd"]//a/@href') # 通过..获取父节点return result# 根据评论链接,获取评论页面
def get_comment_page(comment_link,start):params = {'start': start,'limit': '20','sort':'new_score','status':'P'}url = comment_link +'comments?'+ urlencode(params)try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'}response = requests.get(url,headers=headers)if response.status_code == 200:return response.textreturn 'Error'except RequestException:print('get_comment_page() Error')return None# 根据评论页面获取评论
def get_comment(comment_page):html = etree.HTML(comment_page)result = html.xpath('//div[@class="mod-bd"]//div/div[@class="comment"]/p/span/text()') # 通过..获取父节点return result# 将sentence中的繁体字转为简体字
def Traditional2Simplified(sentence): sentence = langconv.Converter('zh-hans').convert(sentence)return sentence# 清理一下评论数据
def clear(string):string = string.strip()  # 去掉空格等空白符号string = re.sub("[A-Za-z0-9]", "", string)  # 去掉英文字母 数字string = re.sub(r"[!!?。。,&;"★#$%&'()*+-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃「」『』【】"r"〔〕〖〗〘〙#〚〛〜〝〞/?=~〟,〰–—‘’‛“”„‟…‧﹏.]", " ", string)  # 去掉中文符号string = re.sub(r"[!\'\"#。$%&()*+,-.←→/:~;<=>?@[\\]^_`_{|}~", " ", string)  # 去掉英文符号return Traditional2Simplified(string).lower()  # 所有的英文都换成小写# 存储评论
def save_to_txt(results):for result in results:result = clear(result)# print(result)with open('comment.txt','a',encoding='utf-8') as file:file.write(result)file.write('\n'+'='*50+'\n')# 运行
print("爬取开始...")
for start in range(0,250,25):  # 可以爬取第一页,减少爬虫时间print("正在爬取第"+str(int(start/25+1))+"页!!!")#print(start)top_page = get_top_page(start)comment_link = get_comment_link(top_page)#print(comment_link)for i in range(25):print("正在爬取第"+str(i)+"个电影!!!")#print(comment_link[i])for j in range(0,100,20):comment_page = get_comment_page(comment_link[i],j)results = get_comment(comment_page)save_to_txt(results)print("爬取第"+str(i)+"个电影结束")

爬取结果

我没爬完,可以通过修改参数,只爬取第一页每部电影的前100条评论

总结

\quad\quad在做这个爬虫前,我看了一些相关的书,了解大致流程,和一些库的使用,很明显代码不是最简化的,但是对于一个初学者来说挺有成就感,希望再接再厉,继续加油!!!

  • 在爬取的过程中,可能出现IP被封锁,网站可能设定了IP访问次数限制——解决方法:可以使用代理
  • 只爬取了评论,可以将电影名称和评论对应起来,另外,还可以将好评/坏评分别标记每条评论,以便以后对文本数据进行一些情感分析啥的,这样就不用自己条件标签了
  • 还可以以其他方式存储数据,如数据库

【网络爬虫】爬取豆瓣电影Top250评论相关推荐

  1. 利用定向网络爬虫爬取豆瓣电影top250【Python】

    最近在外地实习,闲来无事学了一下requests库和BeautifulSoup,掌握基本用法之后试着爬取了一下豆瓣电影top250,中间也参考了不少其他大佬的博客,所以最后写出来的代码也都大同小异吧, ...

  2. Python爬虫 爬取豆瓣电影TOP250

    Python爬虫 爬取豆瓣电影TOP250 最近在b站上学习了一下python的爬虫,实践爬取豆瓣的电影top250,现在对这两天的学习进行一下总结 主要分为三步: 爬取豆瓣top250的网页,并通过 ...

  3. python爬取豆瓣电影top250的代码_Python爬虫——爬取豆瓣电影Top250代码实例

    利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...

  4. python爬取豆瓣电影top250_Python爬虫——爬取豆瓣电影Top250代码实例

    利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...

  5. Python爬虫爬取豆瓣电影Top250

    爬虫爬取豆瓣Top250 文章目录 爬虫爬取豆瓣Top250 完整代码 第一步获取整个网页并以html来解析 正则表达式来匹配关键词 所有信息写入列表中 存入Excel中 效果如图 本文学习自B站UP ...

  6. append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250

    养成习惯,先赞后看!!! 前言 之前一直对爬虫有兴趣,但是一直没有真正静下心来去好好学习过,这一段时间跟着b站上的一个教程做了自己人生中第一个爬虫程序,还是很有成就感的. 准备工作 1. 我们爬取一个 ...

  7. 爬虫爬取豆瓣电影top250

    最新研究了下爬虫,且将信息保存到EXCEL和sqlite: 代码供参考: 代码如下: # This is a sample Python script.# Press Shift+F10 to exe ...

  8. 真特么激动第一个爬虫----爬取豆瓣电影top250

    养成习惯,先赞后看!!! 目录 前言 准备工作 爬虫 分析网页信息 利用正则表达式抓取有有用信息 简单的清洗数据 存储数据 网页模板制作 表格化展示爬虫得到的数据 echarts数据可视化 wordc ...

  9. python豆瓣电影top250爬虫课程设计_[教程]图文:爬虫爬取豆瓣电影top250

    window环境下 使用python脚本爬取豆瓣 环境安装 python python开发环境 jupyter python web IDE requests python requests模块用于向 ...

最新文章

  1. 基础知识--:before伪元素和:after伪元素
  2. Android自己定义DataTimePicker(日期选择器)
  3. 如何用FineReport制作一张报表(一)
  4. Android Studio创建AVD
  5. Ubuntu18.04报错:system/tools/aidl/aidl_language_y.yy: error: define variable ‘api.pure‘ is not used
  6. 拓端tecdat|R语言 RevoScaleR的大规模数据集决策树模型应用案例
  7. 手动配置 hibernate 项目
  8. 银行计算机知识,银行考试计算机知识试题及答案
  9. java 并口和串口_串行接口和并行接口
  10. @submit.prevent作用
  11. (每日一练c++)有效的数独
  12. 高等数学学习笔记——第七十六讲——直角坐标系下二重积分的计算
  13. 工作感受月记 201907月
  14. Python语言程序设计 第一周习题
  15. 香港5G自动驾驶车开测,明年大规模推出5G服务
  16. 计算机主机启动不了系统安装系统安装软件,最全面电脑主机启动不了怎么办呢?...
  17. 疯狂Java讲义(十三)----第三部分
  18. selenium爬取淘宝店铺数据
  19. Xml外部实体注入漏洞(XXE)与防护
  20. 温度传感芯片助力智慧农业领域的应用

热门文章

  1. 2012年全国高校学科评估结果:计算机科学与技术(转载)
  2. 计算机基础与应用2010版教案,职业院校计算机专业-计算机应用基础(Windows 7+office 2010)电子教案(完整版)...
  3. vue 使用echarts地图实现全国地图
  4. Android使用Tesseract-ocr进行文字识别
  5. 获取地图区域边界经纬度(地图json数据)
  6. 公司为什么一定要网站定制开发,选模板不好吗?
  7. tc 命令指定目的某个进行延迟
  8. 基于海康SDK开发文档分析+云台控制实现+经典案例
  9. 微信红包促销系统开发
  10. 如何把照片变成手绘动漫化?