2011-12-19 12 views
9

Estoy usando scrapy para rastrear un sitio que parece agregar valores aleatorios a la cadena de consulta al final de cada URL. Esto está convirtiendo el rastreo en una especie de ciclo infinito.¿Cómo elimino una consulta de una url?

¿Cómo hago que scrapy descuide la parte de la cadena de consulta de las URL?

Respuesta

20

Ver urllib.urlparse

Código de ejemplo:

from urlparse import urlparse 
o = urlparse('http://url.something.com/bla.html?querystring=stuff') 

url_without_query_string = o.scheme + "://" + o.netloc + o.path 

Ejemplo de salida:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from urlparse import urlparse 
>>> o = urlparse('http://url.something.com/bla.html?querystring=stuff') 
>>> url_without_query_string = o.scheme + "://" + o.netloc + o.path 
>>> print url_without_query_string 
http://url.something.com/bla.html 
>>> 
+1

¿Debería ser esto: 'from urllib.parse import urlparse'? –

+0

@RyanCady yes 'from urllib.parse import urlparse' funcionó para mí. – nipunasudha

6

Proporcione un código para que podamos ayudarlo.

Si está utilizando CrawlSpider y Rule 's con SgmlLinkExtractor, proporcionan función personalizada para proccess_value parámetro de SgmlLinkExtractor constructor.

Véase la documentación para BaseSgmlLinkExtractor

def delete_random_garbage_from_url(url): 
    cleaned_url = ... # process url somehow 
    return cleaned_url 

Rule(
    SgmlLinkExtractor(
     # ... your allow, deny parameters, etc 
     process_value=delete_random_garbage_from_url, 
    ) 
) 
+0

Tanto la primera como la segunda respuesta combinados parecen resolver mi problema. No estoy seguro de cómo puedo marcar que ambas respuestas son correctas –

0

Si está utilizando BaseSpider, antes de ceder una nueva solicitud, eliminar valores aleatorios de forma manual desde la parte de consulta de la dirección URL utilizando urlparse:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    item_urls = hxs.select(".//a[@class='...']/@href").extract() 
    for item_url in item_urls: 
     # remove the bad part of the query part of the URL here 
     item_url = urlparse.urljoin(response.url, item_url) 
     self.log('Found item URL: %s' % item_url) 
     yield Request(item_url, callback = self.parse_item) 
10

Hay una función url_query_cleaner en w3lib.url módulo (utilizado por scrapy sí mismo) para limpiar las URL manteniendo sólo una lista de argumentos permitidos.

Cuestiones relacionadas