Scrapy 是一个快速的、高层次的 web 抓取和 web 抓取框架,用于抓取 web 站点并从页面中提取结构化的数据。Scrapy 用途广泛,从数据挖掘和数据监控到信息处理和历史存档。
Scrapy 的主要特点包括:
- 异步处理(使用 Python 的
asyncio
库)。 - 事件驱动的架构。
- 内置支持多种数据格式(如 JSON, XML, CSV)。
- 强大的选择器,可以方便地提取数据。
- 扩展性,可以通过添加自己的功能来扩展框架。
- 社区支持,有大量的扩展和第三方库。
使用 Scrapy 之前,你需要安装它,通常使用 pip
:
pip install scrapy
以下是 Scrapy 的基本使用步骤和代码示例:
创建一个新的 Scrapy 项目:
scrapy startproject myproject
定义一个爬虫:
在myproject/spiders
目录下创建一个新的 Python 文件,例如my_spider.py
:import scrapy class MySpider(scrapy.Spider): name = 'my_spider' start_urls = ['http://www.example.com'] def parse(self, response): # 解析响应数据 for href in response.css('a::attr(href)').getall(): yield { 'link': href}
运行爬虫:
scrapy crawl my_spider
输出数据:
你可以将数据输出到不同的格式,例如 JSON, CSV 等。使用命令行参数指定输出格式:scrapy crawl my_spider -o output.json
处理项目中的项目:
在myproject/items.py
文件中定义你想要抓取的数据结构:import scrapy class LinkItem(scrapy.Item): link = scrapy.Field()
更新爬虫以使用项目中的项目:
def parse(self, response): for href in response.css('a::attr(href)').getall(): yield LinkItem(link=href)
设置 User-Agent 和请求头:
在myproject/settings.py
中设置默认的请求头:USER_AGENT = 'mybot (+http://www.yourdomain.com)'
设置延迟和并发:
同样在settings.py
中,你可以设置请求之间的延迟和并发请求的数量:DOWNLOAD_DELAY = 1 # 每秒请求数量 CONCURRENT_REQUESTS_PER_DOMAIN = 4 # 每个域的并发请求
使用中间件:
Scrapy 允许你添加请求和响应的中间件,例如:class MyMiddleware: def process_request(request, spider): # 可以在这里修改请求 return None
使用 Scrapy Shell 测试选择器:
Scrapy Shell 是一个交互式的 shell,你可以在其中测试选择器:scrapy shell 'http://www.example.com'
Scrapy 是一个非常强大的框架,特别适合构建大规模