1. 简介
Scrapy是一个用于爬取网站数据的Python框架。该框架基于Twisted异步网络框架开发,能够快速高效地爬取互联网上的数据。
2. 安装Scrapy框架
2.1 安装方法
首先需要安装Python,推荐使用Python3版本。使用pip安装Scrapy:
pip install scrapy
2.2 安装验证
安装完成后,可以通过运行下面的命令验证是否安装成功:
import scrapy
如果没有报错,则表明安装成功。
3. Scrapy框架组成
3.1 Scrapy引擎
Scrapy引擎是整个框架的核心。它负责协调各个模块之间的工作,比如调度器、下载器、爬虫和管道等。它负责触发事件和传递数据。
3.2 调度器
调度器负责维护待爬取的请求队列,并根据优先级和调度策略选择下一个要爬取的请求,发送给下载器进行处理。
3.3 下载器
下载器负责将HTTP请求返回的响应进行处理,包括解析网页内容、处理异常和存储响应等操作,并将处理后的结果返回给引擎。
3.4 爬虫
爬虫是开发者自己定义的用于处理特定网站或网页的Python类。它包括一些属性和方法,用于指定要爬取的网站、定义如何提取数据以及如何跟踪链接等内容。
3.5 管道
管道是Scrapy框架用于对爬取到的数据进行处理和持久化的组件。它负责将爬虫返回的数据进行处理,比如清洗、去重、存储等。
4. Scrapy框架基本使用
4.1 创建一个Scrapy项目
使用命令行工具创建一个Scrapy项目:
scrapy startproject project_name
后面的project_name是项目名称,可以根据自己的需要进行修改。
4.2 定义爬虫
使用命令行工具创建一个爬虫:
scrapy genspider spider_name domain_name
spider_name是爬虫名称,可以根据自己的需要进行修改;domain_name是要爬取的网站域名。
定义爬虫类:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['https://www.example.com']
def parse(self, response):
# 处理返回的响应数据
pass
其中,name是这个爬虫的名称,需要与之前的spider_name相同;start_urls是开始爬取的网站列表;parse方法用于处理响应。
4.3 下载网页
使用Scrapy的下载器下载网页:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['https://www.example.com']
def parse(self, response):
html = response.text
filename = 'example.html'
with open(filename, 'w') as f:
f.write(html)
其中,response.text是下载到的网页内容,可以直接保存到文件中。
4.4 提取数据
Scrapy提供了丰富的选择器,可以方便地从网页中提取数据。这里以提取新闻列表为例。
import scrapy
class NewsSpider(scrapy.Spider):
name = 'newsspider'
start_urls = ['https://www.example.com/news']
def parse(self, response):
# 提取新闻列表
news_list = response.css('.news-list li a')
for news in news_list:
# 提取每条新闻的标题和链接
title = news.css('::text').extract_first()
link = news.css('::attr(href)').extract_first()
yield {
'title': title,
'link': link
}
在这个爬虫中,使用了response.css方法选择新闻列表,并使用css选择器提取每个新闻的标题和链接。
4.5 使用管道
使用管道对爬虫返回的数据进行处理和持久化。这里以将爬虫数据存储到MongoDB数据库为例。
import pymongo
class MyPipeline(object):
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
)
def open_spider(self, spider):
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
collection_name = spider.name
self.db[collection_name].insert_one(dict(item))
return item
在这个管道中,使用了MongoDB作为数据存储介质。需要在settings.py文件中进行配置:
ITEM_PIPELINES = {
'myproject.pipelines.MyPipeline': 300,
}
MONGO_URI = 'mongodb://localhost:27017/'
MONGO_DATABASE = 'mydatabase'
这里的'300'表示管道的优先级,较低的数字优先级较高。
5. 总结
Scrapy是一个功能强大的Python爬虫框架,可以快速高效地爬取互联网上的数据。其采用了Twisted异步网络框架,能够提高爬虫的效率。Scrapy拥有完整的架构,包括引擎、调度器、下载器、爬虫和管道等模块,使用起来非常方便。