web-dev-qa-db-ja.com

解析中のスクレイピー取得リクエストURL

Scrapyのparse()関数でリクエストURLを取得するにはどうすればよいですか? start_urlsに多くのURLがあり、それらのいくつかはスパイダーをホームページにリダイレクトします。その結果、空のアイテムがあります。これらのURLを保存するには、item['start_url'] = request.urlのようなものが必要です。 BaseSpiderを使用しています。

27
Goran

Parse()に渡される「response」変数には、必要な情報が含まれています。何もオーバーライドする必要はありません。

例えば。 (編集済み)

def parse(self, response):
    print "URL: " + response.request.url
50
Jagu

要求オブジェクトは応答オブジェクトからアクセスできるため、次のことができます。

def parse(self, response):
    item['start_url'] = response.request.url
15
gusridd

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

お役に立てば幸いです。

6
NKelner

要求された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_urlsRequest.metaキーで見つけることができます。

これがあなたを助けることを願っています

3
Rohan Khude

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']
1
Pleavă Sorin