Python 2.7 Scrapy获取解析中的请求url

Python 2.7 Scrapy获取解析中的请求url,python-2.7,scrapy,scrapyd,Python 2.7,Scrapy,Scrapyd,如何在Scrapy的parse()函数中获取请求url?我在start\u url中有很多URL,其中一些将我的爬行器重定向到主页,因此我有一个空项目。所以我需要像item['start\u url']=request.url这样的东西来存储这些url。我正在使用BaseSpider。您需要覆盖BaseSpider的从url(url)发出请求以将开始url分配给项目,然后使用请求.meta将该项目传递给解析函数 from scrapy.http import Request # ove

如何在Scrapy的
parse()
函数中获取请求url?我在
start\u url
中有很多URL,其中一些将我的爬行器重定向到主页,因此我有一个空项目。所以我需要像
item['start\u url']=request.url
这样的东西来存储这些url。我正在使用BaseSpider。

您需要覆盖BaseSpider的
从url(url)
发出请求以将开始url分配给项目,然后使用
请求.meta
将该项目传递给
解析
函数

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

希望能有所帮助。

传递给parse()的“response”变量包含您想要的信息。你不需要覆盖任何东西

例如(编辑)


请求对象可以从响应对象访问,因此您可以执行以下操作:

def parse(self, response):
    item['start_url'] = response.request.url

不是将请求的URL存储在某个地方,也不是按照
start\u URL
中提供的顺序进行处理

通过使用下面的

response.request.meta['redirect_urls']
将为您提供重定向事件列表,如
['http://requested_url','https://redirected_url','https://final_redirected_url']

要访问上面列表中的第一个URL,您可以使用

response.request.meta['redirect_urls'][0]

有关更多信息,请参见以下内容:

重定向中间件

This middleware handles redirection of requests based on response status.
请求经过的URL(重定向时)可以在
重定向\u URL
request.meta键中找到

希望这对您有所帮助

Python3.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']

这种方法有效吗?在抓取过程中,您可以访问
请求的\u url
,而不是将它们存储在一边,检查下面的“我的回答”,但这不是请求url,而是响应url。Scrapy的中间件处理重定向,因此您可以获得不同的url.response.request.url如果url有重定向,那么它会提供重定向的url而不是提供的url我相信您所需要的是:
redirect\u url=response.meta.get(“redirect\u url”)
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']