Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

download失败,添加请求,cookie失效 #937

Closed
jason2015lxj opened this issue Jul 7, 2020 · 10 comments
Closed

download失败,添加请求,cookie失效 #937

jason2015lxj opened this issue Jul 7, 2020 · 10 comments

Comments

@jason2015lxj
Copy link

大佬你好,我现在有一个问题,就是目前我们的PageProcessor里面addTargetRequest是在download success成功情况下才能添加新的请求,假设失败了就会重试,但是如果一直重试失败到达最大次数后,就不能添加新的request了,我尝试在Spider启动时直接addRequests添加构建所有请求,但是这样Request的cookie header就写死了,会出现请求cookie失效,无法灵活更新cookie,这个情况该如何处理呢,能否支持在失败时也可以添加新的Request

@sutra
Copy link
Collaborator

sutra commented Jul 7, 2020

我来尝试理解一下你的问题,page2 request 依赖于 page1。

那么既然 page1 download 失败了,你要怎么初始化 page 2 request(cookie 等)。

@sutra sutra added the question label Jul 7, 2020
@jason2015lxj
Copy link
Author

page1和page2没有依赖关系,所有的请求cookie都是一样的,我是一开始直接把所有request构建好,在Spider启动时addRequests了,这个时候时模拟登录获取的cookie放到每个request里面,但是这样跑着跑着,出现了cookie失效的情况(可能是cookie反爬?),然后我想把cookie设置有个失效时间,过了失效时间重新获取一下,放到request里,但是如果在Spider启动时构建的request运行中间过程中无法更新cookie

@sutra
Copy link
Collaborator

sutra commented Jul 7, 2020

Request#addCookie 会覆盖旧值吧。

而且你可以试试 Site 级别的 Cookie。

@jason2015lxj
Copy link
Author

对的,我一开始在site里面设置的cookie,使用Spider的addRequest方法,把所有Request添加了进去,但是想要在执行过程中更新request的cookie,这个时候因为是一开始就addRequest添加所有请求了,这个怎么更新cookie啊

@sutra
Copy link
Collaborator

sutra commented Jul 7, 2020

你的意思是,如何在 downloader 的 onError 方法里获得所有尚未 download 的 requests 吗?

另外,如果你不给 Request 设置 cookies,它会使用 Site 的 cookies。

@jason2015lxj
Copy link
Author

我是想在执行过程中,如果Request的cookie失效了,我给它重新更新一下cookie

@sutra
Copy link
Collaborator

sutra commented Jul 7, 2020

我不太能够理解你的问题。

Request#addCookie 可以更新 cookie。

你是不是想问,在什么地方可以获悉 cookie 已经失效了?

@jason2015lxj
Copy link
Author

Spider.create(dmpCateAtvPageProcessor)
.setDownloader(downloader)
.addPipeline(dmpCateAtvPipeline)
.addRequest(buildRequest(stack, getUrlFormat(), userName, password))
.thread(10).run();如上面的代码,如果这样写,就是一开始就构建好了所有Request添加进去,这个时候cookie已经都设置好了,但是在运行过程中,出现了cookie失效的问题,导致尚未爬取的Request都不能跑了,所以我想在执行过程中再添加Request,在processor中addTargetRequest(page),这样可以定时更新cookie,但是processor中只能是成功情况下才能添加新的Request

@sutra
Copy link
Collaborator

sutra commented Jul 7, 2020

也许我的猜测是对的,你需要的是 SpiderListener,它会在页面下载成功和失败后被调用。

Spider#setSpiderListeners 可以设置你自己实现的 SpiderListener

@sutra sutra closed this as completed Jul 19, 2020
@itliuxing
Copy link

不对呀,如果page2 和 page1 是一个域名内,不会出现cookie失效的情况。除非是你登录后,被别人给挤下来了,这样那不是爬虫能干预的

@sutra sutra added this to the WebMagic-0.7.4 milestone Oct 26, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants