scrapy入门(二)请求传参和中间件

  1. scrapy的请求传参

    作用 : 实现深度爬取

    使用场景 : 爬取的数据没有在同一张页面

    例如, 爬取电影首页全部电影的详情页信息

    #请求传参: 让Request将一个数据值(字典)传递给回调函数
    #在第一页中将item对象的第一个属性赋值,然后通过请求传参将item对象传过去
    #手动发送get请求:
    model_index = [3,4,6,7,8]
    for index in model_list:
     li =li_list[index]
     model_url = li.xpath('xxxxxxx').extract_first()
     self.model_urls.append(model_url)
    #for li in li_list:  #这种适用于所有的li标签都需要的情况下,当只需要某几个标签时,选用上面的方式
     #...
       yield scrapy.Request(url=, callback=my_parse, meta={'item':item})
    if self.page < 5:
     self.page += 1
     new_url = format(self.url%self.page)
     yield scrapy.Request(url=new_url,callback=parse)
    
    def my_parse(self, response):
     #接受请求传参的数据,还原出item对象
     item = response.meta['item']
       #解析item对象需要的第二个属性
     xxx = respnse.xpath('').extract_first()
     #给item对象的第二个属性赋值
     item['xxx'] = xxx
     #还可以接着请求传参,这里不再演示
     yield item
  2. scrapy的中间件, 和管道一样, 需要在配置文件中开启中间件

    下载中间件 : 批量拦截requests和response

    作用:

    • 修改请求的头信息
    • 修改请求的ip地址 (代理模式)
    • 修改响应对象(数据)

    middlewares.py文件: 修改成如下形式

    import scrapy
    
    #构建UA池,这样可以不在settings文件中写死
    user_agent_list = [
        'xxxxxx',
        'xxxxxxxxx',
        'xxxxxxxxxxxxxxxxxxx'
    ]
    class SecondtestDownloaderMiddleware(object):
        #拦截正常请求
        def process_request(self, request, spider):
           #进行UA伪装,构建UA池
            request.headers['User-Agent'] = random.choice(user_agent_list)
    
            #代理,也可以构建自己的代理池
            request.meta['proxy'] = 'xxxxxxxxxxxx'
            return None
       #拦截所有的响应
        def process_response(self, request, response, spider):
           #拦截由于动态加载得到的不符合需求的响应对象
            #request表示请求对应的??对象
            #response表示所有的响应对象
            #spider是SecondSpider类(爬虫源文件对应的类)的实例化对象
            if request.url in spider.model_urls:
                #body 有selenium中的page_source返回
                browser = spider.browser
                browser.get(request.url)
                sleep(3)
                page_text = browser.page_source
                new_response = HtmlResponse(url=request.url,body=page_text,encoding ='utf-8',request=request)
                return new_response
            else:
                return response
            return response
       #拦截发生异常的请求对象
        def process_exception(self, request, exception, spider):
           #对异常的url请求进行修正
            return request     #重新发送

    源文件中进行修改

    #在爬虫类中定义一个属性model_urls =[]用来保存解析得到的li标签的url
    #
    from selenium import webdriver
    
    class xxx(scrapy.Spider):
        name = ''
        model_urls =[]
        browser = webdriver.Chrome(executable_path ='')
        #下面三个函数调用过程中可能出现请求传参的情况
        def parse(self,response):
            pass
        def parse_model(self,response):
            pass
        def parse_new_detail(self,response):
            content = response.xpath('xxxx//text()').extract()#解析所有的文本内容,跨标签,返回的是列表
            content = ''.jion(content)
            pass
      #该方法只会在程序结束时调用一次
      def closed(self,spider):
        self.browser.quit()
  3. 提升爬取效率
    • 增加并发: 32---->100
    • 降低日志等级
    • 不需要cookie的时候可以禁止,默认是开启. 设置为COOKIES_ENABLED = False为禁止
    • 禁止重试RETRY_ENABLED = False
    • DOWNLOAD_TIMEOUT = 1

原文地址:https://www.cnblogs.com/yimeisuren/p/12417116.html

时间: 2024-11-05 19:44:37

scrapy入门(二)请求传参和中间件的相关文章

【Scrapy框架之请求传参案例】 -- 2019-08-08 20:40:13

原文: http://106.13.73.98/__/141/ 在某些情况下,我们爬取的数据不在同一个页面. 例如下面的案例1,我们要爬取一个电影网站,电影的排名.名称.主演分在一页,而其它的信息分在二级子页面中.这时,我们就需要用到请求传参. 案例1:爬取97电影网中所有热门电影的详细信息 97电影网热门电影URL:http://www.55xia.com/movie/hotest/ 第一步,爬虫文件: # -*- coding: utf-8 -*- import scrapy from Te

scrapy框架之日志等级和请求传参

一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志信息的种类: ERROR : 一般错误 WARNING : 警告 INFO : 一般的信息 DEBUG : 调试信息 默认的显示级别是DEBUG - 设置日志信息指定输出: 在settings.py配置文件中,加入LOG_LEVEL = ‘指定日志信息种类’即可.LOG_FILE = 'log.txt'则表示将日志信息写入到指定文件中进行

日志等级与请求传参

日志等级: ERROR : 一般错误 WARNING : 警告 INFO : 一般的信息 DEBUG : 调试信息 默认的显示级别是DEBUG 可以在配置文件中settings中进行日志信息的指定输出:#指定日志信息的输出#LOG_LEVEL = 'DEBUG' #将日志信息写入到文件中进行存储LOG_FILE = 'log.txt' 二.请求传参 - 在某些情况下,我们爬取的数据不在同一个页面中,例如,我们爬取一个电影网站,电影的名称,评分在一级页面,而要爬取的其他电影详情在其二级子页面中.这

爬虫之post请求与请求传参

一.POST请求 class Postspider(scripy.Spider): name = "post" # allowed_domains = ["www.xxx.com"] start_urls = ["https.//fanyi.baidu.com/sug"] def start_requests(self): data = { "kw": "dog" } for url in self.sta

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

爬虫scrapy组件 请求传参,post请求,中间件

post请求 在scrapy组件使用post请求需要调用 def start_requests(self): 进行传参再回到 yield scrapy.FormRequest(url=url,formdata=data,callback=self.parse)进行post请求 其中FormRequest()为post 请求方式 import scrapy class PostSpider(scrapy.Spider): name = 'post' # allowed_domains = ['ww

python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件

# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' 一丶scrapy的图片数据爬取(流数据的爬取) ? scrapy中封装好了一个管道类(ImagesPipeline),基于该管道类可以实现图片资源的请求和持久化存储 编码流程: 爬虫文件中解析出图片的地址 将

scrapy框架的日志等级和请求传参, 优化效率

目录 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 请求传参 如何提高scripy的爬取效率 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. 日志信息的种类: ERROR : 一般错误 WARNING : 警告 INFO : 一般的信息 DEBUG : 调试信息 设置日志信息指定输出: 在settings.py配置文件中,加

scrapy请求传参,提高爬取效率,fake-useragent

scrapy请求传参 """ # 1 传参 :yield Request(url,callback=self.parser_detail,meta={'item':item}) # 2 取参:response.meta.get('item') """ 提高爬取效率的方式 """ - 在配置文件中进行相关的配置即可:(默认还有一套setting) #1 增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增