详解Python的爬虫框架 Scrapy
什么是Scrapy
Scrapy是一个用于爬取Web站点并提取结构化数据的应用程序框架。它基于Twisted框架构建,并提供了数据结构和XML(and JSON,CSV等数据格式)导入/导出的支持。
使用Scrapy,可以轻松地创建爬取任务,然后分析和保存数据以在后续分析中使用。
Scrapy的组成部分
Spider
Spider是Scrapy的核心组件之一。它是一个爬虫的实现,通过设置规则可以定义某个网站的页面如何被爬取。基本上,Spider会从一些初始URL开始,通过跟踪页面中链接(例如,首页链接,类别链接和文章链接等)并根据您定义的规则准确提取数据。
Item
Item是爬取结果的容器。它可以是特定于站点的自定义类或简单的字典。爬虫通过交付Item到Item Pipeline,后者把Item处理并集成到整个系统中。
Item Pipeline
Item Pipeline负责处理从Spider获取的Item,并将其保存到任何地方(例如,数据库,文件系统等)。Item Pipeline是一个可选的组件,因此您无需使用它。
Downloader
下载器是Scrapy另一个核心组件。它负责根据请求(通常是从Spider生成)下载相应的页面并返回响应。默认情况下,Scrapy使用Twisted提供的异步网络库。这使得Scrapy的下载器能够同时处理数百个下载。
Middleware
Middleware提供了从Spider生成的请求和从Downloader返回的响应的钩子。这使得在处理请求和响应时可以插入自己的自定义代码,例如为请求添加头文件,向响应添加元数据等。
Scheduler
Scheduler维护了将要访问的URL队列。当Spider发送请求时,它首先进入调度程序队列并被检查是否可以进行抓取。调度程序还负责避免重复请求的任务。
Engine
Engine管理上述所有组件之间的工作流程。它从Spider接收请求并传递给中间件,Downloader和Scheduler。而后,Engine从Downloader同道返回的响应并将响应交付给Spider,进行进一步处理。
Scrapy的使用
安装Scrapy
Scrapy是通过pip进行安装的。要安装Scrapy,运行以下命令:
pip install scrapy
创建Scrapy项目
要创建Scrapy项目,请运行以下命令:
scrapy startproject myproject
上面的命令将在当前目录下创建一个名为myproject的Scrapy项目,其中包含必要的文件结构。要了解Scrapy项目中不同文件的含义,请参阅官方文档。
创建Spider
要创建Spider,请创建一个新的Python文件并定义一个继承自scrapy.Spider
的类。例如,以下示例Spider将爬取目标站点的主页,并提取有关所有文章(包括标题,链接和发布日期)的信息:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://example.com']
def parse(self, response):
for article in response.css('article'):
yield {
'title': article.css('h2 a::text').get(),
'link': article.css('h2 a::attr(href)').get(),
'publish_date': article.css('p.published::text').get(),
}
运行Spider
要运行您的Spider,请在项目的根文件夹中运行以下命令:
scrapy crawl myspider
这将运行名为myspider的Spider并开始提取数据。
示例一:爬取博客
以下代码演示了如何使用Scrapy爬取一些博客的标题和链接。要实现此操作,请按以下步骤操作:
定义Spider
import scrapy
class BlogSpider(scrapy.Spider):
name = 'blogspider'
start_urls = ['https://blog.scrapinghub.com']
def parse(self, response):
for title in response.css('.post-header>h2'):
yield {'title': title.css('a ::text').get()}
for next_page in response.css('a.next-posts-link'):
yield response.follow(next_page, self.parse)
运行Spider
要运行上述程序,请在终端中键入以下内容:
scrapy runspider blog_spider.py -o output.json
在上面的命令中,-o output.json将指示Scrapy将爬虫输出转储到名为output.json的文件中。
输出将类似于以下内容:
[{"title": "Scrapy Tips from the Pros: June 2016"}]
示例二:使用Scrapy和BeautifulSoup爬取网页并提取数据
在这个例子中,我们将使用Scrapy来爬取一个网站,并使用BeautifulSoup从响应中提取数据。执行以下步骤:
安装BeautifulSoup
使用以下命令安装BeautifulSoup:
pip install beautifulsoup4
创建Spider
import scrapy
from bs4 import BeautifulSoup
class QuotesSpider(scrapy.Spider):
name = "sina_spider"
start_urls = [
'https://news.sina.com.cn/',
]
def parse(self, response):
soup = BeautifulSoup(response.text, 'html.parser')
for a in soup.select('a[href^="http"]'):
yield response.follow(a['href'], self.parse_item)
def parse_item(self, response):
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.title.string
article = soup.select_one('article')
content = article.get_text(strip=True)
yield {'title': title, 'content': content}
运行Spider
要运行该Spider,请执行以下命令:
scrapy runspider sina_spider.py -o output.json
上述命令将导出提取的文章标题和内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python的爬虫框架 Scrapy - Python技术站