2016-12-01 2 views
0

Я новичок в Scrapy и пытается наскрести некоторые данные из fandromeda.com сайта, но мне нужно, чтобы проверить подлинность первых, прежде чем я могу начать соскоб необходимую информацию, которая на следующий URLне удалось проверить подлинность 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-01 10:53:44 [SCRAPY] DEBUG: просканированных (200) https://fandromeda.com/user/signin?handle= & имя пользователя = хххх & пароль = хххх> (реферер: https://fandromeda.com/user/signin)

Я пытался использовать метод аргумент в ответ от заставить Scrapy использовать метод POST

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

Теперь SCRAPY делает запрос на почту, но есть разница в результатах. Может ли кто-нибудь указать мне в правильном направлении, что нужно сделать?

ответ

1

Этот сайт использует множество AJAX вызовов для выполнения операций, они используют AJAX для входа пользователя.

И вы использовали неправильный URL для входа на сайт.

Вот что я написал код для входа на этот сайт, его 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 вы можете просто скачать и запустить его ...

Вы должны увидеть Firebug, чтобы увидеть AJAX звонки они используют ... например, чтобы загрузить профиль пользователя, они посылают запрос GET с помощью AJAX для этого URL 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 URL для загрузки данных результатов – Umair

+0

И как только вы вошли в систему с помощью scrapy, сеанс создается, и файлы cookie автоматически обновляются с помощью scrapy, вам не нужно входить в систему перед посещением каждого URL-адреса. – Umair

0

Их страница входа в систему принимает JSON не простую форму со значениями.

вместо делать formdata=form_data использовать formdata=json.dumps(form_data)

+0

Я получаю следующую ошибку, когда я использую этот параметр «ValueError: formdata должен быть dict или iterable o f tuples " – Neel

+0

См. мой новый ответ ,,, Я создал полностью рабочий код для вас – Umair