我目前正在开发一个刮刀项目,这对于确保每个请求得到妥善处理非常重要,即记录错误或保存成功结果.我已经实现了基本的蜘蛛,我现在可以成功处理99%的请求,但是我可能会遇到像captcha,50x,30x,甚至结果中没有足够字段的错误(然后我会尝试另一个网站到找到缺少的字段).
起初,我认为在解析回调中引发异常并在errback中处理所有异常更"合乎逻辑",这可以使代码更具可读性.但我试图发现errback只能捕获下载器模块中的错误,例如非200响应状态.如果我在回调中引发一个自我实现的ParseError,那么蜘蛛只会提升它并停止.
即使我必须直接在回调中处理解析请求,我也不知道如何在回调中立即以干净的方式重试请求.你知道,我可能必须包含一个不同的代理来发送另一个请求,或修改一些请求标头.
我承认我对scrapy相对较新,但我已经来回试了好几天但仍然无法让它工作......我已经检查过每一个问题而没有人匹配,提前感谢你的帮助.
更新:我意识到这可能是一个非常复杂的问题所以我试着在下面的伪代码中说明这个场景,希望这会有所帮助:
from scraper.myexceptions import *
def parseRound1(self, response):
.... some parsing routines ...
if something wrong happened:
# this causes the spider raises a SpiderException and stops
raise CaptchaError
...
if no enough fields scraped:
raise ParseError(task, "no enough fields")
else:
return items
def parseRound2(self, response):
...some other parsing routines...
def errHandler(self, failure):
# how to trap all the exceptions?
r = failure.trap()
# cannot trap ParseError here
if r == CaptchaError:
# how to enqueue …Run Code Online (Sandbox Code Playgroud) 我们有一个非常标准的Scrapy项目(Scrapy 0.24).
我想捕获特定的HTTP响应代码,例如200,500,502,503,504等.
像这样的东西:
class Spider(...):
def parse(...):
processes HTTP 200
def parse_500(...):
processes HTTP 500 errors
def parse_502(...):
processes HTTP 502 errors
...
Run Code Online (Sandbox Code Playgroud)
我们怎么做?
如何从蜘蛛回调中收集统计数据?
例
class MySpider(Spider):
name = "myspider"
start_urls = ["http://example.com"]
def parse(self, response):
stats.set_value('foo', 'bar')
Run Code Online (Sandbox Code Playgroud)
不知道一般import会stats提供什么或如何提供.
我有scrapy的问题.在请求失败(例如404,500)时,如何请求另一个替代请求?如两个链接可以获取价格信息,一个失败,自动请求另一个.
我正在研究一个scrapy项目,从一个需要认证的网站下载图像.一切正常,我可以下载图像.我需要的是暂停和恢复蜘蛛以在需要时抓取图像.所以我使用了scrapy手册中提到的任何内容,如下所示.运行蜘蛛时使用了下面提到的查询
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
Run Code Online (Sandbox Code Playgroud)
按CTRL + C中止发动机.要恢复使用相同的命令.
但是在恢复蜘蛛在几分钟内关闭后,它不会从它停止的地方恢复.
更新:
class SampleSpider(Spider):
name = "sample project"
allowed_domains = ["xyz.com"]
start_urls = (
'http://abcyz.com/',
)
def parse(self, response):
return FormRequest.from_response(response,
formname='Loginform',
formdata={'username': 'Name',
'password': '****'},
callback=self.after_login)
def after_login(self, response):
# check login succeed before going on
if "authentication error" in str(response.body).lower():
print "I am error"
return
else:
start_urls = ['..','..']
for url in start_urls:
yield Request(url=urls,callback=self.parse_phots,dont_filter=True)
def parse_photos(self,response):
**downloading image here**
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
这是我在暂停后运行蜘蛛时得到的日志
2014-05-13 15:40:31+0530 [scrapy] INFO: Scrapy 0.22.0 …Run Code Online (Sandbox Code Playgroud)