(4)Scrapy蜘蛛(Spider)
目录
Spider是负责定义如何遵循通过网站的链接并提取网页中的信息的类。
Scrapy默认的 Spider 如下:
scrapy.Spider
它是所有其他的蜘蛛(spider)都必须继承的类。它具有以下类:
class scrapy.spiders.Spider
下面的表显示了 scrapy.Spider 类的字段:
S.N. | 字段 & 描述 |
---|---|
1 |
name 这是 spider 的名字 |
2 |
allowed_domains
它是允许 spider 抓取域名称的列表
|
3 |
start_urls
这是供以后蜘蛛将开始抓取的URL列表的根
|
4 |
custom_settings
这些设置在蜘蛛运行时会从项目范围内覆盖配置
|
5 |
crawler
它是链接到 spider 实例绑定的 Crawler 对象的属性
|
6 |
settings
这些是运行一个 spider 的设置
|
7 |
logger
它是用来发送日志消息的 python 记录器
|
8 |
from_crawler(crawler,*args,**kwargs)
它是由 spider 创建的一个类方法。参数是:
|
9 |
start_requests()
如果不指定特定的URL,蜘蛛会打开抓取,Scrapy调用start_requests()方法
|
10 |
make_requests_from_url(url)
它是用于将URL网址转换为请求方法
|
11 |
parse(response)
这个方法处理响应并返回废弃数据
|
12 |
log(message[,level,component])
这个方法会通过蜘蛛发送日志记录信息
|
13 |
closed(reason)
这种方法在当蜘蛛关闭时调用
|
Spider参数
Spider 参数用于指定起始URL和使用带有-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.yiibai.com/group/%s" % group]
通用Spider
您可以使用通用蜘蛛来创建子类蜘蛛。他们的目的是要根据一定的规则来提取所有在网站上的所有链接的数据。
例如:
我们假设项目有以下的字段:
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类的规则:
S.N. |
规则和说明
|
---|---|
1 |
LinkExtractor
它指定蜘蛛如何跟随链接和提取数据;
|
2 |
callback
它是在每一页提取之后被调用;
|
3 |
follow
它指定是否继续跟踪链接;
|
parse_start_url(response)
它通过允许解析初步回应返回项目或请求对象。
注意: 请务必重命名等函数解析而不是编写规则,因为解析函数用于CrawlSpider来实现它的逻辑。
例如:
让我们看看下面的例子开始演示蜘蛛爬行 example.com 首页,使用 parse_items 方法收集所有页面上的链接和词组:
import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class DemoSpider(CrawlSpider): name = "demo" allowed_domains = ["www.yiibai.com"] start_urls = ["http://www.yiibai.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
下表显示了用于设置iterator和标记名称的类属性:
S.N. |
属性和说明
|
---|---|
1 |
iterator
它定义将要使用的迭代器。它可以是iternodes,HTML或XML。默认为:iternodes
|
2 |
itertag
它使用节点名称的字符串进行迭代
|
3 |
namespaces
它是由(prefix, 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文件的选项:
S.N. |
选项及说明
|
---|---|
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.yiibai.com"] start_urls = ["http://www.yiibai.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
站点地图(sitemap)帮助蜘蛛通过 robots.txt 的定位网址并抓取网站。它有以下类:
class scrapy.spiders.SitemapSpider
下面的表显示了SitemapSpider的字段:
S.N. |
字段及说明
|
---|---|
1 |
sitemap_urls
要抓取指向网站地图的URL列表
|
2 |
sitemap_rules
这是一个元组列表 (regex, callback) ,其中,正则表达式是正则表达式,回调是用来处理的URL匹配的正则表达式
|
3 |
sitemap_follow
这是网站地图的正则表达式的跟踪列表
|
4 |
sitemap_alternate_links
指定要跟踪一个URL备用链路
|
SitemapSpider 示例:
下面是 SitemapSpider 处理所有的网址:
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.yiibai.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.yiibai.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 SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.yiibai.com/robots.txt"] rules = [ ("/company/", "parse_company"), ] sitemap_follow = ["/sitemap_company"] def parse_company(self, response): # you can scrap company here
您甚至可以将 SitemapSpider 与其他网址相结合如下图所示:
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.yiibai.com/robots.txt"] rules = [ ("/company/", "parse_company"), ] other_urls = ["http://www.yiibai.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...
关注右侧公众号,随时随地查看教程
Scrapy教程目录