我该如何在Scrapy的parse()
函数中获取请求的URL? 我有很多在start_urls
中的URL,其中一些会将我的爬虫重定向到主页,导致我得到一个空项目。因此,我需要类似于item['start_url'] = request.url
这样的东西来存储这些URL。我正在使用BaseSpider。
我该如何在Scrapy的parse()
函数中获取请求的URL? 我有很多在start_urls
中的URL,其中一些会将我的爬虫重定向到主页,导致我得到一个空项目。因此,我需要类似于item['start_url'] = request.url
这样的东西来存储这些URL。我正在使用BaseSpider。
传递给parse()函数的“response”变量具有您想要的信息。您不需要覆盖任何内容。
例如。(已编辑)
def parse(self, response):
print "URL: " + response.request.url
请求对象可以从响应对象中访问,因此您可以执行以下操作:
def parse(self, response):
item['start_url'] = response.request.url
使用以下方法,
不是将请求的URL存储在某个地方,而且scrapy处理的URL顺序与start_urls
中提供的顺序不同。
response.request.meta['redirect_urls']
此命令将给您提供重定向列表,例如['http://requested_url','https://redirected_url','https://final_redirected_url']
要访问上述列表中的第一个URL,您可以使用以下方法:
response.request.meta['redirect_urls'][0]
更多信息请参见 doc.scrapy.org,其中提到:
重定向中间件(RedirectMiddleware)
This middleware handles redirection of requests based on response status.
请求通过重定向时经过的 URL 可以在 redirect_urls
的Request.meta键中找到。
希望这能帮助你。
redirect_urls = response.meta.get("redirect_urls")
- Jackmake_requests_from_url(url)
function来为项目分配start_url,然后使用Request.meta
special keys将该项目传递给parse
函数。from scrapy.http import Request
# override method
def make_requests_from_url(self, url):
item = MyItem()
# assign url
item['start_url'] = url
request = Request(url, dont_filter=True)
# set the meta['item'] to use the item in the next call back
request.meta['item'] = item
return request
def parse(self, response):
# access and do something with the item in parse
item = response.meta['item']
item['other_url'] = response.url
return item
Python 3.5
Scrapy 1.5.0
from scrapy.http import Request
# override method
def start_requests(self):
for url in self.start_urls:
item = {'start_url': url}
request = Request(url, dont_filter=True)
# set the meta['item'] to use the item in the next call back
request.meta['item'] = item
yield request
# use meta variable
def parse(self, response):
url = response.meta['item']['start_url']
requested_url
而不是将其存储在一旁,请参阅我的答案。 - Rohan Khude