Scrapyのparse()
関数でリクエストURLを取得するにはどうすればよいですか? start_urls
に多くのURLがあり、それらのいくつかはスパイダーをホームページにリダイレクトします。その結果、空のアイテムがあります。これらのURLを保存するには、item['start_url'] = request.url
のようなものが必要です。 BaseSpiderを使用しています。
Parse()に渡される「response」変数には、必要な情報が含まれています。何もオーバーライドする必要はありません。
例えば。 (編集済み)
def parse(self, response):
print "URL: " + response.request.url
要求オブジェクトは応答オブジェクトからアクセスできるため、次のことができます。
def parse(self, response):
item['start_url'] = response.request.url
BaseSpiderのmake_requests_from_url(url)
function をオーバーライドして、start_urlをアイテムに割り当ててから、Request.meta
特殊キー アイテムを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
お役に立てば幸いです。
要求されたURLをどこかに保存する代わりに、スクレイプ処理されたURLもstart_urls
で提供されているのと同じ順序ではありません。
以下を使用して、
response.request.meta['redirect_urls']
['http://requested_url','https://redirected_url','https://final_redirected_url']
のようなリダイレクトのリストが表示されます
上記のリストの最初のURLにアクセスするには、次を使用できます
response.request.meta['redirect_urls'][0]
詳細については、 doc.scrapy.org を参照してください。
RedirectMiddleware
This middleware handles redirection of requests based on response status.
(リダイレクト中に)要求が通過するURLは、redirect_urls
Request.metaキーで見つけることができます。
これがあなたを助けることを願っています
Python 3.5
スクレイピー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']