2011-12-19 22 views
9

Her URL'nin sonunda sorgu dizesine rastgele değerler ekleyen bir siteyi taramak için scrapy kullanıyorum. Bu, taramayı sonsuz bir döngü haline getiriyor.Bir sorguyu bir url'den nasıl kaldırırım?

URL'lerin sorgu dizesi bölümünü göz ardı etmek için nasıl scrapy yaparım?

cevap

20

urllib.urlparse Bkz

Örnek kod:

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

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

Örnek çıktı: w3lib.url modülünde bir fonksiyonu url_query_cleaner vardır

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

Bu şudur: 'urllib.parse urlparse'den import? –

+0

@RyanCady yes urllib.parse urlparse'dan ithalat için benim için çalıştı. – nipunasudha

6

Bazı kodları sağlayın, size yardımcı olabiliriz.

Eğer SgmlLinkExtractor ile CrawlSpider ve Rule 's kullanıyorsanız, SgmlLinkExtractor yapıcısının proccess_value parametresine özel işlev sağlar. 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

Hem birinci hem de ikinci yanıtlanmış problemlerimi çözerim. Her iki cevabın doğru olduğunu nasıl işaretleyebileceğimi bilmiyorum –

0

için

Bkz dokümantasyon, BaseSpider kullanarak yeni bir istek veren önce urlparse kullanarak URL sorgu bölümünden manuel rastgele değerleri kaldırmak ediyorsanız:

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

izin bağımsız değişkenler, sadece bir listesini tutmak URL'ler temizlemek için (scrapy kendisi tarafından kullanılan).

İlgili konular