1

Я пытался сделать аутентифицированного паука. Я упомянул почти каждый пост, связанный с проверенным пауком Scrapy, я не мог найти ответа на вопрос. Я использовал следующий код:Scrapy Authenticated Spider получает внутреннюю ошибку сервера

import scrapy 

from scrapy.spider import BaseSpider 
from scrapy.selector import Selector 
from scrapy.http import FormRequest, Request 
import logging 
from PWC.items import PwcItem 


class PwcmoneySpider(scrapy.Spider): 
    name = "PWCMoney" 
    allowed_domains = ["pwcmoneytree.com"] 
    start_urls = (
     'https://www.pwcmoneytree.com/SingleEntry/singleComp?compName=Addicaid', 
    ) 

    def parse(self, response): 
     return [scrapy.FormRequest("https://www.pwcmoneytree.com/Account/Login", 
            formdata={'UserName': 'user', 'Password': 'pswd'}, 
            callback=self.after_login)] 

    def after_login(self, response): 
     if "authentication failed" in response.body: 
     self.log("Login failed", level=logging.ERROR) 
     return 
    # We've successfully authenticated, let's have some fun! 
    print("Login Successful!!") 
    return Request(url="https://www.pwcmoneytree.com/SingleEntry/singleComp?compName=Addicaid", 
       callback=self.parse_tastypage) 


    def parse_tastypage(self, response): 
     for sel in response.xpath('//div[@id="MainDivParallel"]'): 
             item = PwcItem() 
             item['name'] = sel.xpath('div[@id="CompDiv"]/h2/text()').extract() 
             item['location'] = sel.xpath('div[@id="CompDiv"]/div[@id="infoPane"]/div[@class="infoSlot"]/div/a/text()').extract() 
             item['region'] = sel.xpath('div[@id="CompDiv"]/div[@id="infoPane"]/div[@id="contactInfoDiv"]/div[1]/a[2]/text()').extract() 
             yield item 

И я получил следующий вывод:

Microsoft Windows [Version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

C:\Python27\PWC>scrapy crawl PWCMoney -o test.csv 
2016-04-29 11:37:35 [scrapy] INFO: Scrapy 1.0.5 started (bot: PWC) 
2016-04-29 11:37:35 [scrapy] INFO: Optional features available: ssl, http11 
2016-04-29 11:37:35 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'PW 
C.spiders', 'FEED_FORMAT': 'csv', 'SPIDER_MODULES': ['PWC.spiders'], 'FEED_URI': 
'test.csv', 'BOT_NAME': 'PWC'} 
2016-04-29 11:37:35 [scrapy] INFO: Enabled extensions: CloseSpider, FeedExporter 
, TelnetConsole, LogStats, CoreStats, SpiderState 
2016-04-29 11:37:36 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddl 
eware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultH 
eadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMidd 
leware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats 
2016-04-29 11:37:36 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddlewa 
re, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware 
2016-04-29 11:37:36 [scrapy] INFO: Enabled item pipelines: 
2016-04-29 11:37:36 [scrapy] INFO: Spider opened 
2016-04-29 11:37:36 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 i 
tems (at 0 items/min) 
2016-04-29 11:37:36 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023 
2016-04-29 11:37:37 [scrapy] DEBUG: Retrying <POST https://www.pwcmoneytree.com/ 
Account/Login> (failed 1 times): 500 Internal Server Error 
2016-04-29 11:37:38 [scrapy] DEBUG: Retrying <POST https://www.pwcmoneytree.com/ 
Account/Login> (failed 2 times): 500 Internal Server Error 
2016-04-29 11:37:38 [scrapy] DEBUG: Gave up retrying <POST https://www.pwcmoneyt 
ree.com/Account/Login> (failed 3 times): 500 Internal Server Error 
2016-04-29 11:37:38 [scrapy] DEBUG: Crawled (500) <POST https://www.pwcmoneytree 
.com/Account/Login> (referer: None) 
2016-04-29 11:37:38 [scrapy] DEBUG: Ignoring response <500 https://www.pwcmoneyt 
ree.com/Account/Login>: HTTP status code is not handled or not allowed 
2016-04-29 11:37:38 [scrapy] INFO: Closing spider (finished) 
2016-04-29 11:37:38 [scrapy] INFO: Dumping Scrapy stats: 
{'downloader/request_bytes': 954, 
'downloader/request_count': 3, 
'downloader/request_method_count/POST': 3, 
'downloader/response_bytes': 30177, 
'downloader/response_count': 3, 
'downloader/response_status_count/500': 3, 
'finish_reason': 'finished', 
'finish_time': datetime.datetime(2016, 4, 29, 6, 7, 38, 674000), 
'log_count/DEBUG': 6, 
'log_count/INFO': 7, 
'response_received_count': 1, 
'scheduler/dequeued': 3, 
'scheduler/dequeued/memory': 3, 
'scheduler/enqueued': 3, 
'scheduler/enqueued/memory': 3, 
'start_time': datetime.datetime(2016, 4, 29, 6, 7, 36, 193000)} 
2016-04-29 11:37:38 [scrapy] INFO: Spider closed (finished) 

Поскольку я новичок в Python и Scrapy, я не могу понять ошибку, я надеюсь, что кто-то здесь может помочь мне.

Итак, я изменил код, как это взятие Rejected «ы советы, показывая только измененная часть:

allowed_domains = ["pwcmoneytree.com"] 
    start_urls = (
     'https://www.pwcmoneytree.com/Account/Login', 
    ) 

    def start_requests(self): 
     return [scrapy.FormRequest.from_response("https://www.pwcmoneytree.com/Account/Login", 
            formdata={'UserName': 'user', 'Password': 'pswd'}, 
            callback=self.logged_in)] 

