- Scrapy 教程
- Scrapy - 首页
- Scrapy 基本概念
- Scrapy - 概述
- Scrapy - 环境
- Scrapy - 命令行工具
- Scrapy - 爬虫
- Scrapy - 选择器
- Scrapy - 项
- Scrapy - 项加载器
- Scrapy - Shell
- Scrapy - 项管道
- Scrapy - Feed 导出
- Scrapy - 请求 & 响应
- Scrapy - 链接提取器
- Scrapy - 设置
- Scrapy - 异常
- Scrapy 实时项目
- Scrapy - 创建项目
- Scrapy - 定义项
- Scrapy - 第一个爬虫
- Scrapy - 爬取
- Scrapy - 提取项
- Scrapy - 使用项
- Scrapy - 跟踪链接
- Scrapy - 爬取数据
- Scrapy 有用资源
- Scrapy - 快速指南
- Scrapy - 有用资源
- Scrapy - 讨论
Scrapy - 爬虫
描述
爬虫是一个类,负责定义如何通过网站跟踪链接并从页面中提取信息。
Scrapy 的默认爬虫如下:
scrapy.Spider
它是一个爬虫,所有其他爬虫都必须继承它。它具有以下类:
class scrapy.spiders.Spider
下表显示了 scrapy.Spider 类的字段:
序号 | 字段 & 描述 |
---|---|
1 | name 它是你的爬虫的名称。 |
2 | allowed_domains 它是爬虫爬取的域名列表。 |
3 | start_urls 它是一个 URL 列表,将作为后续爬取的根,爬虫将从此处开始爬取。 |
4 | custom_settings 这些是在运行爬虫时,将从项目范围的配置中覆盖的设置。 |
5 | crawler 它是一个属性,链接到爬虫实例绑定的 Crawler 对象。 |
6 | settings 这些是运行爬虫的设置。 |
7 | logger 它是一个 Python 日志记录器,用于发送日志消息。 |
8 | from_crawler(crawler,*args,**kwargs) 它是一个类方法,用于创建你的爬虫。参数如下:
|
9 | start_requests() 当没有指定特定的 URL 并且爬虫打开以进行抓取时,Scrapy 会调用 start_requests() 方法。 |
10 | make_requests_from_url(url) 它是一个用于将 URL 转换为请求的方法。 |
11 | parse(response) 此方法处理响应并返回抓取的数据,以及更多 URL。 |
12 | log(message[,level,component]) 它是一个通过爬虫日志记录器发送日志消息的方法。 |
13 | closed(reason) 当爬虫关闭时,会调用此方法。 |
爬虫参数
爬虫参数用于指定起始 URL,并使用 crawl 命令和 -a 选项传递,如下所示:
scrapy crawl first_scrapy -a group = accessories
以下代码演示了爬虫如何接收参数:
import scrapy class FirstSpider(scrapy.Spider): name = "first" def __init__(self, group = None, *args, **kwargs): super(FirstSpider, self).__init__(*args, **kwargs) self.start_urls = ["http://www.example.com/group/%s" % group]
通用爬虫
您可以使用通用爬虫从其子类化您的爬虫。它们的目的是根据某些规则跟踪网站上的所有链接,以从所有页面提取数据。
对于以下爬虫中使用的示例,让我们假设我们有一个具有以下字段的项目:
import scrapy from scrapy.item import Item, Field class First_scrapyItem(scrapy.Item): product_title = Field() product_link = Field() product_description = Field()
CrawlSpider
CrawlSpider 定义了一组规则来跟踪链接并抓取多个页面。它具有以下类:
class scrapy.spiders.CrawlSpider
以下是 CrawlSpider 类的属性:
rules
它是一个规则对象的列表,定义了爬虫如何跟踪链接。
下表显示了 CrawlSpider 类的规则:
序号 | 规则 & 描述 |
---|---|
1 | LinkExtractor 它指定了爬虫如何跟踪链接并提取数据。 |
2 | callback 在每个页面抓取后调用。 |
3 | follow 它指定是否继续跟踪链接。 |
parse_start_url(response)
它通过允许解析初始响应返回项或请求对象。
注意 − 编写规则时,请确保将 parse 函数重命名为除 parse 之外的其他名称,因为 parse 函数由 CrawlSpider 用于实现其逻辑。
让我们看一下下面的示例,其中爬虫从 demoexample.com 的主页开始爬取,收集所有页面、链接,并使用 parse_items 方法进行解析:
import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class DemoSpider(CrawlSpider): name = "demo" allowed_domains = ["www.demoexample.com"] start_urls = ["http://www.demoexample.com"] rules = ( Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)), callback = "parse_item", follow = True), ) def parse_item(self, response): item = DemoItem() item["product_title"] = response.xpath("a/text()").extract() item["product_link"] = response.xpath("a/@href").extract() item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract() return items
XMLFeedSpider
它是用于从 XML feed 抓取并迭代节点的爬虫的基类。它具有以下类:
class scrapy.spiders.XMLFeedSpider
下表显示了用于设置迭代器和标签名称的类属性:
序号 | 属性 & 描述 |
---|---|
1 | iterator 它定义了要使用的迭代器。它可以是 iternodes、html 或 xml。默认为 iternodes。 |
2 | itertag 它是一个包含要迭代的节点名称的字符串。 |
3 | namespaces 它由 (前缀,uri) 元组列表定义,这些元组使用 register_namespace() 方法自动注册命名空间。 |
4 | adapt_response(response) 它接收响应并在响应体从爬虫中间件到达后立即修改它,在爬虫开始解析它之前。 |
5 | parse_node(response,selector) 当为每个与提供的标签名称匹配的节点调用时,它接收响应和选择器。 注意 − 如果不覆盖此方法,你的爬虫将无法工作。 |
6 | process_results(response,results) 它返回爬虫返回的结果和响应列表。 |
CSVFeedSpider
它迭代其每一行,接收 CSV 文件作为响应,并调用 parse_row() 方法。它具有以下类:
class scrapy.spiders.CSVFeedSpider
下表显示了可以设置的关于 CSV 文件的选项:
序号 | 选项 & 描述 |
---|---|
1 | delimiter 它是一个包含逗号 (,) 分隔符的字符串,用于每个字段。 |
2 | quotechar 它是一个包含引号 (") 的字符串,用于每个字段。 |
3 | headers 它是一个语句列表,从中可以提取字段。 |
4 | parse_row(response,row) 它接收响应和每一行以及标题的键。 |
CSVFeedSpider 示例
from scrapy.spiders import CSVFeedSpider from demoproject.items import DemoItem class DemoSpider(CSVFeedSpider): name = "demo" allowed_domains = ["www.demoexample.com"] start_urls = ["http://www.demoexample.com/feed.csv"] delimiter = ";" quotechar = "'" headers = ["product_title", "product_link", "product_description"] def parse_row(self, response, row): self.logger.info("This is row: %r", row) item = DemoItem() item["product_title"] = row["product_title"] item["product_link"] = row["product_link"] item["product_description"] = row["product_description"] return item
SitemapSpider
SitemapSpider 在 站点地图 的帮助下通过从 robots.txt 中找到 URL 来爬取网站。它具有以下类:
class scrapy.spiders.SitemapSpider
下表显示了 SitemapSpider 的字段:
序号 | 字段 & 描述 |
---|---|
1 | sitemap_urls 你要爬取的指向站点地图的 URL 列表。 |
2 | sitemap_rules 它是一个元组 (正则表达式,回调) 列表,其中正则表达式是正则表达式,回调用于处理与正则表达式匹配的 URL。 |
3 | sitemap_follow 它是一个要跟踪的站点地图正则表达式列表。 |
4 | sitemap_alternate_links 指定要为单个 url 跟踪的备用链接。 |
SitemapSpider 示例
以下 SitemapSpider 处理所有 URL:
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.demoexample.com/sitemap.xml"] def parse(self, response): # You can scrap items here
以下 SitemapSpider 使用回调处理一些 URL:
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.demoexample.com/sitemap.xml"] rules = [ ("/item/", "parse_item"), ("/group/", "parse_group"), ] def parse_item(self, response): # you can scrap item here def parse_group(self, response): # you can scrap group here
以下代码显示了 robots.txt 中的站点地图,其 url 包含 /sitemap_company:
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.demoexample.com/robots.txt"] rules = [ ("/company/", "parse_company"), ] sitemap_follow = ["/sitemap_company"] def parse_company(self, response): # you can scrap company here
你甚至可以将 SitemapSpider 与其他 URL 结合使用,如下面的命令所示。
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.demoexample.com/robots.txt"] rules = [ ("/company/", "parse_company"), ] other_urls = ["http://www.demoexample.com/contact-us"] def start_requests(self): requests = list(super(DemoSpider, self).start_requests()) requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls] return requests def parse_company(self, response): # you can scrap company here... def parse_other(self, response): # you can scrap other here...