scrapy的回调函数为什么不成功

1.scrapy的调试过程中,如果出现回调函数callback失败,可能的原因
  例如:

import json
import os

import scrapy
from images360.items import Images360Item
from urllib.parse import urlencode


class ImagesSpider(scrapy.Spider):
    name = 'images'
    allowed_domains = ['images.so.com']
    start_urls = ['http://images.so.com/']

    def start_requests(self):
        data = {'ch': 'wallpaper'}
        base_url = 'https://images.so.com/zjl?'
        for page in range(0, self.settings.get('MAX_PAGE')):
            data['sn'] = page * 30
            params = urlencode(data)  # 转化params
            url = base_url + params
            # print(url)
            # 回调函数
            yield scrapy.Request(url, callback=self.parse)  # url_next,callback=self.parse

    def parse(self, response):
        # 方法一
        # print(response.json())
        result = response.json()['list']  # json.loads表示就是将response.text数据转换成字典。
        # print(len(result))
        for i in result:
            title = i['title']
            img_url = i['qhimg_downurl']
            # print(title, img_url)
            yield scrapy.Request(img_url, meta={'title': title}, callback=self.Saveimg)

    def Saveimg(self, response):
        print(response)

在回调到Saveing是我得到的img_url的地址,不确定是否是allowed_domains 里面允许的地址url
,我们需要改变scrapy,Request里面的配置
在这里插入图片描述

调试的时候,发现回调函数 parse_detail 没有被调用,这可能就是被过滤掉了,查看 scrapy 的输出日志offsite/filtered 会显示过滤的数目。这个问题如何解决呢,查看手册发现(https://doc.scrapy.org/en/latest/faq.html?highlight=offsite%2Ffiltered)这个问题,这些日志信息都是由 scrapy 中的一个 middleware 抛出的,如果没有自定义,那么这个 middleware 就是默认的 Offsite Spider Middleware,它的目的就是过滤掉那些不在 allowed_domains 列表中的请求 requests。

**再次查看手册中关于 OffsiteMiddleware 的部分(https://doc.scrapy.org/en/latest/topics/spider-middleware.html#scrapy.spidermiddlewares.offsite.OffsiteMiddleware)
两种方法能够使 requests 不被过滤:

  1. 在 allowed_domains 中加入 url
  2. 在 scrapy.Request() 函数中将参数 dont_filter=True 设置为 True**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值