52

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

4

5 に答える 5

17

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

def parse(self, response):
    item['start_url'] = response.request.url
于 2015-12-29T03:57:56.733 に答える
7

BaseSpider のmake_requests_from_url(url) 関数をオーバーライドして 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

それが役立つことを願っています。

于 2013-11-19T22:06:03.120 に答える
7

要求された 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を参照してください。

リダイレクトミドルウェア

This middleware handles redirection of requests based on response status.

(リダイレクト中に) リクエストが通過する URL は、redirect_urls Request.metaキーで確認できます。

これがお役に立てば幸いです

于 2017-12-13T12:17:30.023 に答える