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