想写一个ip代理池,在下载中间件里写了一个迭代器,每次这个迭代器都会返回一个ip地址,然后我再在process_request里使用这个ip地址。但是我发现我每次运行我的爬虫都会给我返回三个值,也就是我请求一次网页process_request这个函数会运行三次,不明白为什么。。
def canshu(self):#数据库返回数据在这个函数
aa=["192.168.1.2","11.22.33","44,55,66"]
return aa
def order(self):#将返回数控按顺序输出Ss
aa=self.canshu()
for i in aa:
yield i
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
s.a=s.order()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def process_request(self, request, spider):
aa=self.a.__next__()
ua=random.choice(user_agent_list)
print("this time ua:",ua)
request.headers.setdefault('User-Agent',ua)
#request.meta["proxy"]="http://"+aa
print("这次使用ip为:",aa)
return None
看日志,发生了3次请求。你的spider启动后先请求了robots.txt,是因为你settings里的ROBOTSTXT_OBEY=True,接着请求了http://news.sina.com.cn/, 但是出现了302重定向https,所以请求https://news.sina.com.cn/,最后成功。每次请求都触发了你都中间件
感谢yuanshi的解答(源氏?)