发布于 2016-10-29 08:38:36 | 381 次阅读 | 评论: 0 | 来源: PHPERZ
class scrapy.spiders.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)
这种方法在当蜘蛛关闭时调用
|
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]
您可以使用通用蜘蛛来创建子类蜘蛛。他们的目的是要根据一定的规则来提取所有在网站上的所有链接的数据。
import scrapy from scrapy.item import Item, Field class First_scrapyItem(scrapy.Item): product_title = Field() product_link = Field() product_description = Field()
class scrapy.spiders.CrawlSpider
S.N. |
规则和说明
|
---|---|
1 | LinkExtractor
它指定蜘蛛如何跟随链接和提取数据;
|
2 | callback
它是在每一页提取之后被调用;
|
3 | follow
它指定是否继续跟踪链接;
|
它通过允许解析初步回应返回项目或请求对象。
注意: 请务必重命名等函数解析而不是编写规则,因为解析函数用于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
class scrapy.spiders.XMLFeedSpider
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)
它由蜘蛛返回结果和响应列表
|
class scrapy.spiders.CSVFeedSpider
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
站点地图(sitemap)帮助蜘蛛通过 robots.txt 的定位网址并抓取网站。它有以下类:
class scrapy.spiders.SitemapSpider
S.N. |
字段及说明
|
---|---|
1 | sitemap_urls
要抓取指向网站地图的URL列表
|
2 | sitemap_rules
这是一个元组列表 (regex, callback) ,其中,正则表达式是正则表达式,回调是用来处理的URL匹配的正则表达式
|
3 | sitemap_follow
这是网站地图的正则表达式的跟踪列表
|
4 | sitemap_alternate_links
指定要跟踪一个URL备用链路
|
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
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
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...