И получил следующее сообщение об ошибке:

C:\Python27\PWC>scrapy crawl PWCMoney -o test.csv 
2016-04-30 11:04:47 [scrapy] INFO: Scrapy 1.0.5 started (bot: PWC) 
2016-04-30 11:04:47 [scrapy] INFO: Optional features available: ssl, http11 
2016-04-30 11:04:47 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'PW 
C.spiders', 'FEED_FORMAT': 'csv', 'SPIDER_MODULES': ['PWC.spiders'], 'FEED_URI': 
'test.csv', 'BOT_NAME': 'PWC'} 
2016-04-30 11:04:50 [scrapy] INFO: Enabled extensions: CloseSpider, FeedExporter 
, TelnetConsole, LogStats, CoreStats, SpiderState 
2016-04-30 11:04:54 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddl 
eware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultH 
eadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMidd 
leware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats 
2016-04-30 11:04:54 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddlewa 
re, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware 
2016-04-30 11:04:54 [scrapy] INFO: Enabled item pipelines: 
Unhandled error in Deferred: 
2016-04-30 11:04:54 [twisted] CRITICAL: Unhandled error in Deferred: 


Traceback (most recent call last): 
    File "c:\python27\lib\site-packages\scrapy\cmdline.py", line 150, in _run_comm 
and 
    cmd.run(args, opts) 
    File "c:\python27\lib\site-packages\scrapy\commands\crawl.py", line 57, in run 

    self.crawler_process.crawl(spname, **opts.spargs) 
    File "c:\python27\lib\site-packages\scrapy\crawler.py", line 153, in crawl 
    d = crawler.crawl(*args, **kwargs) 
    File "c:\python27\lib\site-packages\twisted\internet\defer.py", line 1274, in 
unwindGenerator 
    return _inlineCallbacks(None, gen, Deferred()) 
--- <exception caught here> --- 
    File "c:\python27\lib\site-packages\twisted\internet\defer.py", line 1128, in 
_inlineCallbacks 
    result = g.send(result) 
    File "c:\python27\lib\site-packages\scrapy\crawler.py", line 72, in crawl 
    start_requests = iter(self.spider.start_requests()) 
    File "C:\Python27\PWC\PWC\spiders\PWCMoney.py", line 16, in start_requests 
    callback=self.logged_in)] 
    File "c:\python27\lib\site-packages\scrapy\http\request\form.py", line 36, in 
from_response 
    kwargs.setdefault('encoding', response.encoding) 
exceptions.AttributeError: 'str' object has no attribute 'encoding' 
2016-04-30 11:04:54 [twisted] CRITICAL: 

ответ

1

Как видно в журнале ошибок , это POST-запрос https://www.pwcmoneytree.com/Account/Login, который дает вам ошибку 500.

Я попытался сделать тот же запрос POST вручную, используя POSTman. Это дает код 500 ошибок и HTML-страницу, содержащую сообщение об ошибке:

The required anti-forgery cookie "__RequestVerificationToken" is not present.

Это является особенностью многих API, и веб-сайты используют для предотвращения CSRF атак. Если вы все еще хотите очистить сайт, вам нужно будет сначала зайти в форму для входа и получить правильное куки-сообщение перед входом в систему.

+0

Я попробую это и дам вам знать результат. – neenkart

+0

Это может показаться глупым, но я не смог найти куки, не могли бы вы мне помочь? – neenkart

+0

Если вы выполняете HTTP GET на 'https: // www.pwcmoneytree.com/Account/Login', один из заголовков HTTP будет называться« Cookie »и содержать необходимый файл cookie. – sahuk

0

Вы делаете свой гусеничный ход без каких-либо причин. Ваш первый запрос (начатый с start_urls) обрабатывается, а затем ответ отбрасывается. Очень редко есть причина сделать это (если не сделать сам запрос, это требование).

Вместо этого вы можете изменить start_urls на "https://www.pwcmoneytree.com/Account/Login", а также изменить scrapy.FormRequest(...) на scrapy.FormRequest.from_response(...). Вам также необходимо также изменить предоставленный URL-адрес на полученный ответ (и, возможно, определить желаемую форму).

Это избавит вас от ненужного запроса, выберет/предварительно заполнит другие токены проверки и очистит ваш код.

EDIT: Ниже приведен код, который вы должны использовать. Примечание: вы изменили self.after_login на self.logged_in, поэтому я оставил его как новое изменение.

... 
allowed_domains = ["pwcmoneytree.com"] 
start_urls = (
    'https://www.pwcmoneytree.com/Account/Login', 
) 

def parse(self, response): 
    return scrapy.FormRequest.from_response(response, 
           formdata={'UserName': 'user', 'Password': 'pswd'}, 
           callback=self.logged_in) 
... 
+0

Я использовал образец кода из Scrapy Documentation и сделал очень небольшую модификацию, такую ​​как веб-сайт, учетные данные и элемент. Во всяком случае, я постараюсь изменить его так, как вы упомянули, чтобы узнать результаты. – neenkart

+0

Я не смог опубликовать результат здесь, потому что он слишком длинный, поэтому, обновленный мой вопрос с подробностями, пожалуйста, посмотрите. – neenkart

+0

Теперь вы начинаете «start_requests» без всякой причины. Вы хотите оставить его таким, чтобы он делал запрос из кортежа 'start_urls'. Вы также пытаетесь использовать метод класса '.from_response' без ответа (который побеждает цель' .from_response'). См. Мое редактирование для получения дополнительной информации. – Rejected

Смежные вопросы