私は、各URLの終わりにクエリ文字列にランダムな値を追加しているようなサイトをクロールするためにscrapyを使用しています。これはクロールを一種の無限ループに変えています。URLからクエリを削除するにはどうすればよいですか?
URLのクエリ文字列部分を無視するように私はどのようにして治療を行いますか?
私は、各URLの終わりにクエリ文字列にランダムな値を追加しているようなサイトをクロールするためにscrapyを使用しています。これはクロールを一種の無限ループに変えています。URLからクエリを削除するにはどうすればよいですか?
URLのクエリ文字列部分を無視するように私はどのようにして治療を行いますか?
urllib.urlparseを参照してください。
例コード:
from urlparse import urlparse
o = urlparse('http://url.something.com/bla.html?querystring=stuff')
url_without_query_string = o.scheme + "://" + o.netloc + o.path
出力例:w3lib.url
モジュール内の関数url_query_cleaner
あり
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
>>>
いくつかのコードを入力してください。
あなたはSgmlLinkExtractor
でCrawlSpider
とRule
年代を使用している場合は、SgmlLinkExtractor
コンストラクタのパラメータproccess_value
にカスタム機能を提供します。 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,
)
)
第1と第2の両方の回答を組み合わせてみると、私の問題は解決するようです。私は両方の答えをどのようにマークすることができないのでしょうか。 –
ため
参照ドキュメントあなたは、BaseSpiderを使用して新しい要求をもたらす前に、urlparseを使用してURLのクエリ部分から手動でランダムな値を削除している場合:
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)
許可された引数のリストのみを保持するURLをきれいにする(scrapy自体によって使用されます)。
'from urllib.parse import urlparse'? –
@RyanCadyはい 'urllib.parseからインポートurlparse'が私のために働いた。 – nipunasudha