scrapy通过手动请求传参来实现全站深度爬取

18 篇文章 0 订阅
10 篇文章 0 订阅

- 基于Spider父类进行全站数据的爬取
    - 全站数据的爬取:将所有页码对应的页面数据进行爬取
    - 手动请求的发送(get):
        yield scrapy.Request(url,callback)
    - 对yield的总结:
        - 向管道提交item的时候:yield item
        - 手动请求发送:yield scrapy.Request(url,callback)
    - 手动发起post请求:
        yield scrapy.FormRequest(url,formdata,callback)      formdata是一个字典表示的是请求参数

- scrapy的请求传参
    - 作用:实现深度爬取。
    - 使用场景:如果使用scrapy爬取的数据没有存在同一张页面中
    - 传递item:yield scrapy.Request(url,callback,meta)
    - 接收item:response.meta

# -*- coding: utf-8 -*-
import scrapy
from MovieAll.items import MovieallItem

class MovieSpider(scrapy.Spider):
    name = 'movie'
    # allowed_domains = ['www.xx.com']
    start_urls = ['https://www.4567tv.tv/index.php/vod/show/class/喜剧/id/6/page/1.html']
    url = 'https://www.4567tv.tv/index.php/vod/show/class/喜剧/id/1/page/%d.html'
    page = 1
    def parse(self, response):
        print('正在爬取第%d页的数据......' % self.page)
        li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
        for li in li_list:
            item = MovieallItem()
            name = li.xpath('./div/a/@title').extract_first()
            item['name'] = name
            detail_url = 'https://www.4567tv.tv'+li.xpath('./div/a/@href').extract_first()
            print('detail_url',detail_url)
            #可以对详情页的url进行手动请求的发送
            #请求传参:让Request将一个数据值(字典)传递给回调函数
            yield scrapy.Request(detail_url, callback=self.parse_detail, meta={'item': item})

        if self.page < 3:
            self.page += 1
            print('!!!!!!!!!!!!!!!!!!!!!!!!')
            new_url = format(self.url % self.page)
            yield scrapy.Request(new_url, callback=self.parse)

    def parse_detail(self, response):
        item = response.meta['item']
        desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
        item['desc'] = desc
        
        # 如果要继续深入爬取 就在这里继续让Request将一个数据值(字典)传递给新的回调函数
        # yield scrapy.Request(detail_url, callback=self.parse_detail, meta={'item': item})
        # 然后把本方法里面的yield item写到新的回调函数里面
        
        yield item

 

 

 

ps: 可以提升scrapy爬取数据的效率的方法
    - 在配置文件中进行相关的配置即可:
        增加并发:
            默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。

        降低日志级别:
            在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘INFO’

        禁止cookie:
            如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False

        禁止重试:
            对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False

        减少下载超时:
            如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值