Извлечение данных с сайта аутентификации входа с помощью scrapy

Я пытаюсь сначала войти в систему, а затем извлечь данные из страниц, которые видны после входа в систему. мой паук-

import scrapy
from scrapy.selector import HtmlXPathSelector
from scrapy.http.request import Request
from scrapy.spiders import BaseSpider
from scrapy.http import FormRequest
from loginform import fill_login_form

class ElementSpider(scrapy.Spider):
    name = 'example'
    start_urls = ['https://github.com/login']

    def parse(self, response):
        return [FormRequest.from_response(response,
                    formdata={'login': 'myid', 'password': 'my password'},
                    callback=self.after_login)]

    def after_login(self, response):

        if "Incorrect username or password" in response.body:
            print "hey"
            self.log("Login failed", level=log.ERROR)
            return

        else:
            return Request(url="https://github.com/settings/emails",
                   callback=self.parse_data)


    def parse_data(self, response):
        email = response.xpath('//div[@class="boxed-group-inner"]/li[@class="clearfix css-truncate settings-email"]/span[@class="css-truncate-target"]/text()').extract()
        print email

Я ничего не получаю на выходе.
Есть ли ошибка в реализации ???

2 ответа

  1. Вы не создали экземпляр класса ElementSpider.
    Сначала необходимо создать экземпляр класса.

    Обратите
    внимание, что каждый класс должен иметь конструктор, поэтому рекомендуется реализовать __init__метод в своем классе.

    Вот как должен выглядеть код.

    import scrapy
    from scrapy.selector import HtmlXPathSelector
    from scrapy.http.request import Request
    from scrapy.spiders import BaseSpider
    from scrapy.http import FormRequest
    from loginform import fill_login_form
    
    class ElementSpider(scrapy.Spider):
        name = 'example'
        start_urls = ['https://github.com/login']
    
        def __init__(self, *args, **kwargs):
                    super(ElementSpider, self).__init__(*args, **kwargs)
    
        def parse(self, response):
            return [FormRequest.from_response(response,
                        formdata={'login': 'myid', 'password': 'my password'},
                        callback=self.after_login)]
    
        def after_login(self, response):
    
            if "Incorrect username or password" in response.body:
                print "hey"
                self.log("Login failed", level=log.ERROR)
                return
    
            else:
                return Request(url="https://github.com/settings/emails",
                       callback=self.parse_data)
    
    
        def parse_data(self, response):
            email = response.xpath('//*[@id="settings-emails"]/li/span[@class="css-truncate-target"]').extract()
            print email
    
    
    if __name__ == "__main__":
        spider = ElementSpider()
    
  2. Ошибка возникает в реализации, так как нет класса» boxed-group-inner » в github.com/settings/emails page.

    Для коррекции измените ответ.xpath к:

    ответ.xpath (‘//ul[@id=»settings-email»]/li[@class=»Box-row clearfix css-truncate settings-email»]/span[@class=»css-truncate-target»]/text ()’).извлекать()

    ИЛИ

    В этом контексте можно напрямую использовать конечный узел дерева html как:

    ответ.xpath (‘//span[@class=»css-truncate-target»]/text ()’).извлекать()