Scrapy在解析中获取请求URL

57

我该如何在Scrapy的parse()函数中获取请求的URL? 我有很多在start_urls中的URL,其中一些会将我的爬虫重定向到主页,导致我得到一个空项目。因此,我需要类似于item['start_url'] = request.url这样的东西来存储这些URL。我正在使用BaseSpider。


这个方法有效吗? - NKelner
在爬取过程中,您可以访问requested_url而不是将其存储在一旁,请参阅我的答案。 - Rohan Khude
5个回答

110

传递给parse()函数的“response”变量具有您想要的信息。您不需要覆盖任何内容。

例如。(已编辑)

def parse(self, response):
    print "URL: " + response.request.url

11
但那不是请求的URL,而是响应的URL。Scrapy中间件处理重定向,因此您可能会获得一个不同的URL。 - gusridd
6
回应.请求.网址 - Mayank Jaiswal
2
如果URL有重定向,则会提供重定向的URL而不是提供的URL。 - Rohan Khude

18

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

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

11

使用以下方法,

不是将请求的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_urlsRequest.meta键中找到。

希望这能帮助你。


我相信你所需要的只是:redirect_urls = response.meta.get("redirect_urls") - Jack
1
这应该是被接受的答案。 - Xoel

7
你需要重写BaseSpider的make_requests_from_url(url)function来为项目分配start_url,然后使用Request.metaspecial 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

希望有所帮助。

3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接