开始使用scrapy

来源:互联网 发布:中国移动互联网数据 编辑:程序博客网 时间:2024/06/05 09:16

scrapy 官方文档

#类1import scrapyclass QuotesSpider(scrapy.Spider):    name = "quotes"    def start_requests(self):        urls = [            'http://quotes.toscrape.com/page/1/',            'http://quotes.toscrape.com/page/2/',        ]        for url in urls:            yield scrapy.Request(url=url, callback=self.parse)    def parse(self, response):        page = response.url.split("/")[-2]        filename = 'quotes-%s.html' % page        with open(filename, 'wb') as f:            f.write(response.body)        self.log('Saved file %s' % filename)
#类2import scrapyclass QuotesSpider(scrapy.Spider):    name = "quotes"    start_urls = [        'http://quotes.toscrape.com/tag/humor/',    ]    def parse(self, response):        for quote in response.css('div.quote'):            yield {                'text': quote.css('span.text::text').extract_first(),                'author': quote.xpath('span/small/text()').extract_first(),            }        next_page = response.css('li.next a::attr("href")').extract_first()        if next_page is not None:            yield response.follow(next_page, self.parse)

如果用class 属性 start_urls初始化一个url列表,不重写start_requests方法,框架会调用默认的start_requests方法,用start_urls来生成 initial requests.

从上面两个例子看出,parse方法,response参数是TextResponse类型,可以返回具体数据,用框架实现的方法写入到文件,也可以程序把数据写入文件,也可以返回item,还可以返回新的reqeust,这里用的response.follow(next_page, self.parse),next_page可以是相对路径,scrapy.Request(url=url, callback=self.parse),这里url是全链接。

scrapy setting: scrapy 默认设置

优先级一:命令行设置,-s(–set)
scrapy crawl myspider -s LOG_FILE=scrapy.log
这里是不是可以设置User-Agent?

优先级二:per spider settings
class MySpider(scrapy.Spider):
name = ‘myspider’
custom_settings = {
‘SOME_SETTING’: ‘some value’,
}

优先级三:项目settings.py文件

note:一个项目下可能有多个spider,不同的配置就可以写到每个爬虫类里面,而settings.py对这多个爬虫都有效果。

下载中间件:(理解还不够深刻,待完善)
默认的下载中间价以及order:
{
‘scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware’: 100,
‘scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware’: 300,
‘scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware’: 350,
‘scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware’: 400,
‘scrapy.downloadermiddlewares.useragent.UserAgentMiddleware’: 500,
‘scrapy.downloadermiddlewares.retry.RetryMiddleware’: 550,
‘scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware’: 560,
‘scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware’: 580,
‘scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware’: 590,
‘scrapy.downloadermiddlewares.redirect.RedirectMiddleware’: 600,
‘scrapy.downloadermiddlewares.cookies.CookiesMiddleware’: 700,
‘scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware’: 750,
‘scrapy.downloadermiddlewares.stats.DownloaderStats’: 850,
‘scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware’: 900,
}
自定义中间件要实现一下方法的一个或多个:
process_request(request, spider)
process_response(request, response, spider)
process_exception(request, exception, spider)

def process_request(self, request, spider),这个方法可以返回None(或者没有return),返回request,返回htmlresponse,返回Ignorerequest。

返回None,这种情况一般是修改request对象,scrapy engine会调用下一个中间件的这个方法来继续处理这个reqeust;返回request,这种情况好像是要返回request给调度器(不是很清楚),不过这种情况比较少;返回htmlresponse,这种情况后续中间件的process_request不会被调用,而process_response方法会被调用(如果有这个方法)。

自定义下载中间件order确定:待研究

spide中间件:
作用在spider收到response之前,处理response;也可以作用在spider产生的request或者item上面。
默认的spider和order:
{
‘scrapy.spidermiddlewares.httperror.HttpErrorMiddleware’: 50,
‘scrapy.spidermiddlewares.offsite.OffsiteMiddleware’: 500,
‘scrapy.spidermiddlewares.referer.RefererMiddleware’: 700,
‘scrapy.spidermiddlewares.urllength.UrlLengthMiddleware’: 800,
‘scrapy.spidermiddlewares.depth.DepthMiddleware’: 900,
}
自定义spider中间件要实现以下一个或多个方法:
process_spider_input(response, spider)
process_spider_output(response, result, spider)
process_start_requests(start_requests, spider)

自定义spider中间件order确定:待研究

一时理解,请不吝指正

原创粉丝点击