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 不被过滤:
- 在 allowed_domains 中加入 url
- 在 scrapy.Request() 函数中将参数 dont_filter=True 设置为 True**