【Python】scrapyのspider実行時に403 Forbiddenが出た場合の対処

どーも、えびじゅん(@ebijun1007)です。

 

Pythonでクローラを実装するときに使うフレームワークといえば?
そうです、scrapyです。

さて、今回は、そのscrapyのspider実行時に、403 Forbiddenが返ってきた場合の対処法をご紹介します。

結論からいうと、UserAgentを登録すれば解決します。

Scrapyの適当なサンプル

以下、適当なサンプルです。

import scrapy
class SampleSpider(scrapy.Spider):
    name = 'sample'
    allowed_domains = ['sample.com']
    start_urls = ['https://www.sample.com/']

    def parse(self, response):
        print(response.text)

架空のサイトをクローリングして、サイト内の全文を表示します。

[scrapy] DEBUG: Crawled (403) <GET http://laptops.specout.co m/l/1149/4752-32352G50Mn> (referer: None) 
[scrapy] DEBUG: Ignoring response <403 http://laptops.specou t.com/l/1149/4752-32352G50Mn>: HTTP status code is not handled or not allowed 
[scrapy] INFO: Closing spider (finished)

おっと、403エラーが返ってきて、何も取得できませんでした。

こんなときどうすれば良いでしょうか?

解決策:spiderのcustom_settingsでUSER_AGENTを設定する

scrapyの設定を特にいじっていなければ、"Scrapy/VERSION (+https://scrapy.org)" がデフォルトのUSER_AGENTとして設定されています。

このUSER_AGENTをブラウザと同じものに変更することで、ブラウザからのアクセスに見せかけて403を回避することが出来ます。

では、先ほどのspiderに、custom_settingsを実装し、デフォルトのUserAgentを変更してみます。
今回は、FirefoxのUSER_AGENTを設定してます。

 

import scrapy
class SampleSpider(scrapy.Spider):
    name = 'sample'
    allowed_domains = ['sample.com']
    start_urls = ['https://www.sample.com']

    custom_settings = {
        'USER_AGENT': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0',
    }

    def parse(self, response): 
        print(response.text)

これで無事にスクレイピングすることが出来ます!

 

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください