Scrapy是一个开源的并且支持高度可扩展的Python爬虫框架,主要被用来实现从网站提取数据。出现之初就是为网页抓取而设计,但是现在它也可以被用于从 APIs 中抓取数据或通用的Web抓取任务。Scrapy提供了一个简洁的方式来定义和控制网络抓取的整个过程,包括从URL生成请求、处理页面响应到解析内容和存储数据。
下面我们就来通过一个入门的示例代码来看看如何使用Scrapy实现数据爬虫操作。
安装Scrapy
首先,你需要使用pip对Scrapy进行安装,如下所示。
pip install scrapy
创建Scrapy项目
接下来我们可以使用Scrapy中的startproject命令,创建一个新的爬虫项目,如下所示。
scrapy startproject myproject
这个命令会创建一个名为myproject的文件夹,其中包含Scrapy的基本项目结构,如下所示。
myproject/
scrapy.cfg # 项目的配置文件
myproject/ # Python 模块,包含你的爬虫代码
__init__.py
items.py # 定义要抓取的数据结构
middlewares.py # 定义中间件
pipelines.py # 定义数据处理流程
settings.py # 配置文件
spiders/ # 你定义爬虫的地方
__init__.py
创建爬虫
接下来,我们可以进入到spiders目录中,然后创建一个名为example_spider.py的爬虫文件文件,内容如下所示。
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example" # 爬虫的名称,用于命令行运行
start_urls = [
'http://quotes.toscrape.com/page/1/', # 起始URL
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
接下来我们可以通过如下的命令将这个爬虫项目运行起来,如下所示。
scrapy crawl example
当然我们也可以将爬虫数据存储下来,可以通过使用Scrapy的命令行参数将抓取的数据保存到文件中。如下所示。
scrapy crawl example -o quotes.json
这个命令会将爬取的数据保存到quotes.json文件中。
自定义爬虫行为
当然,我们也可以通过编辑settings.py文件来对爬虫行为进行自定义的操作,例如我们设置下载延迟、防止爬虫被封禁等。
例如,在 settings.py 中添加以下内容来设置下载延迟
DOWNLOAD_DELAY = 2 # 每次请求间隔2秒
在pipelines.py文件中定义数据处理的流程操作。数据通过yield语句被传递到了数据处理管道,数据处理管道可以对数据进行清洗、存储等操作,如下所示。
class MyPipeline:
def process_item(self, item, spider):
# 处理数据
item['text'] = item['text'].upper()
return item
然后我们可以在settings.py 中启用管道,如下所示。
ITEM_PIPELINES = {
'myproject.pipelines.MyPipeline': 300,
}
中间件
中间件是Scrapy中在请求和响应过程中处理流程钩子操作。我们也可以通过自定义中间件来修改请求或响应,处理代理,添加自定义header等操作,如下所示。我们可以在middlewares.py 文件中定义自定义的中间件,然后在settings.py中启用它们。
class MyCustomMiddleware:
def process_request(self, request, spider):
# 修改请求
request.headers['User-Agent'] = 'My Custom User-Agent'
启动配置
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.MyCustomMiddleware': 543,
}
总结
Scrapy是一个功能强大且灵活的爬虫框架,适用于各种复杂的网页数据提取任务。我们可以通过深入学习官方文档和示例代码来深入了解和掌握Scrapy的使用,来解决各种实际过程中遇到的问题。