这些陈述有什么作用?

时间:2013-12-02 19:24:57

标签: python scrapy

我正在思考Scrapy的请求/响应方法。 有人可以解释下面的陈述(请求部分)实际上做了什么吗?:

    def get_url():
        url = raw_input('Enter the url of your website (including the http)')
        return url      
    start_urls = str(get_url())
    request= Request(start_urls)
    depth= request.meta['depth']

感谢

1 个答案:

答案 0 :(得分:1)

当你说“我正在思考Scrapy的请求/响应方法”时,我觉得你有点困惑。 RequestResponse是类,而不是方法。

而且,虽然这些类当然是方法,但您不会询问其中任何一个,只需询问其中一个数据属性meta

或者,如果您的意思是HTTP意义上的方法,那么Request默认为GET,但您可以使用method=参数指定另一个方法;还有什么需要知道的?


正如Request的文档所说:

  

Request对象表示HTTP请求,该请求通常在Spider中生成并由Downloader执行,从而生成Response

换句话说,您通常不想自己创建一个。您为Spider提供了一个开头的网址列表,它为列表中的每个网址以及它在抓取时发现的每个其他网址生成Request

您有时可能需要查看Request一起使用的Response。您可能偶尔需要在复杂Request自定义 Spider s的创建。但你很少需要手动制作它们。


与此同时,你似乎对自己的命名感到困惑。你有一个名为start_urls的变量,但它不是一个URL列表,它只是一个URL。如果您以正常方式将其实际用作start_urls,则将其视为单个字符列表。但幸运的是,你不是那样做的;您将start_urls作为url参数传递给Request对象 - 并且由于它恰好只是一个网址,您的两个混淆会被取消,并且您创建了一个有效的{{ 1}}对象。

可以然后手动将此Request对象提供给Request以获取Downloader个对象。但是没有充分的理由这样做。如果您想手动下载文件而不是抓取它们,只需使用stdlib模块urllib2 / urllib.request,或专门设计用于手动下载的第三方库,如Response,不是一个蜘蛛图书馆。


与此同时,requests只返回depth= request.meta['depth']。正如meta文档解释的那样,它只是一个字典,对于新的KeyError是空的(除非你将Request参数传递给构造函数,而你没有),并且:

  

...通常由不同的Scrapy组件(扩展,中间件等)填充。因此,此dict中包含的数据取决于您启用的扩展名。

由于您在创建后实际上没有对meta=执行任何操作,因此您启用的扩展名无关紧要;它会变空。