2015-12-03 2 views
1

Люди, я пытался отказаться от нескольких данных с моих сайтов. Я использую python scrapy.Python Scrapy login login spider issue

Однако после прохождения документации все выглядит хорошо, когда я пытаюсь с этим HTML форму на моем сайте:

<form action="http://mywebsite.com/login/process" method="post"> 
    <div class="body bg-gray"> 
     <div class="form-group"> 
      <input type="text" name="userid" class="form-control" placeholder="User ID" autocomplete="off"> 
     </div> 
     <div class="form-group"> 
      <input type="password" name="password" class="form-control" placeholder="Password"> 
     </div> 
    </div> 
    <div class="footer">                
     <button type="submit" name="tempLoginProcess" value="" class="btn bg-olive btn-block">Sign me in</button> 
    </div> 
</form> 

Для этого я использую ниже ПИТОН Scrapy код:

import scrapy 
from scrapy.selector import Selector 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http import FormRequest, Request 

class LoginSpider(scrapy.Spider): 
    name = 'mywebsite.com' 
    start_urls = ['http://mywebsite.com/login'] 

    def parse(self, response): 
     return scrapy.FormRequest.from_response(
      response, 
      formdata = { 
       'userid': 'admin', 
       'password': 'admin', 
      }, 
      callback = self.after_login 
     ) 

    def after_login(self, response): #check login succeed before going on 
     dat = self.log(response.body) 
     return dat 
  • Здесь выше все работает нормально, и результат идет, как ожидалось.

ТЕПЕРЬ ПРОБЛЕМА:

Я снова пытаюсь войти в какой-то другой причине моего другого сайта, это форма выглядит ниже (что является довольно сложным):

<form accept-charset="UTF-8" action="https://stackoverflow.com/users/sign_in" html="{:onsubmit=>&quot;if($(this).valid()) $('input[type=\&quot;submit\&quot;]').attr('disabled','disabled');&quot;}" method="post"> 
    <div style="margin:0;padding:0;display:inline"> 
     <input name="utf8" type="hidden" value="✓"> 
     <input name="authenticity_token" type="hidden" value="Luvho/8odzEsVYhteyYtkwUhN0whT6nlFj4W4wth//s="> 
    </div> 

    <div align="center" class="alert-alert" style="margin-left: 10px;font-size:12px;color:red;">Email or password is incorrect. Please try again or click on Forgot Password</div> 

    <div class="col-md-12 signupemail"> 
     <input id="user_email" name="user[email]" placeholder="Email" size="30" type="email"> 
    </div> 
    <div class="col-md-12 signuppassword"> 
     <input id="user_password" name="user[password]" placeholder="Password" size="30" type="password"> 
    </div> 

    <div class="col-md-12 signupsubmit"> 
     <button type="submit" class="btn" id="">Submit</button> 
    </div> 

Эта форма находится в ColorBox/ligtbox

Теперь, когда я пытаюсь это так:

import scrapy 
from scrapy.selector import Selector 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http import FormRequest, Request 

class LoginSpider(scrapy.Spider): 
    name = 'my2website.com' 
    start_urls = ['http://www.my2website.com/users/sign_in'] 

    def parse(self, response): 
     return scrapy.FormRequest.from_response(
      response, 
      formdata = { 
       'user': { 
        'email': '[email protected]', 
        'password': '[email protected]' 
       } 
      }, 
      callback = self.after_login 
     ) 

    def after_login(self, response): #check login succeed before going on 
     dat = self.log(response.body) 
     return dat 

Это не будет на следующей странице, и до сих пор печатает знак только на странице. Что определенно означает, что этот знак не удалось. Можете ли вы, ребята, проверить и помочь мне понять, что случилось.

Я получаю это как конечный результат:

2015-12-04 03:02:21 [scrapy] INFO: Enabled item pipelines: 
2015-12-04 03:02:21 [scrapy] INFO: Spider opened 
2015-12-04 03:02:21 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
2015-12-04 03:02:21 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2015-12-04 03:02:23 [scrapy] DEBUG: Crawled (200) <GET http://www.my2website.com/users/sign_in> (referer: None) 
2015-12-04 03:02:26 [scrapy] DEBUG: Crawled (200) <GET http://www.my2website.com/search_terms/search_for_user?utf8=%E2%9C%93&term=&commit=&user=password&user=email> (referer: http://www.my2website.com/users/sign_in) 
2015-12-04 03:02:26 [scrapy] INFO: Closing spider (finished) 
2015-12-04 03:02:26 [scrapy] INFO: Dumping Scrapy stats: 
{'downloader/request_bytes': 899, 
'downloader/request_count': 2, 
'downloader/request_method_count/GET': 2, 
'downloader/response_bytes': 40537, 
'downloader/response_count': 2, 
'downloader/response_status_count/200': 2, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2015, 12, 3, 21, 32, 26, 841202), 
'log_count/DEBUG': 4, 
'log_count/INFO': 7, 
'request_depth_max': 1, 
'response_received_count': 2, 
'scheduler/dequeued': 2, 
'scheduler/dequeued/memory': 2, 
'scheduler/enqueued': 2, 
'scheduler/enqueued/memory': 2, 
'start_time': datetime.datetime(2015, 12, 3, 21, 32, 21, 846934)} 

Позвольте мне знать, если требуется какая-либо дополнительная информация.

JUST FYI Я новичок в слому и Scrapy

** ЗДЕСЬ это сайт, который я не могу отказаться от ** ORIGINAL WEBSITE LINK

ответ

3

Вы должны передать значение поля authenticity_token в login POST, это мера безопасности. Он называется Synchronizer Token, чтобы предотвратить атаки CSRF, read here для получения дополнительной информации по этому вопросу.

Так ваша функция разбора должна быть:

def parse(self, response): 
    # parse the security token 
    token = response.css('input[name=authenticity_token]::attr(value)').extract_first() 

    return scrapy.FormRequest.from_response(
     response, 
     formdata = { 
      'user': { 
       'email': '[email protected]', 
       'password': '[email protected]' 
       'authenticity_token': token 
      } 
     }, 
     callback = self.after_login 
    ) 

Надеется, что это работает.