ValueError в scrapy __init__ arg - PullRequest
       8

ValueError в scrapy __init__ arg

0 голосов
/ 01 декабря 2018

Когда я пишу эту команду в cmd

кавычки скрапа -o -o item.csv -au = test_user_name -ap = test_passporw_name -a urls = http://books.toscrape.com/

Показывается

повышение ValueError ('Отсутствует схема в URL-адресе запроса:% s'% self._url) ValueError: Отсутствует схема в URL-адресе запроса: h

# -*- coding: utf-8 -*-
from scrapy.contrib.spiders.init import InitSpider
from scrapy.http import Request, FormRequest
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import Rule
from scrapy.utils.response import open_in_browser
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector


class QuotesSpider(InitSpider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
    login_page='http://quotes.toscrape.com/login'
    start_urls = ['']
    username=''
    password=''

    def __init__(self,u,p,urls):
        self.username=u
        self.password=p
        self.start_urls=urls




    def init_request(self):
        #"""This function is called before crawling starts."""
        return Request(url=self.login_page, callback=self.login)

    def login(self, response):
        csrf_token=response.xpath('//*[@name="csrf_token"]//@value').extract_first()
        return FormRequest.from_response(response,
                                         formdata={'csrf_token': csrf_token,
                                                   'username': self.username,
                                                   'password': self.password,
                                                   },
                                         callback=self.check_login_response)

    def check_login_response(self, response):
        # open_in_browser(response)
        #"""Check the response returned by a login request to see if we aresuccessfully logged in."""
        if "Logout" in response.body:
            self.log("\n\n\nSuccessfully logged in. Let's start crawling!\n\n\n")
            # Now the crawling can begin..

            return self.initialized() # ****THIS LINE FIXED THE LAST PROBLEM*****

        else:
            self.log("\n\n\nFailed, Bad times :(\n\n\n")
            # Something went wrong, we couldn't log in, so nothing happens.

    def parse(self, response):
        open_in_browser(response)

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

self.start_urls=urls делает start_urls строкой вместо списка.
Это делает каждый символ из этой строки интерпретируемым как URL.

Просто сделайте start_urls списком, и ваш коддолжно работать:

self.start_urls = [urls]

Кроме того, вам не нужно инициализировать ваши переменные фиктивными значениями или анализировать csrf_token самостоятельно (это будет сделано автоматически при использовании FormRequest.from_response())


Кстати, ваш код выглядит так, как будто он написан для довольно старой версии scrapy - большинство ваших операций импорта было перемещено, переименовано или устарело.
Возможно, вам следует обновить свой код, быстроперечитайте документы.

0 голосов
/ 01 декабря 2018

Вы должны использовать библиотеку loginform.

Попробуйте этот код

# -*- coding: utf-8 -*-
import scrapy
from loginform import fill_login_form


class QuotesSpiderSpider(scrapy.Spider):
    name = 'quotes_spider'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    login_url = 'http://quotes.toscrape.com/login'

    login_user = 'your-username'
    login_password = 'secret-password-here'

    def start_requests(self):
        yield scrapy.Request(self.login_url, self.parse_login)

    def parse_login(self, response):
        data, url, method = fill_login_form(response.url, response.body,self.login_user, self.login_password)
        return scrapy.FormRequest(url, formdata=dict(data),method=method, callback=self.start_crawl)

    def start_crawl(self, response):
        for url in self.start_urls:
            yield scrapy.Request(url)

    def parse(self, response):
        quotes = response.xpath("//div[@class='quote']//span[@class='text']/text()").extract()
        yield {'quotes': quotes}

Моя древовидная структура может помочь вам организовать файлы

tree .
.
├── scrapy.cfg
└── scrapy_spider
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   └── settings.cpython-36.pyc
    ├── settings.py
    └── spiders
        ├── example.py
        ├── __init__.py
        ├── __pycache__
        │   ├── example.cpython-36.pyc
        │   ├── __init__.cpython-36.pyc
        │   └── quotes_spider.cpython-36.pyc
        └── quotes_spider.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...