Scrapy简介
Scrapy是一个强大的网络爬虫框架,用于抓取网站数据。它由Python编写,遵循BSD许可证,并且是一个开源项目。Scrapy适用于各种爬虫任务,包括网站抓取、数据挖掘、自动化测试等。Scrapy框架提供了丰富的功能,包括请求发送、响应解析、数据存储等,使得开发网络爬虫变得更加简单高效。
Scrapy入门
安装Scrapy
在开始使用Scrapy之前,首先需要安装Scrapy。可以通过以下命令进行安装:
pip install scrapy
创建Scrapy项目
创建Scrapy项目是使用Scrapy的第一步。可以通过以下命令创建一个名为myproject的Scrapy项目:
scrapy startproject myproject
这将创建一个包含基本文件和目录结构的Scrapy项目。
配置Scrapy项目
在创建项目后,需要对其进行配置。Scrapy项目配置主要在settings.py文件中完成,包括设置爬虫的启动URL、数据存储方式、请求头等信息。
编写爬虫
编写爬虫是Scrapy的核心功能。爬虫通常由一个或多个爬虫类组成,每个爬虫类都继承自scrapy.Spider类。在爬虫类中,需要定义两个主要方法:start_requests()和parse()。
start_requests():用于发送初始请求。parse():用于解析响应并提取数据。
以下是一个简单的爬虫示例:
import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
self.logger.info('Parsing %s', response.url)
for item in response.css('div.item'):
yield {
'name': item.css('h2.title::text').get(),
'description': item.css('p.description::text').get(),
}
Scrapy实战
数据存储
Scrapy提供了多种数据存储方式,包括文件、数据库等。以下是一个将数据存储到CSV文件的示例:
import csv
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
for item in response.css('div.item'):
yield {
'name': item.css('h2.title::text').get(),
'description': item.css('p.description::text').get(),
}
def closed(self, reason):
with open('items.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['name', 'description'])
for item in self.items:
writer.writerow([item['name'], item['description']])
异步请求
Scrapy支持异步请求,可以提高爬虫的效率。以下是一个使用异步请求的示例:
import scrapy
class MySpider(scrapy.Spider):
name = 'my_spider'
start_urls = ['http://example.com']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse)
async def parse(self, response):
self.logger.info('Parsing %s', response.url)
for item in response.css('div.item'):
yield {
'name': item.css('h2.title::text').get(),
'description': item.css('p.description::text').get(),
}
使用中间件
Scrapy中间件可以拦截请求和响应,用于处理如请求重试、用户代理池等功能。以下是一个简单的中间件示例:
import scrapy
class UserAgentMiddleware:
def __init__(self, user_agents):
self.user_agents = user_agents
@classmethod
def from_crawler(cls, crawler):
user_agents = crawler.settings.get('USER_AGENTS')
return cls(user_agents)
def process_request(self, request, spider):
request.headers['User-Agent'] = self.user_agents.pop(0)
在settings.py中配置中间件:
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15',
# ... 更多用户代理
]
DOWNLOADER_MIDDLEWARES = {
'__main__.UserAgentMiddleware': 400,
}
总结
Scrapy是一个功能强大的网络爬虫框架,可以帮助开发者快速开发网络爬虫。通过本教程,读者可以了解到Scrapy的基本使用方法,包括创建项目、编写爬虫、数据存储、异步请求和中间件等。在实际应用中,可以根据需求对Scrapy进行扩展和定制,以满足各种爬虫任务的需求。
