Scrapy 是一个强大的 Python 爬虫框架,适用于大规模的网页数据抓取。它提供了许多内置的功能来简化爬虫开发。下面我们介绍如何使用 Scrapy 构建爬虫框架,包括安装、创建项目、定义爬虫和数据提取等步骤。
安装 Scrapy
首先,确保你已经安装了 Scrapy,可以使用 pip 进行安装:
sh
pip install scrapy
创建 Scrapy 项目
使用 Scrapy 的命令行工具创建一个新项目:
sh
scrapy startproject myproject
这将创建一个名为 myproject
的目录结构,如下所示:
myproject/
scrapy.cfg
myproject/
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/
__init__.py
定义 Item
在 items.py
文件中定义要抓取的数据结构:
python
import scrapy
class MyprojectItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
description = scrapy.Field()
创建爬虫
在 spiders/
目录下创建一个新的爬虫文件,例如 example_spider.py
:
python
import scrapy
from myproject.items import MyprojectItem
class ExampleSpider(scrapy.Spider):
name = "example"
allowed_domains = ["example.com"]
start_urls = ["http://example.com"]
def parse(self, response):
for article in response.css('div.article'):
item = MyprojectItem()
item['title'] = article.css('h2 a::text').get()
item['link'] = article.css('h2 a::attr(href)').get()
item['description'] = article.css('p::text').get()
yield item
配置设置
在 settings.py
中配置一些常用设置,例如 USER_AGENT 和 ITEM_PIPELINES:
python
# settings.py
# 定义User-Agent
USER_AGENT = 'myproject (+http://www.yourdomain.com)'
# 启用 Pipeline
ITEM_PIPELINES = {
'myproject.pipelines.MyprojectPipeline': 300,
}
定义 Pipeline
在 pipelines.py
中定义如何处理抓取的数据,例如将数据保存到数据库或文件中:
python
class MyprojectPipeline:
def process_item(self, item, spider):
# 处理 item,例如保存到数据库或文件
return item
运行爬虫
使用 Scrapy 命令行工具运行爬虫:
sh
scrapy crawl example
高级用法
1. 处理分页
如果需要处理分页,可以在 parse
方法中调用其他解析方法:
python
def parse(self, response):
for article in response.css('div.article'):
item = MyprojectItem()
item['title'] = article.css('h2 a::text').get()
item['link'] = article.css('h2 a::attr(href)').get()
item['description'] = article.css('p::text').get()
yield item
next_page = response.css('a.next::attr(href)').get()
if next_page:
yield response.follow(next_page, self.parse)
2. 使用 CrawlSpider 处理更复杂的站点结构
CrawlSpider 提供了一种更强大的方式来处理站点的抓取规则:
python
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from myproject.items import MyprojectItem
class MyCrawlSpider(CrawlSpider):
name = 'mycrawl'
allowed_domains = ['example.com']
start_urls = ['http://example.com']
rules = (
Rule(LinkExtractor(allow=('/category/',)), callback='parse_item', follow=True),
)
def parse_item(self, response):
item = MyprojectItem()
item['title'] = response.css('h2 a::text').get()
item['link'] = response.css('h2 a::attr(href)').get()
item['description'] = response.css('p::text').get()
yield item
总结
Scrapy 是一个功能强大的爬虫框架,提供了丰富的功能来简化爬虫的开发过程。通过上述步骤,你可以快速构建一个功能完善的爬虫,并根据需要进行扩展和定制。希望这些示例能够帮助你更好地理解和使用 Scrapy 构建爬虫框架。