python-2.7 - docs - scrapy ruby
Scrapy obtener url solicitud en parse (5)
Debe anular la función make_requests_from_url(url)
de BaseSpider para asignar el start_url al elemento y luego usar las teclas especiales Request.meta
para pasar ese elemento a la función de 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
Espero que ayude.
¿Cómo puedo obtener la url de solicitud en la función parse()
Scrapy? Tengo muchas URL en start_urls
y algunas de ellas redirigen mi araña a la página de inicio y, como resultado, tengo un elemento vacío. Así que necesito algo como el item[''start_url''] = request.url
para almacenar estas URL. Estoy usando el BaseSpider.
En lugar de almacenar las URL solicitadas en algún lugar y también las URL procesadas de forma no procesada no están en la misma secuencia que se proporciona en start_urls
.
Usando abajo,
response.request.meta[''redirect_urls'']
le dará la lista de redireccionamiento que ocurrió como [''http://requested_url'',''https://redirected_url'',''https://final_redirected_url'']
Para acceder a la primera URL de la lista anterior, puede utilizar
response.request.meta[''redirect_urls''][0]
Para más información, vea doc.scrapy.org mencionado como:
RedirectMiddleware
This middleware handles redirection of requests based on response status.
Las direcciones URL por las que pasa la solicitud (mientras se redirige) se pueden encontrar en la clave Request.meta redirect_urls
.
Espero que esto te ayude
La variable de "respuesta" que se pasa a parse () tiene la información que desea. No deberías tener que anular nada.
p.ej. (EDITADO)
def parse(self, response):
print "URL: " + response.request.url
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'']
Se puede acceder al objeto de solicitud desde el objeto de respuesta, por lo tanto, puede hacer lo siguiente:
def parse(self, response):
item[''start_url''] = response.request.url