恢复爬网后无法再次登录。恢复scrapy后cookies不粘

Posted

技术标签:

【中文标题】恢复爬网后无法再次登录。恢复scrapy后cookies不粘【英文标题】:Cannot login again after resuming crawl. Cookies are not sticky after resuming scrapy 【发布时间】:2013-01-14 01:49:01 【问题描述】:

我有一个 CrawlSpider,代码如下。我通过 tsocks 使用 Tor。 当我启动我的蜘蛛时,一切正常。使用 init_request 我可以登录网站并使用粘性 cookie 进行爬网。

但是当我停止并恢复蜘蛛时出现问题。饼干变得不粘了。

我给你 Scrapy 的回应。

=======================INIT_REQUEST================
2013-01-30 03:03:58+0300 [my] INFO: Spider opened
2013-01-30 03:03:58+0300 [my] INFO: Resuming crawl (675 requests scheduled)
............ And here crawling began

所以... callback=self.login_url 在 def init_request 没有被触发!!!

我认为scrapy引擎不想在登录页面上再次发送请求。在恢复scrapy之前,我将login_page(我可以从站点上的每个页面登录)更改为restrict_xpaths中未包含的不同。

结果是 - 恢复后我无法登录并且之前的 cookie 丢失了。

有人有一些假设吗?

from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import htmlXPathSelector
from scrapy.contrib.loader import XPathItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose, Join, Identity
from beles_com_ua.items import Product
from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from scrapy.utils.markup import remove_entities
from django.utils.html import strip_tags
from datetime import datetime
from scrapy import log
import re
from scrapy.http import Request, FormRequest

class ProductLoader(XPathItemLoader):
    .... some code is here ...


class MySpider(CrawlSpider):
    name = 'my'
    login_page = 'http://test.com/index.php?section=6&type=12'

    allowed_domains = ['test.com']
    start_urls = [
        'http://test.com/index.php?section=142',
    ]
    rules = (
        Rule(SgmlLinkExtractor(allow=('.',),restrict_xpaths=('...my xpath...')),callback='parse_item', follow=True),
    )
    def start_requests(self):
        return self.init_request()

    def init_request(self):
        print '=======================INIT_REQUEST================'
        return [Request(self.login_page, callback=self.login_url)]


    def login_url(self, response):
        print '=======================LOGIN======================='
        """Generate a login request."""
        return FormRequest.from_response(response,
            formdata='login': 'mylogin', 'pswd': 'mypass',
            callback=self.after_login)

    def after_login(self, response):
        print '=======================AFTER_LOGIN ...======================='
        if "images/info_enter.png" in response.body:
               print "==============Bad times :(==============="
        else:
           print "=========Successfully logged in.========="
           for url in self.start_urls:
            yield self.make_requests_from_url(url)

    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)

        entry = hxs.select("//div[@class='price']/text()").extract()
        l = ProductLoader(Product(), hxs)
        if entry:
        name = hxs.select("//div[@class='header_box']/text()").extract()[0]
        l.add_value('name', name)
        ... some code is here ...
        return l.load_item()

【问题讨论】:

【参考方案1】:

init_request(self): 仅在您从 InitSpider 而非 CrawlSpider 子类化时可用

你需要像这样从 InitSpider 继承你的蜘蛛

class WorkingSpider(InitSpider):

    login_page = 'http://www.example.org/login.php'
    def init_request(self):
        #"""This function is called before crawling starts."""
        return Request(url=self.login_page, callback=self.login)

但是请记住,您不能将 initSpider 中的 Rules 定义为仅在 CrawlSpider 中可用,您需要手动提取链接

【讨论】:

我不知道为什么,但我的代码与 init_request 配合得很好。只有当我尝试恢复蜘蛛时它才会失败。 您的代码正在运行,因为当您启动爬虫时,您会手动调用start_urls 中的self.init_request(),当您仅启动一次爬虫时会调用它。因此,当您停止并恢复时,start_url 不会再次被调用,并且您的 init_request 不会被调用。使用您当前的代码,您可以使用任何名称而不是 init_request,因为 eu 正在手动调用所以名称无关紧要,但从自动调用它您需要从 init_spider 子类化 非常感谢您的最佳解释))

以上是关于恢复爬网后无法再次登录。恢复scrapy后cookies不粘的主要内容,如果未能解决你的问题,请参考以下文章

暂停和恢复自包含的scrapy脚本

ecmall数据库恢复后中文用户名登录不了

为啥片段恢复后再次调用onLoadFinished?

在某些任务杀手杀死应用程序后如何恢复android应用程序?

急求大神!!索尼z3恢复出厂设置后开机向导卡在谷歌登录界面怎么办?

Scrapy:努力实现爬网蜘蛛