2016-12-01 64 views
0

我是新来scrapy并试图从fandromeda.com网站凑一些数据fandromeda但我需要先进行身份验证之前,我可以开始刮所需的数据,是在以下网址无法验证使用scrapy

https://fandromeda.com/v2/event/results

我试图用from_response方法,以尝试登录到该网站

import scrapy 
from scrapy.spiders import CrawlSpider 
from scrapy.http import Request, FormRequest 
from scrapy.selector import Selector 
from fandromeda.items import FandromedaItem 

class FandromedaC(CrawlSpider): 
    name = 'fandromeda_c' 
    allowed_domains = ['fandromeda.com'] 
    start_urls = ['https://fandromeda.com/user/signin'] 

    def parse(self, response): 

     sel = Selector(response) 
     sign_in = sel.xpath('//button[@type="submit"]/text()').extract() 

     if sign_in: 
      if sign_in[0] == "SIGN IN": 
       self.log("$$$$$$$$$$$$$$$$$$") 
       form_data = {'username': 'xxxx','password': 'xxxx' } 
       return scrapy.FormRequest.from_response(response,formdata=form_data,callback=self.parse_login_response) 

    def parse_login_response(self,response): 
     self.log("#####################") 
     self.log(response.status) 

我希望被重定向到主页,并得到响应的内容,但我得到的是登录页面再次。

我注意到scrapy正在取得请求,而不是默认情况下发布。 2016年12月1日10点53分44秒[scrapy] DEBUG:爬(200)https://fandromeda.com/user/signin?handle= &用户名= XXXX &密码= XXXX>(引荐:https://fandromeda.com/user/signin

我试图使用方法参数从响应迫使scrapy使用POST方法

scrapy.FormRequest.from_response(response,method="POST",formdata=form_data,callback=self.parse_login_response) 

现在scrapy使POST请求但在结果的差异。 有人可以指出我需要做什么的正确方向吗?

回答

1

该网站使用大量的AJAX调用来执行操作,他们使用AJAX来登录用户。

而您使用的是错误的网址登录网站。

这里是我写的代码登录到该网站,其100%的工作代码

# -*- coding: utf-8 -*- 
from scrapy.http import FormRequest 
from scrapy.http.request import Request 
from scrapy.selector import HtmlXPathSelector 
from scrapy.selector import Selector 
from scrapy.spiders import CrawlSpider 
from scrapy.utils.response import open_in_browser 

class FandromedaCSpider(CrawlSpider): 
    name = 'fandromeda_c' 
    allowed_domains = ['fandromeda.com'] 

    def start_requests(self): 

     form_data = {"username":"[email protected]","password":"[email protected]"} 
     yield FormRequest('https://fandromeda.com/user/logreg/login', callback=self.parse_login_response, formdata=form_data) 

    def parse_login_response(self,response): 
     open_in_browser(response) 

我也带动了整个项目到Github上这里https://github.com/mani619cash/fandromeda_login你可以下载并运行它...

你必须看到萤火虫,看AJAX调用他们正在使用...例如加载用户配置文件,他们通过AJAX发送GET请求,该网址https://fandromeda.com/user/profile/info.json

enter image description here

PS:

这里有个窍门......在浏览器始终禁用JS当你学习你想刮...的网站,因为,如果被显示在浏览器中的数据与JS禁用,那么它100%确定他们不使用AJAX或一些页面上的JS来操纵数据....并且如果你在JS被禁用后在浏览器中不需要你的数据,那么它肯定会使用AJAX或on- JS网页渲染/加载数据...使用此切换JS浏览器的https://chrome.google.com/webstore/detail/quick-javascript-switcher/geddoclleiomckbhadiaipdggiiccfje?hl=en

+0

非常感谢@Umair ..我会试试这个,让你知道结果并将其标记为答案。关于这个问题还有一个问题,是否可以扩展代码以对另一个页面进行额外的调用,例如“https://fandromeda.com/v2/event/results”。 Scrapy是否负责传递必要的参数,或者每次请求页面时都必须登录?只是不确定什么是正确的方式去随后的网页抓取。 – Neel

+0

正如我已经告诉你,他们在他们的网站上使用了太多的AJAX。 https://fandromeda.com/v2/event/results链接也使用AJAX ....参见[screesnhot(http://imgur.com/a/ySRnX)他们送AJAX到https:// fandromeda .com/v2/event/result_json加载结果数据的网址 – Umair

+0

一旦您使用scrapy登录,会话被创建并且cookie由scrapy自动维护,您在访问每个URL之前不必登录 – Umair

0

他们的登录页面接受JSON而不是带有值的简单表单。

而不是做formdata=form_data使用formdata=json.dumps(form_data)

+0

我得到以下错误,当我用这个“ValueError异常:FORMDATA应该是一个字典或迭代Ø f元组“ – Neel

+0

看到我的新答案,,,我已经为你创建了一个完整的工作代码 – Umair