京公网安备 11010802034615号
经营许可证编号:京B2-20210330
来源:Python爬虫与数据挖掘
作者:霖hero
大家好!我是霖hero。上个月的时候,我写了一篇关于IP代理的文章,手把手教你使用XPath爬取免费代理IP,今天在这里分享我的第二篇文章,希望大家可以喜欢。
有一天,我在逛街,突然被一声靓仔打断了我的脚步,回头一看,原来是水果摊阿姨叫我买水果,说我那么靓仔,便宜一点买给我,自恋的我无法拒绝阿姨的一声声靓仔,于是买了很多水果回家,家人问我水果多少钱,结果如何,没错,水果买贵了!今天我们使用scrapy框架来爬取北京新发地价格行情,了解商品价格,家人再也不怕我买贵东西啦。
在爬取之前,我们先来学习一下什么Scrapy框架。
Scrapy是一个基于Twisted的异步处理框架,是纯Python实现的爬虫框架,是提取结构性数据而编写的应用框架,其架构清晰,模块之间的耦合程度低,可扩展性极强,我们只需要少量的代码就能够快速抓取数据。
首先我们看看经典的Scrapy框架架构图,如下图所示:
学Scrapy框架的绝大部分都看过这个图,图中分了很多部分,接下来,我们通过下面的表来简单地了解各个部分的作用。
|
名称 |
作用 |
是否要手写代码 |
|
Engine |
引擎,负责数据和信号的在不同模块间的传递。 |
否 |
|
Scheduler |
调度器,存放引擎发过来的requests请求,在引擎再次请求的时候将请求提供给引擎。 |
否 |
|
Downloader |
下载器,下载网页响应的内容并将内容返回给引擎。 |
否 |
|
Spiders |
爬虫,处理引擎传过来的网页内容并提取数据、url,并返回给引擎。 |
是 |
|
Item Pipeline |
管道,处理引擎传过来的数据,主要任务是清洗、验证和存储数据。 |
是 |
|
Downloader Middlewares |
下载器中间件,位于引擎和下载器之间的桥梁框架,主要是处理引擎与下载器之间的请求及响应,可以自定义下载扩展,如设置代理。 |
一般不用手写 |
|
Spider MiddlewaresSpider |
中间件,位于引擎和爬虫之间的桥梁框架,主要处理向爬虫输入的响应和输出的结果及新的请求。 |
一般不用手写 |
在表中,我们可以发现,每部分都要经过引擎,上图中Scrapy Engine部分也是放在正中心,由此可知,Engine引擎是整个框架的核心。
注意:这些模块部分只有Spiders和Item Pipeline需要我们自己手写代码,其他的大部分都不需要。
大致了解了Scrapy框架的各个部分后,接下来我们开始创建一个Scrapy项目,可以使用如下命令:
scrapy startproject <Scrapy项目名>
创建一个scrapy项目名为test1的项目,如下图所示:
这样我们就创建好Scrapy项目了,如下图所示:
其中:
要创建Spider爬虫,首先我们要进入刚才创建的Scrapy目录中,再在命令行运行以下命令:
scrapy genspider <爬虫名字> <允许爬取的域名>
以
http://quotes.toscrape.com
网站为例子,该网站是一个著名作家名言的网站,创建Spider爬虫如下图所示:
创建spider爬虫后,spiders文件夹中多了一个firstspider.py,这个py文件就是我们创建爬虫,文件内容如下所示:
import scrapy class FirstspiderSpider(scrapy.Spider): name = 'firstSpider' allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): pass
其中:
大致了解了firstspider.py文件内容后,我们接下来尝试在parse()方法中提取响应的数据,具体代码如下所示:
xpath_parse = response.xpath('/html/body/div[1]/div[2]/div[1]/div') for xpath in xpath_parse:
item={}
item['text'] = xpath.xpath('./span[1]/text()').extract_first().replace('“','').replace('”','') item['author']=xpath.xpath('./span[2]/small/text()').extract_first() print(item)
这样我们就成功提取到引擎响应的内容数据了,接着输入以下命令来运行spider爬虫:
scrapy crawl firstSpider
运行结果如下:
运行后发现我们结果里面多了很多log日志,这时可以通过在settings.py添加以下代码,就可以屏蔽这些log日志:
LOG_LEVEL="WARNING"
这样就可以直接输入我们想要的内容,如下图所示:
有人可能问:那User-Agent在哪里设置?
我们可以在settings.py中设置User-Agent,代码如下所示:
为了避免拼写错误或者定义字段错误,我们可以在items.py文件中定义好字段,在上面提取数据中,我们获取了text、author内容,所以我们可以在items.py定义text和author字段,具体代码如下所示:
import scrapy class Test1Item(scrapy.Item): text= scrapy.Field() author = scrapy.Field()
在items.py文件中,我们只需要使用scrapy.Field()来进行定义即可,scrapy.Field()是一个字典,总的来说我们可以把该类理解为一个字典。
接着在firstspider.py文件中导入我们的items.py,以及修改item={},如下所示:
from test1.items import Test1Item
item=Test1Item()
有人可能会说为什么要多此一举定义一个字典呢?
当我们在获取到数据的时候,使用不同的item来存放不同的数据,在把数据交给pipeline的时候,可以通过isinstance(item,Test1Item)来判断数据属于哪个item,进行不同的数据(item)处理。
例如我们获取到京东、淘宝、拼多多的数据时,我们可以items.py文件中定义好对应的字段,具体代码如下:
import scrapy class jingdongItem(scrapy.Item): text= scrapy.Field() author = scrapy.Field() class taobaoItem(scrapy.Item): text= scrapy.Field() author = scrapy.Field() class pddItem(scrapy.Item): text= scrapy.Field() author = scrapy.Field()
定义好字段后,这是我们通过在pipeline.py文件中编写代码,对不同的item数据进行区分,具体代码如下:
from test1.items import jingdongItem class Test1Pipeline: def process_item(self, item, spider): if isinstance(item,jingdongItem):
print(item)
首先我们通过导入我们的items.py,通过isinstance()函数来就可以成功获取到对应的item数据了。
Item Pipeline为项目管道,当Item生成后,它就会自动被送到Item Pipeline进行处理,我们常用Item Pipeline来做以下操作:
pipelines.py内容如下所示:
from itemadapter import ItemAdapter class Test1Pipeline: def process_item(self, item, spider): return item
在process_item()方法中,传入了两个参数,一个参数是item,每次Spider生成的Item都会作为参数传递过来。另一个参数是spider,就是Spider的示例。
完成pipeline代码后,需要在setting.py中设置开启,开启方式很简单,只要把setting.py内容中的以下代码的注释取消即可:
ITEM_PIPELINES = { 'test1.pipelines.Test1Pipeline': 300, }
其中:
注意:
当我们有多个spider爬虫时,为了满足不同的spider爬虫需求,这时可以定义不同的pipeline处理不同的item内容;
当一个spider的内容可能要做不同的操作时,例如存入不同的数据库中,这时可以定义不同的pipeline处理不同的item操作。
例如当我们有多个spider爬虫时,可以通过pipeline.py编写代码定义多个pipeline,具体代码如下:
class jingdongPipeline1: def process_item(self, item, spider): if spider.name=="jingdong":
print(item) return item class taobaoPipeline: def process_item(self, item, spider): if spider.name=="taobao":
print(item) return item
这样我们就可以处理到对应的spider爬虫传递过来的数据了。
定义好pipeline后,我们要在settings.py中设置pipeline权重,也就是那个pipeline先运行,具体代码如下:
ITEM_PIPELINES = { 'test1.pipelines.jingdongPipeline': 300, 'test1.pipelines.taobaoPipeline': 301, }
在上面我们已经提取到想要的数据,接下来将数据传到pipeline中,传输很简单,我们只需要使用yield,代码如下:
yield item
没错,只要在spider爬虫中写入这一行代码即可,那么为什么要使用yield呢?,我用return不能行吗?
行,但yield是让整个函数变成一个生成器,每次遍历的时候挨个读到内存中,这样不会导致内存的占用量瞬间变高。
我们成功获取到了一页数据了,那么问题来了,如何实现翻页呢,方法有很多种,我们主要介绍两种。
我们通过在spider爬虫中,也就是我们创建的firstspider.py中添加以下代码,具体代码如下:
def start_requests(self): for i in range(1,3):
url=f'https://quotes.toscrape.com/page/{i}/' yield scrapy.Request(url=url,callback=self.parse)
我们可以通过parse()方法中实现翻页,具体代码如下:
for i in range(2,3):
url = f'https://quotes.toscrape.com/page/{i}/' yield scrapy.Request(url=url,callback=self.parse)
大家可以发现,上面两种翻页方式都差不多,只是一个在start_requests()方法实现,一个在parse()方法实现。
但都要使用scrapy.Request()方法,该方法能构建一个requests,同时指定提取数据的callback函数
scrapy.Requeset(url,callback,method='GET',headers,cookies,meta,dont_filter=False)
其中:
我们已经获取到数据而且实现了翻页,接下来是保存数据。
保存在文件中
当我们要把数据保存成文件的时候,不需要任何额外的代码,只要执行如下代码即可:
scrapy crawl spider爬虫名 -o xxx.json #保存为JSON文件 scrapy crawl spider爬虫名 -o xxx.jl或jsonlines #每个Item输出一行json scrapy crawl spider爬虫名 -o xxx.csv #保存为csv文件 scrapy crawl spider爬虫名 -o xxx.xml #保存为xml文件
想要保存为什么格式的文件,只要修改后缀就可以了,在这里我就不一一例举了。
保存MongoDB中
当我们要把数据保存在MongoDB数据库的时候,就要使用Item Pipeline模块了,也就是说要在pipeline.py中编写代码,具体代码如下所示:
from pymongo import MongoClient
client=MongoClient()
collection=client["test1"]["firstspider"]
class Test1Pipeline: def process_item(self, item, spider): collection.insert(item) return item
首先我们导入MongoClient模块并实例化MongoClient,创建一个集合,然后在process_item()方法中使用insert()方法把数据插入MongoDB数据库中。
好了,Scrapy知识就讲到这里,下一篇文章小编将带大家爬取北京新发地价格行情,顺便巩固我们今天学的知识。
大家好,我是霖hero。这篇文章主要给大家分享了Scrapy框架的条条框框,Scrapy是一个基于Twisted的异步处理框架,是纯Python实现的爬虫框架,是提取结构性数据而编写的应用框架,其架构清晰,模块之间的耦合程度低,可扩展性极强。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
主讲人简介 张冲,海归统计学硕士,CDA 认证数据分析师,前云南白药集团资深数据分析师,自媒体 Python 讲师,全网课程播放量破 ...
2026-04-10在数据可视化与业务分析中,同比分析是衡量业务发展趋势、识别周期波动的核心手段,其核心逻辑是将当前周期数据与上年同期数据进 ...
2026-04-10在机器学习模型的落地应用中,预测精度并非衡量模型可靠性的唯一标准,不确定性分析同样不可或缺。尤其是在医疗诊断、自动驾驶、 ...
2026-04-10数据本身是沉默的,唯有通过有效的呈现方式,才能让其背后的规律、趋势与价值被看见、被理解、被运用。统计制图(数据可视化)作 ...
2026-04-10在全球化深度发展的今天,跨文化传播已成为连接不同文明、促进多元共生的核心纽带,其研究核心围绕“信息传递、文化解读、意义建 ...
2026-04-09在数据可视化领域,折线图是展示时序数据、趋势变化的核心图表类型之一,其简洁的线条的能够清晰呈现数据的起伏规律。Python ECh ...
2026-04-09在数据驱动的时代,数据分析早已不是“凭经验、靠感觉”的零散操作,而是一套具备固定逻辑、标准化流程的系统方法——这就是数据 ...
2026-04-09长短期记忆网络(LSTM)作为循环神经网络(RNN)的重要改进模型,凭借其独特的门控机制(遗忘门、输入门、输出门),有效解决了 ...
2026-04-08在数据分析全流程中,数据质量是决定分析结论可靠性的核心前提,而异常值作为数据集中的“异类”,往往会干扰统计检验、模型训练 ...
2026-04-08在数字经济飞速发展的今天,数据已渗透到各行各业的核心场景,成为解读趋势、优化决策、创造价值的核心载体。而数据分析,作为挖 ...
2026-04-08在数据分析全流程中,数据处理是基础,图形可视化是核心呈现手段——前者负责将杂乱无章的原始数据转化为干净、规范、可分析的格 ...
2026-04-07在数据分析与统计推断中,p值是衡量假设检验结果显著性的核心指标,其本质是在原假设(通常为“无效应”“无差异”)成立的前提 ...
2026-04-07在数字经济深度渗透的今天,数据已成为企业生存发展的核心资产,企业的竞争本质已转变为数据利用能力的竞争。然而,大量来自生产 ...
2026-04-07Python凭借简洁的语法、丰富的生态库,成为算法开发、数据处理、机器学习等领域的首选语言。但受限于动态类型、解释性执行的特性 ...
2026-04-03在深度学习神经网络中,卷积操作是实现数据特征提取的核心引擎,更是让模型“看懂”数据、“解读”数据的关键所在。不同于传统机 ...
2026-04-03当数字化转型从企业的“战略口号”落地为“生存之战”,越来越多的企业意识到,转型的核心并非技术的堆砌,而是数据价值的深度挖 ...
2026-04-03在日常办公数据分析中,数据透视表凭借高效的汇总、分组功能,成为Excel、WPS等办公软件中最常用的数据分析工具之一。其中,“计 ...
2026-04-02在数字化交互的全场景中,用户的每一次操作都在生成动态的行为轨迹——电商用户的“浏览商品→点击详情→加入购物车”,内容APP ...
2026-04-02在数字化转型深度推进的今天,企业数据已成为驱动业务增长、构建核心竞争力的战略资产,而数据安全则是守护这份资产的“生命线” ...
2026-04-02在数据驱动决策的浪潮中,数据挖掘与数据分析是两个高频出现且极易被混淆的概念。有人将二者等同看待,认为“做数据分析就是做数 ...
2026-04-01