将Cookie传递给CrawlSpider中的后续请求

时间:2016-02-13 14:50:51

标签: python python-3.x selenium scrapy

我试图抓住一个桥牌网站,以获得最近比赛的一些结果。我之前发布了有关此here的问题。感谢@alecxe,我在使用ENCLOSED在页面上渲染JavaScript时,已经让刮刀登录。

我理解这是有效的,我使用PhantomJS登录,将凭据保存在cookie中,然后将cookie传递给普通selenium以完成身份验证,从而绕过问题CrawlSpider。这适用于初始登录页面,但一旦爬虫进入InitSpider定义的下一页,该网站就会把我踢出去。它只是再次抓取登录页面。

为了解决这个问题,我尝试将cookie保存在全局变量中并覆盖Rule以将cookie传递给蜘蛛制作的所有后续请求。但它仍然返回登录页面的主体。

问题:这里发生了什么?我从某个地方听说,一旦你将cookie传递给make_requests_from_url(),那么cookie应该在start_requests()会话的剩余部分持续存在。但它显然不会这样做。任何人都可以告诉我在哪里可以看到Scrapy如何处理这个问题?

我的代码:

CrawlSpider

日志的准系统相关部分(现在)显示没什么太有趣的。如有必要,我可以提供更多细节。

import scrapy
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.http import Request, HtmlResponse

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class BboSpider(scrapy.spiders.CrawlSpider):
    name = "bbo"
    allowed_domains = ["bridgebase.com"]
    login_page = "http://www.bridgebase.com/myhands/myhands_login.php?t=%2Fmyhands%2Findex.php%3F" 

    def start_requests(self):
        global bbo_cookies

        driver = webdriver.PhantomJS()
        driver.get(self.login_page)    
        driver.find_element_by_id("username").send_keys("_____")
        driver.find_element_by_id("password").send_keys("_____")
        driver.find_element_by_name("submit").click()
        driver.save_screenshot("test.png")
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, "Click here for results of recent tournaments")))

        bbo_cookies = driver.get_cookies()
        driver.close()

        yield Request("http://webutil.bridgebase.com/v2/tarchive.php?m=h&h=acbl&d=ACBL&o=acbh", cookies=bbo_cookies)

    def make_requests_from_url(self, url):
        request = super(BboSpider, self).make_requests_from_url(url)
        request.cookies = bbo_cookies
        return request

    rules = [ 
            Rule(LinkExtractor(allow=r'tourney=4796-1455303720-'), callback='parse_item', follow=True),
            ]

    def parse_item(self, response):
        print(response.body)

显然,我对scrapy的工作原理并不了解。

1 个答案:

答案 0 :(得分:1)

看起来你的正则表达式是正确的......你只是将搜索限制在那个......

rules = [ 
'''
...allow=r'tourney=4796-1455303720-' 
'''
]

'#待办事项:修复你的正则表达式......

它实际上只是被允许搜索锦标赛的特定ID ...,你也应该在你的链接规则中加入slashe ......

REGEX,因为你......

"allow=r'tourney-id=123'
tourney-id=123 ... FOUND IT! MATCHES THE ASLLOW RULE;
tourney-id=456 ...- NOPE, NOT ALLOWED
tourney-id=789... NOPE! BOT ALLOWED... YOU DONT LET DO NUFIN!

所以你看到你在那里做了什么?

虽然我没有复制你的剧本对我来说看起来很干净...除了那个正则表达式的交易,这样做得好的逻辑但是正则表达式缺乏?大声笑我确定这只是一个疏忽,所以我不会质疑你的技能...这样写得很好的代码,我必须相信你知道你的注册。

如果您确实需要帮助,请告诉我,我猜,

-Scriptso

PS我真的只是认真地谈论最终在这个社区中潜水,在过去的3年里几乎没有投票。如果你发现我有任何帮助给我一个upvote yeh ?!洛尔

编辑!

因此,出于好奇,我正在运行你的脚本并且它不像我想的那样干净,起初看起来很合理(我自己读过这个明显的错误)但是跟踪有很多错误回到错误日志让我最初认为这是一个相当干净的执行但事实是它完全没有了......首先......

class BboSpider(scrapy.spiders.CrawlSpider):

你定义你的蜘蛛类它的一个或另一个... scrapy.spider,或CrawlSpider,或者一个客户构建,但无论哪种方式是衍生的....或另一个lol
取决于您的选择...... 使用抓取蜘蛛你最终必须在items.py中定义你的项目...你没有要求只运行打印的项目? 爬行者......虽然不是真正的需要其他然后做正确的项目逐项,如果你要使用爬虫然后你得到了 定义项目类

YourItems(item):
item1 = Field()
etc etc...

我建议你每次开始使用scrapy项目(你可能已经使用过scrapy startproject arg)。我现在真的做了180并假设你复制并粘贴了大部分???实际上有点像你一起砸碎了2-3个LMAO,它没事!我们都从某个地方开始,但是学习艰难的方式很好......在高效......

对于你想要做的事情,你不必加入硒...已经完全不同的野兽,而是在升级你的python技能之前采取较小的runts(scrapys逻辑框架+模块之间有一个coralation使用和对python如何工作的理解水平..我不是亲,但我过去的菜鸟)

你应该使用什么? 我建议简单地使用ForumRequest选项请求模块...简单登录你去...

使用Selenium是很酷的,除了需要携带饼干之外,实际上它必须得到硒的悬念,这是一个令人担忧的任务,因为它是一个prety重型模块,尽管如果你想要你应该学习它。 ......你不必自杀...... SOO!......

如果你需要帮助,我会在这里,只是给我留言,学习点点滴滴的满足感(也是生活中的吸吮,所有它的社会耻辱的一部分......我是这样一个书呆子#facepalm)这就是学习新的东西,但一步一步,如果一般的经验法则...如果你的guna使用图书馆,模块,任何语言的扩展......在处理复杂的东西之前知道它的来龙去脉......