描述
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 | 设置 这些是运行蜘蛛的设置. |
7 | 记录器 这是一个用于发送日志消息的Python记录器. |
8 | from_crawler(crawler,* args,** kwargs) 这是一个创建蜘蛛的类方法.参数为 :
|
9 | start_requests() 当没有指定特定的URL并打开蜘蛛进行报废时,Scrapy会调用 start_requests()方法. |
10 | make_requests_from_url(url) 这是一种用于将网址转换为请求的方法. |
11 | 解析(响应) 此方法处理响应并返回更多网址后的报废数据. |
12 | log(消息[,级别,组件]) 这是一个发送日志的方法消息通过蜘蛛记录器. |
13 | 关闭(原因) 此方法是通话蜘蛛关闭时编辑. |
Spider Arguments
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]
Generic Spiders
您可以使用通用蜘蛛从你的蜘蛛子类.他们的目的是根据某些规则关注网站上的所有链接,从所有页面中提取数据.
对于以下蜘蛛中使用的示例,我们假设我们有一个包含以下内容的项目字段 :
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 class : 的规则;
Sr.No | 规则&说明 |
---|---|
1 | LinkExtractor 它指定蜘蛛如何跟踪链接并提取数据. |
2 | 回调 在每个页面被删除后调用. |
3 | 关注 它指定是否继续关注链接. |
parse_start_url(回复)
它返回任一项或通过允许解析初始响应来请求对象.
注意 : 确保在编写规则时重命名除解析之外的解析函数,因为CrawlSpider使用解析函数来实现其逻辑.
让我们看看下面的示例,其中spider开始爬行demoexample.com的主页,使用 parse_items 方法收集所有页面,链接和解析;
import scrapyfrom scrapy.spiders import CrawlSpider, Rulefrom scrapy.linkextractors import LinkExtractorclass 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 | 迭代器 它定义了要使用的迭代器.它可以是 iternodes,html 或 xml .默认为 iternodes . |
2 | itertag 这是一个包含要迭代的节点名的字符串. |
3 | 名称空间 它由(prefix,uri)元组列表定义,这些元组使用 register_namespace()方法自动注册名称空间. |
4 | adapt_response(响应) 它会在蜘蛛开始解析之前收到响应,并在它从蜘蛛中间件到达时修改响应正文. |
5 | parse_node(响应,选择器) 当为与提供的标记名称匹配的每个节点调用时,它会收到响应和选择器. 注意 : 如果你不重写这个方法,你的蜘蛛将无法工作. |
6 | process_results(响应,结果) 它返回结果列表,蜘蛛返回的响应. |
CSVFeedSpider
它遍历每一行,接收CSV文件作为响应,并调用 parse_row()方法.它有以下类 :
class scrapy.spiders.CSVFeedSpider
下表显示了可以设置的关于CSV文件和减号的选项;
Sr.No | 选项&说明 |
---|---|
1 | 分隔符 这是一个字符串,包含每个字段的逗号(',')分隔符. |
2 | quotechar 这是一个包含每个字段的引号('"')的字符串. |
3 | 标题 这是一个列表可以从中提取字段的语句. |
4 | parse_row(响应,行) 它收到一个响应,每行都有一个标题键. |
CSVFeedSpider示例
from scrapy.spiders import CSVFeedSpiderfrom 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.它有以下类 :
class scrapy.spiders.SitemapSpider
下表显示了SitemapSpider : 的字段;
Sr.No | Field&说明 |
---|---|
1 | sitemap_urls 您要抓取指向站点地图的网址列表. |
2 | sitemap_rules 这是一个元组列表(正则表达式,回调),其中正则表达式是正则表达式,回调用于处理与正则表达式匹配的URL. |
3 | sitemap_follow 这是一个站点地图的正则表格列表. |
4 | sitemap_alternate_links 指定单个网址要遵循的备用链接. |
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处理一些带回调和减号的网址;
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中的网址地图,其网址为/sitemap_company :
from scrapy.spiders import SitemapSpiderclass 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...