2016-02-13 84 views
2

我想从最近的比赛刮桥网站的一些结果。我已发布关于此here的上一个问题。感谢@alecxe,我得到了刮板登录,同时使用PhantomJS在页面上呈现一些JavaScript。传递cookies后续请求中CrawlSpider

我如何理解这个工作原理是,我登录时使用selenium,保存在cookie中的凭据,然后该cookie传递给普通CrawlSpider得到认证完成,从而绕过问题与InitSpider。这对于初始登录页面可以正常工作,但是一旦抓取工具转到由Rule定义的下一页,该网站就会将我踢出去。它只是再次登录页面。

为了解决这个问题,我想保存在一个全局变量的饼干和压倒一切的make_requests_from_url()到cookie传递给所有后续请求蜘蛛做。但它仍然返回登录页面的主体。

问:这到底是怎么回事呢?我从什么地方听说,一旦你通过cookie来start_requests()那么该cookie应该持续的CrawlSpider会话的其余部分。但显然不这样做。任何人都可以启发我,我可以看到Scrapy如何处理这个问题?

我的代码:

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) 

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

2016-02-13 09:31:04 [scrapy] INFO: Enabled item pipelines: 
[] 
2016-02-13 09:31:04 [scrapy] INFO: Spider opened 
2016-02-13 09:31:04 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 

[... bunch of Selenium messages ...] 

2016-02-13 09:31:13 [scrapy] DEBUG: Crawled (200) <GET http://webutil.bridgebase.com/v2/tarchive.php?m=h&h=acbl&d=ACBL&o=acbh> (referer: None) 

[... more Selenium messages ...] 

2016-02-13 09:31:16 [scrapy] DEBUG: Crawled (200) <GET http://www.bridgebase.com/myhands/hands.php?tourney=4796-1455303720-> (referer: http://webutil.bridgebase.com/v2/tarchive.php?m=h&h=acbl&d=ACBL&o=acbh) 
2016-02-13 09:31:17 [scrapy] INFO: Closing spider (finished) 
2016-02-13 09:31:17 [scrapy] INFO: Dumping Scrapy stats: 

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

回答

1

看起来你的正则表达式......你的心不是正确limitin的搜索只是一个...

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

“q若要DO:修复你的正则表达式...

它真的只是被允许检索算法进行比武特定ID ......,你也应该在你的链接规则slashe ...

正则表达式你有IT ...

"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! 

所以你看你做了什么有?

虽然我没有复制你的脚本看起来很干净,我...除了该正则表达式处理,这样制作精良的逻辑,但正则表达式缺少什么呢?大声笑林肯定这只是一个疏忽,所以我不会质疑你的技能......这样写的写得很好的代码,我必须相信你知道你的reg。

如果你需要与帮助,让我知道我猜,

-Scriptso

PS我真的只是认真对待终于在tothis comunity,情侣NEG票过去3年的跳水。如果你发现我有什么帮助的话,请给我一个赞成票吗?!大声笑

编辑!

因此,出于好奇,我正在运行你的脚本,它并不像我认为它在一开始看起来那么干净似乎是合乎逻辑的(我明白自己读过的明显错误),但是有一堆错误至于追溯错误日志使我初步认为,这是一个非常干净的执行,但事实是这是完全不正常的... ...第一

class BboSpider(scrapy.spiders.CrawlSpider): 

WHE定义你的蜘蛛类的一个或其他... scrapy.spider或CrawlSpider,或一个客户建设,但任何一种方式是一个派生的......或其他大声笑
取决于你选择什么... 使用爬行蜘蛛,你最终不得不在items.py中定义你的项目......你没有要求仅仅运行打印项目? Crawlerers ......虽然孤单不是一个真正的需要等,然后把事情做对项目逐项通过,如果你打算使用履带那么你的GoTa 每次你做的时间定义项目类

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

我建议开始您使用的scrapy项目(您可能已经)使用scrapy startproject arg。我现在真的做了180,并假设你复制并粘贴大部分这?其实它看起来像你一起砸2-3 LMAO,没事!我们都从某处开始,但努力学习的方式很好......效率很高......

对于你想要做的事情,你不必加入硒......已经是一个完全不同的野兽,取而代之的是更小的侏儒你的水平之前,你的Python技能(还有就是scrapys逻辑框架+模块的使用和认识水平之间的coralation如何蟒蛇作品..即时通讯不亲,但即时通讯的方式过去小白)

你应该probly使用? Id推荐简单的请求模块与ForumRequest选项...简单的登录一个你去...

使用硒是很酷,所有,但需要携带饼干实际上是它必须得到的硒是一个dawting的任务是它的一个重要的模块,尽管你应该通过一切手段来学习它,如果你想...你不必自杀... SOO! ,只是告诉我,学习一点点和peices的一半满意(也是生活吮吸,所有它的社会stigmatic部分...即时通讯这样的书呆子#facepalm)这是学习新的东西,但采取一步一步如果一般的经验法则......如果你的guna使用图书馆,模块,任何语言的扩展......知道在处理复杂的东西之前进行它的前后处理......

+0

看起来不错!会推荐一些语法编辑,但欢迎来到Stackoverflow,享受您的住宿:D –

+0

@ penne12 LMAO!谢谢?它只有2年才能欣赏所以我工作在我的英语 – scriptso

+0

@ penne12我没有看到任何参考堆栈溢出和谷歌翻译标签块通过一个职位....会很棒,可能让我不看iliterate – scriptso