scrapy的spider

来源:互联网 发布:国外的域名需要备案吗 编辑:程序博客网 时间:2024/05/16 15:47

普通的spider

spider的属性介绍

属性名 是否必须 功能 name 是 定义如何定位爬虫并初始化话spider ,必须唯一 allowed_domains 否 包含了spider允许爬取的域名(domain)列表(list) start_requests() 否 该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。当spider启动爬取并且未制定URL时,该方法被调用。 当指定了URL时,make_requests_from_url() 将被调用来创建Request对象。 该方法仅仅会被Scrapy调用一次,因此您可以将其实现为生成器。 make_requests_from_url(url) 否 该方法接受一个URL并返回用于爬取的 Request 对象。 该方法在初始化request时被 start_requests() 调用,也被用于转化url为request。 parse(response) 否 当response没有指定回调函数时,该方法是Scrapy处理下载的response的默认方法。parse 负责处理response并返回处理的数据以及(/或)跟进的URL。 Spider 对其他的Request的回调函数也有相同的要求。 log(message[, level, component]) 否 使用 scrapy.log.msg() 方法记录(log)message。 log中自动带上该spider的 name 属性。 更多 closed(reason) 否 当spider关闭时,该函数被调用。 该方法提供了一个替代调用signals.connect()来监听

例子:

import scrapyfrom myproject.items import MyItemclass MySpider(scrapy.Spider):    name = 'example.com'    allowed_domains = ['example.com']    start_urls = [        'http://www.example.com/1.html',        'http://www.example.com/2.html',        'http://www.example.com/3.html',    ]    def parse(self, response):        sel = scrapy.Selector(response)        for h3 in response.xpath('//h3').extract():            yield MyItem(title=h3)        for url in response.xpath('//a/@href').extract():            yield scrapy.Request(url, callback=self.parse)

创建一个spider模板 scrapy genspider domain domain.com

蜘蛛爬虫(是spider的子类)

创建一个crawlspider模板 scrapy genspider -t crawl domain domain.com

功能:像蜘蛛一样爬去网页
rules: 一个包含一个(或多个) Rule 对象的集合(list)。 每个 Rule 对爬取网站的动作定义了特定表现。 Rule对象在下边会介绍。 如果多个rule匹配了相同的链接,则根据他们在本属性中被定义的顺序,第一个会被使用。
parse_start_url(response):
当start_url的请求返回时,该方法被调用。 该方法分析最初的返回值并必须返回一个 Item 对象或者 一个 Request 对象或者 一个可迭代的包含二者对象。

爬取规则

class scrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)#link_extractor 是一个 Link Extractor 对象。 其定义了如何从爬取到的页面提取链接。#callback 是一个callablestring(该spider中同名的函数将会被调用)。 从link_extractor中每获取到链接时将会调用该函数。该回调函数接受一个response作为其第一个参数, 并返回一个包含 Item 以及(或) Request 对象(或者这两者的子类)的列表(list)。#cb_kwargs 包含传递给回调函数的参数(keyword argument)的字典#follow 是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果 callbackNonefollow 默认设置为 True ,否则默认为 False 。#process_links 是一个callablestring(该spider中同名的函数将会被调用)。 从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。#process_request 是一个callablestring(该spider中同名的函数将会被调用)。 该规则提取到每个request时都会调用该函数。该函数必须返回一个request或者None(用来过滤request)

例子:

import scrapyfrom scrapy.contrib.spiders import CrawlSpider, Rulefrom scrapy.contrib.linkextractors import LinkExtractorclass MySpider(CrawlSpider):    name = 'example.com'    allowed_domains = ['example.com']    start_urls = ['http://www.example.com']    rules = (        # 提取匹配 'category.php' (但不匹配 'subsection.php') 的链接并跟进链接(没有callback意味着follow默认为True)        Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),        # 提取匹配 'item.php' 的链接并使用spider的parse_item方法进行分析        Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),    )    def parse_item(self, response):        self.log('Hi, this is an item page! %s' % response.url)        item = scrapy.Item()        item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')        item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()        item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()        return item

官方文档
中文官方文档

官方文档是学习的最好资料

0 0