web-dev-qa-db-fra.com

Scrapy get url ur request in parse

Comment puis-je obtenir l'URL de la demande dans la fonction parse() de Scrapy? J'ai beaucoup d'URL dans start_urls et certains redirigent mon araignée vers la page d'accueil et j'ai donc un élément vide. J'ai donc besoin de quelque chose comme item['start_url'] = request.url pour stocker ces URL. J'utilise le BaseSpider.

27
Goran

La variable 'response' transmise à parse () contient les informations que vous souhaitez. Vous ne devriez pas avoir besoin de remplacer quoi que ce soit.

par exemple. (ÉDITÉ)

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

L'objet de demande est accessible à partir de l'objet de réponse, vous pouvez donc effectuer les opérations suivantes:

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

Vous devez remplacer la make_requests_from_url(url)fonction de BaseSpider pour attribuer start_url à l'élément, puis utiliser le Request.metatouches spéciales pour passer cet élément à la fonction 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

J'espère que cela pourra aider.

6
NKelner

Au lieu de stocker les URL demandées quelque part et les URL traitées de manière inégale ne sont pas dans la même séquence que celle fournie dans start_urls.

En utilisant ci-dessous,

response.request.meta['redirect_urls']

vous donnera la liste des redirections qui se sont passées comme ['http://requested_url','https://redirected_url','https://final_redirected_url']

Pour accéder à la première URL de la liste ci-dessus, vous pouvez utiliser

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

Pour plus d'informations, voir doc.scrapy.org mentionné comme:

RedirectMiddleware

This middleware handles redirection of requests based on response status.

Les URL par lesquelles passe la requête (tout en étant redirigées) se trouvent dans le redirect_urls Clé Request.meta .

J'espère que cela vous aide

3
Rohan Khude

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']
1
Pleavă Sorin