今天来跟大家分享一下, 基于 Scrapy 的微博爬虫应该怎么写.
大家好, 我是菜鸟哥!
今天来跟大家分享一下, 基于 Scrapy 的微博爬虫应该怎么写.
之前分享过一个 Requests 对微博评论的爬虫, 已经对页面进行了全面的分析, 本文主要注重对数据采集, 存储和文件配置进行分析讲解.
一, Scrapy 简介
首先, 我们需要对 Scrapy 框架有一个简单的了解, 不然在你书写代码的时候会非常的麻烦.
01 安装
使用 pip 对 Scrapy 进行安装, 代码如下:
pip install scrapy
02 创建项目
安装好 Scrapy 框架之后, 我们需要通过终端, 来创建一个 Scrapy 项目, 命令如下:
scrapy startproject weibo
创建好后的项目结构, 如下图:
这里我们来简单介绍一下结构中我们用到的部分的作用, 有助于我们后面书写代码.
spiders 是存放爬虫程序的文件夹, 将写好的爬虫程序放到该文件夹中. items 用来定义数据, 类似于字典的功能. settings 是设置文件, 包含爬虫项目的设置信息. pipelines 用来对 items 中的数据进行进一步处理, 如: 清洗, 存储等.
二, 数据采集
经过上面的简单介绍, 我们现在对 Scrapy 框架有了简单的了解, 下面我们开始写数据采集部分的代码.
01. 定义数据
首先, 我们对数据存储的网页进行观察, 方便我们对获取数据进行定义
通过对网页中数据存储的形式进行观察后, items.py 中对数据的定义方式为:
data = scrapy.Field()
02. 编辑爬虫
接下来我们在 spiders 文件夹里面创建一个 weibo.py 爬虫程序用以书写请求的爬虫代码
代码如下:
- import scrapy
- class WeiboSpider(scrapy.Spider):
- name = 'weibo' #用于启动微博程序
- allowed_domains = ['m.weibo.cn'] #定义爬虫爬取网站的域名
- start_urls = ['https://m.weibo.cn/comments/hotflow?id=4700480024348767&mid=4700480024348767&max_id_type=0'] #定义起始网页的网址
- for i in res['data']['data']:
- weibo_item = WeiboItem()
- weibo_item['data'] = re.sub(r'<[^>]*>', '', i['text'])
- # start_url = ['https://m.weibo.cn/comments/hotflow?id=4700480024348767&mid=4700480024348767&'+str(max_id)+'&max_id_type=0']
- yield weibo_item #将数据回传给 items
03. 遍历爬取
学过 Requests 对微博评论进行爬虫的朋友应该知道, 微博评论的 URL 构造方式, 这里我直接展示构造代码:
- max_id_type = res['data']['max_id_type']
- if int(max_id_type) == 1:
- new_url = 'https://m.weibo.cn/comments/hotflow?id=4700480024348767&mid=4700480024348767&max_id=' + str(
- max_id) + '&max_id_type=1'
- else:
- new_url = 'https://m.weibo.cn/comments/hotflow?id=4700480024348767&mid=4700480024348767&max_id=' + str(
- max_id) + '&max_id_type=0'
三, 数据存储
光爬取下来数据是不行的, 我们还需要对数据进行存储, 这里我采用的是 CSV 文件, 来对评论数据进行存储, 代码如下:
- class CsvItemExporterPipeline(object):
- def __init__(self):
- # 创建接收文件, 初始化 exporter 属性
- self.file = open('text.csv','ab')
- self.exporter = CsvItemExporter(self.file,fields_to_export=['data'])
- self.exporter.start_exporting()
四, 程序配置
光写上面的代码是无法爬取到评论的, 因为我们还没有对整个程序进行有效的配置, 下面我们就在 settings.py 里面进行配置.
01. 不遵循 robots 协议
需要对 robts 协议的遵守进行修改, 如果我们遵循网页的 robots 协议的话, 那无法进行爬取, 代码如下:
- # Obey robots.txt rules
- ROBOTSTXT_OBEY = False
02. 使用自定义 cookie
我们知道, 想要爬取微博评论, 需要带上自己的 cookie 用以信息校验, 因为我们的 cookie 是在 headers 中包裹着的, 所以我们需要将 COOKIES_ENABLED 改为 False, 代码如下:
- # Disable cookies (enabled by default)
- COOKIES_ENABLED = False
03. 打开管道
想要进行数据存储, 还需要在配置中, 打开通道, 用以数据传输, 代码如下:
- # Configure item pipelines
- # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
- ITEM_PIPELINES = {
- 'weibo.pipelines.CsvItemExporterPipeline': 1,
- 'weibo.pipelines.WeiboPipeline': 300,
- }
五, 启动程序
我们在 spiders 同级的的目录下创建一个 wb_main.py 文件, 便于我们在编辑器中启动程序, 代码如下:
- from scrapy import cmdline
- # 导入 cmdline 模块, 可以实现控制终端命令行.
- cmdline.execute(['scrapy','crawl','weibo'])
- # 用 execute()方法, 输入运行 scrapy 的命令.
六, 总结
本文详细的介绍了, 如何用 Scrapy 框架来对微博评论进行爬取, 建议大家动手实操一下, 便于理解. 本文仅供学习参考, 不做它用.
鸿蒙官方战略合作共建 --HarmonyOS 技术社区
来源: http://developer.51cto.com/art/202111/689338.htm