Scrapy – 蜘蛛
Scrapy – 蜘蛛
描述
Spider 是一个类,负责定义如何通过网站跟踪链接并从页面中提取信息。
Scrapy 的默认蜘蛛如下 –
scrapy.Spider
它是所有其他蜘蛛都必须继承的蜘蛛。它有以下类 –
class scrapy.spiders.Spider
下表显示了 scrapy.Spider 类的字段 –
Sr.No | 字段和描述 |
---|---|
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) 当蜘蛛关闭时调用此方法。 |
蜘蛛参数
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 定义了一组规则来跟踪链接并废弃多个页面。它有以下类 –
class scrapy.spiders.CrawlSpider
以下是 CrawlSpider 类的属性 –
规则
它是一个规则对象列表,用于定义爬虫如何跟踪链接。
下表显示了 CrawlSpider 类的规则 –
Sr.No | 规则和说明 |
---|---|
1 |
LinkExtractor 它指定蜘蛛如何跟踪链接并提取数据。 |
2 |
callback 在抓取每个页面后调用它。 |
3 |
follow 它指定是否继续关注链接。 |
parse_start_url(响应)
它通过允许解析初始响应来返回项目或请求对象。
注意– 确保在编写规则时重命名 parse 函数而不是 parse ,因为 CrawlSpider 使用 parse 函数来实现其逻辑。
让我们看看下面的例子,蜘蛛开始抓取 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 它由使用register_namespace()方法自动注册命名空间的 (prefix, uri) 元组列表定义。 |
4 |
adapt_response(response) 它接收响应并在它从蜘蛛中间件到达时立即修改响应主体,然后蜘蛛开始解析它。 |
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 在站点地图的帮助下通过从 robots.txt 中定位 URL 来抓取网站。它有以下类 –
class scrapy.spiders.SitemapSpider
下表显示了 SitemapSpider 的字段 –
Sr.No | 字段和描述 |
---|---|
1 |
sitemap_urls 要抓取的指向站点地图的 URL 列表。 |
2 |
sitemap_rules 它是一个元组列表(regex,callback),其中regex是一个正则表达式,callback用于处理匹配一个正则表达式的URL。 |
3 |
sitemap_follow 这是要遵循的站点地图正则表达式列表。 |
4 |
sitemap_alternate_links 指定要跟踪的单个 url 的备用链接。 |
站点地图Spider 示例
以下 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...