Scrapy - Spiders
描述
Spider 是一个类,负责定义如何跟踪网站上的链接并从页面中提取信息。
Scrapy 的默认蜘蛛如下 −
scrapy.Spider
它是所有其他蜘蛛必须继承的蜘蛛。它具有以下类 −
class scrapy.spiders.Spider
下表显示了 scrapy.Spider 类的字段 −
Sr.No | Field &描述 |
---|---|
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]) 这是一个通过 spider 记录器发送日志消息的方法。 |
13 | closed(reason) 当 spider 关闭时调用此方法。 |
Spider 参数
Spider 参数用于指定起始 URL,并使用带有 -a 选项的 crawl 命令传递,如下所示 −
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 类 −
的属性规则
它是定义爬虫如何跟踪链接的规则对象列表。
下表显示了 CrawlSpider 类的规则 −
Sr.No | 规则 &描述 |
---|---|
1 | LinkExtractor 它指定蜘蛛如何跟踪链接并提取数据。 |
2 | callback 每次抓取页面后都会调用它。 |
3 | follow 它指定是否继续跟踪链接。 |
parse_start_url(response)
它通过允许解析初始响应。
注意 − 确保在编写规则时将解析函数重命名为解析以外的名称,因为解析函数被 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 源抓取数据并遍历节点的蜘蛛的基类。它有以下类 −
class scrapy.spiders.XMLFeedSpider
下表显示用于设置迭代器和标签名称 −
的类属性Sr.No | 属性和说明 |
---|---|
1 | iterator 它定义要使用的迭代器。它可以是 iternodes、html 或 xml。默认值为 iternodes。 |
2 | itertag 它是一个带有要迭代的节点名称的字符串。 |
3 | namespaces 它由 (prefix, uri) 元组列表定义,使用 register_namespace() 方法自动注册命名空间。 |
4 | adapt_response(response) 它接收响应并在响应从 spider 中间件到达后立即修改响应主体,在 spider 之前开始解析它。 |
5 | parse_node(response,selector) 当调用每个与提供的标签名称匹配的节点时,它会接收响应和选择器。 注意 −如果不覆盖此方法,您的蜘蛛将无法工作。 |
6 | process_results(response,results) 它返回蜘蛛返回的结果和响应列表。 |
CSVFeedSpider
它遍历其每一行,接收 CSV 文件作为响应,并调用 parse_row() 方法。它具有以下类 −
class scrapy.spiders.CSVFeedSpider
下表显示了可以设置的有关 CSV 文件的选项 −
Sr.No | 选项和说明 |
---|---|
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 在 Sitemaps 的帮助下,通过从 robots.txt 中定位 URL 来抓取网站。它具有以下类 −
class scrapy.spiders.SitemapSpider
下表显示了 SitemapSpider 的字段 −
Sr.No | Field &描述 |
---|---|
1 | sitemap_urls 指向站点地图的要抓取的 URL 列表。 |
2 | sitemap_rules 它是一个元组列表 (regex, callback),其中 regex 是正则表达式,callback 用于处理与正则表达式匹配的 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):
# 您可以在此处删除项目
def parse_group(self, response):
# 您可以在此处删除组
以下代码显示 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...