开始使用scrapy

scrapy 官方文档

#类1
import scrapy
class 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)
#类2
import scrapy
class 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确定:待研究

一时理解,请不吝指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值