Перенаправление промежуточного программного обеспечения в scrapy не работает - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь реализовать вход в систему, используя python scrapy. Однако логин не работает. Я имел в виду приведенный ниже код

from scrapy.http import Request, FormRequest
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
# from scrapy.selector import HtmlXPathSelector
from scrapy.http import FormRequest
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.response import open_in_browser


class LoginSpider(CrawlSpider):
    name = 'loginspider'
    login_page = 'http://quotes.toscrape.com/login'
    start_urls = ['http://quotes.toscrape.com/login']
    username = 'foobar'
    password = 'foobar'

    def init_request(self):
        return Request(url=self.login_page, callback=self.start_requests)

    def start_requests(self):
        print("\n start_request is here \n")
        yield Request(
            url=self.login_page, callback=self.login, dont_filter=True)

    def login(self, response):
        print("\n Login is here! \n")
        token = response.xpath(
            '//*[@name="csrf_token"]/@value').extract_first()
        return FormRequest.from_response(
            response,
            formdata={
                'csrf_token': token,
                'password': 'foobar',
                'username': 'foobar'
            },
            callback=self.check_login_response)

    def check_login_response(self, response):
        open_in_browser(response)
        print("\n Check_login_response \n")
        if b"Learn" in response.body:
            print("Worked, logged in")
            #return self.parse_item
        else:
            print("Not logged in")
            return


process = CrawlerProcess()
process.crawl(LoginSpider)
process.start()

. Из приведенного выше кода вместо жесткого кодирования учетных данных я изменяю код, как показано ниже

 def fetch_form_data(self,response):
        if all(field in response.text for field in self.credentials['fields_in_response']):
            inputs =response.xpath('//form//input').extract()
            soup_dict={}
            for key,i in enumerate(inputs):
                soup = BeautifulSoup(i, 'html.parser')
                inp_type   =   soup.input['type'] if soup.input.has_attr('type') else None
                inp_value  =   soup.input['value'] if soup.input.has_attr('value')  else None
                inp_name   =   soup.input['name'] if soup.input.has_attr('name')  else None
                soup_dict[key]= {'name':inp_name,'value':inp_value,'type':inp_type}
            login_cred= self.credentials['login_details']
            form_data={}
            for key,value in soup_dict.items():
                if value['name'] != None and value['type'] == 'text':
                    form_data[value['name']]=login_cred['name']
                elif value['name'] != None and value['type'] == 'password':
                    form_data[value['name']]=login_cred['pwd']
                elif value['name'] != None and value['type'] == 'hidden':
                    form_data[value['name']]=value['value']
                else:
                    pass
            return form_data      

    def login(self, response):
        print ("\n Login is here! \n")
        formdata=self.fetch_form_data(response)         
        return FormRequest.from_response(response,
        formdata,
        callback=self.check_login_response)

Но теперь вход в систему не работает. Я думаю, что я что-то упускаю в этом. Может ли кто-нибудь предложить мне, что это такое

Одна вещь, которую я заметил, когда запускаю скрипт, enter image description here

Когда первый скрипт запускается, на самом деле есть Перенаправление происходит промежуточным ПО. enter image description here При замене на второй скрипт перенаправление не работает

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Изменить return FormRequest.from_response(response,formdata,callback=self.check_login_response) на return FormRequest.from_response(response, formdata=formdata, callback=self.check_login_response)

0 голосов
/ 21 апреля 2020

Функция login () находится внутри функции fetch_form_data () ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...