Scrapy在解析时获取请求URL

Gor*_*ran 30 scrapy python-2.7 scrapyd

如何在Scrapy的parse()功能中获取请求URL ?我有很多网址start_urls,其中一些将我的蜘蛛重定向到主页,结果我有一个空项目.所以我需要item['start_url'] = request.url存储这些网址的东西.我正在使用BaseSpider.

Jag*_*agu 55

传递给parse()的'response'变量包含您想要的信息.你不应该覆盖任何东西.

例如.(编者)

def parse(self, response):
    print "URL: " + response.request.url
Run Code Online (Sandbox Code Playgroud)

  • 但这不是请求网址,而是响应网址.Scrapy的中间件处理重定向,因此您可以获得不同的URL. (6认同)
  • response.request.url (5认同)
  • 如果 url 有重定向,那么它会给出重定向的 url,而不是提供的 url (2认同)

gus*_*idd 15

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

def parse(self, response):
    item['start_url'] = response.request.url
Run Code Online (Sandbox Code Playgroud)


NKe*_*ner 6

您需要覆盖BaseSpider的make_requests_from_url(url) 函数以将start_url分配给项目,然后使用Request.meta 特殊键将该项目传递给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
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


Roh*_*ude 6

而不是将请求的 URL 存储在某处,并且抓取处理的 URL 的顺序与start_urls.

通过使用下面,

response.request.meta['redirect_urls']
Run Code Online (Sandbox Code Playgroud)

会给你重定向的列表,就像 ['http://requested_url','https://redirected_url','https://final_redirected_url']

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

response.request.meta['redirect_urls'][0]
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅doc.scrapy.org提到的:

重定向中间件

This middleware handles redirection of requests based on response status.
Run Code Online (Sandbox Code Playgroud)

请求经过(重定向时)的 URL 可以在redirect_urls Request.meta键中找到。

希望这对你有帮助