scrapy __init__ arg 中的 ValueError

当我在 cmd 中编写此命令时


爬行报价 -o item.csv -au=test_user_name -ap=test_passporw_name -a urls= http://books.toscrape.com/


它显示


raise ValueError('Missing scheme in request url: %s' % self._url) ValueError: Missing scheme in request 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*****


守候你守候我
浏览 145回答 2
2回答

莫回无

self.start_urls=urls生成start_urls一个字符串而不是一个列表。这使得该字符串中的每个字符都被解释为一个 url。只需start_urls列出一个列表,您的代码应该可以工作:self.start_urls = [urls]此外,您不需要将变量初始化为虚拟值,也不需要自己解析 csrf_token(使用时会自动完成FormRequest.from_response())附带说明一下,您的代码看起来像是为相当旧的 scrapy 版本编写的 - 您的大部分导入已被移动、重命名或弃用。也许您应该通过快速重读文档来刷新代码。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python