我正在思考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']
感谢
答案 0 :(得分:1)
当你说“我正在思考Scrapy的请求/响应方法”时,我觉得你有点困惑。 Request
和Response
是类,而不是方法。
而且,虽然这些类当然是有方法,但您不会询问其中任何一个,只需询问其中一个数据属性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=
执行任何操作,因此您启用的扩展名无关紧要;它会变空。