web-dev-qa-db-ja.com

Scrapyでのクロール-HTTPステータスコードが処理されない、または許可されない

製品のタイトル、リンク、価格をカテゴリで取得したい https://tiki.vn/dien-thoai-may-tinh-bang/c1789

しかし、「HTTPステータスコードが処理されないか、許可されていません」というエラーが発生します https://i.stack.imgur.com/KCFw2.jpg

私のファイル:spiders/tiki.py

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from stackdata.items import StackdataItem


class StackdataSpider(CrawlSpider):
    name = "tiki"
    allowed_domains = ["tiki.vn"]
    start_urls = [
        "https://tiki.vn/dien-thoai-may-tinh-bang/c1789",
    ]

    rules = (
        Rule(LinkExtractor(allow=r"\?page=2"),
             callback="parse_item", follow=True),
    )

    def parse_item(self, response):
        questions = response.xpath('//div[@class="product-item"]')

        for question in questions:
            question_location = question.xpath(
                '//a/@href').extract()[0]
            full_url = response.urljoin(question_location)
            yield scrapy.Request(full_url, callback=self.parse_question)

    def parse_question(self, response):
        item = StackdataItem()
        item["title"] = response.css(
            ".item-box h1::text").extract()[0]
        item["url"] = response.url
        item["content"] = response.css(
            ".price span::text").extract()[0]
        yield item

ファイル:items.py

import scrapy


class StackdataItem(scrapy.Item):
    title = scrapy.Field()
    url = scrapy.Field()
    price = scrapy.Field()

私を助けてください!!!!ありがとう!

7
gait

tl; dr

Scrapyのユーザーエージェントに基づいてブロックされています。

次の2つのオプションがあります。

  1. ウェブサイトの願いを叶え、それらをこすらないでください、または
  2. ユーザーエージェントを変更する

オプション2を使用することを想定しています。

スクレイピープロジェクトの_settings.py_に移動し、ユーザーエージェントをデフォルト以外の値に設定します。独自のプロジェクト名(Word scrapyを含めないでください)または標準のブラウザのユーザーエージェント。

_USER_AGENT='my-cool-project (http://example.com)'
_

詳細なエラー分析

私たちは皆学びたいので、ここで私がこの結果にたどり着いた方法と、そのような振る舞いを再び見た場合に何ができるかについて説明します。

Webサイトtiki.vnは、スパイダーのすべてのリクエストに対して HTTPステータス404 を返すようです。スクリーンショットを見ると、_/robots.txt_と_/dien-thoai-may-tinh-bang/c1789_の両方のリクエストに対して404を取得していることがわかります。

404は「見つかりません」を意味し、Webサーバーはこれを使用してURLが存在しないことを示します。ただし、同じサイトを手動で確認すると、両方のサイトに有効なコンテンツが含まれていることがわかります。現在、これらのサイトがコンテンツと404エラーコードの両方を同時に返すことは技術的に可能である可能性がありますが、ブラウザの開発者コンソール(ChromeまたはFirefox)でこれを確認できます) 。

enter image description here

ここでは、robots.txtが有効な200ステータスコードを返すことがわかります。

行われるさらなる調査

多くのWebサイトはスクレイピングを制限しようとするため、スクレイピングの動作を検出しようとします。したがって、彼らはいくつかの指標を見て、あなたにコンテンツを提供するか、あなたのリクエストをブロックするかを決定します。私はまさにこれがあなたに起こっていることだと思います。

自宅のPCからは完全に正常に機能するが、サーバーからの要求(scrapy、wget、curlなど)にまったく応答しなかった(404でもない)1つのWebサイトをクロールしたいと思いました。

この問題の理由を分析するために実行する必要がある次のステップ:

  • 自宅のPCからWebサイトにアクセスできますか(ステータスコード200を取得していますか)?
  • 自宅のPCからスクレイピーを実行するとどうなりますか?まだ404?
  • スクレイピーを実行しているサーバーからWebサイトをロードしてみてください(例:wgetまたはcurlを使用)

次のようにwgetでフェッチできます。

_wget https://tiki.vn/dien-thoai-may-tinh-bang/c1789
_

wgetはカスタムユーザーエージェントを送信するため、このコマンドが機能しない場合(私のPCから)、 Webブラウザーのユーザーエージェント に設定することをお勧めします。

_wget -U 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36' https://tiki.vn/dien-thoai-may-tinh-bang/c1789
_

これは、サーバーに問題があるかどうか(IPがブロックされているか、IP範囲全体がブロックされているか)、スパイダーに変更を加える必要があるかどうかを確認するのに役立ちます。

ユーザーエージェントの確認

サーバーのwgetで動作する場合は、scrapyのユーザーエージェントが問題であると思われます。 ドキュメントによると 、自分で設定しない限り、scrapyはユーザーエージェントとしてScrapy/VERSION (+http://scrapy.org)を使用します。ユーザーエージェントに基づいてスパイダーをブロックする可能性は十分にあります。

だから、あなたはあなたのスクレイピープロジェクトの_settings.py_に行き、そこで_USER_AGENT_の設定を探す必要があります。これを、キーワードscrapyを含まないものに設定します。ニースになりたい場合は、プロジェクト名+ドメインを使用します。それ以外の場合は、標準のブラウザユーザーエージェントを使用します。

素敵なバリアント:

_USER_AGENT='my-cool-project (http://example.com)'
_

それほど素敵ではない(ただし、スクレイピングでは一般的)バリアント:

_USER_AGENT='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
_

実際、ローカルPCから次のwgetコマンドを使用して、ユーザーエージェント上でブロックされていることを確認できました。

_wget -U 'Scrapy/1.3.0 (+http://scrapy.org)' https://tiki.vn/dien-thoai-may-tinh-bang/c1789
_

その結果

_--2017-10-14 18:54:04--  https://tiki.vn/dien-thoai-may-tinh-bang/c1789
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving tiki.vn... 203.162.81.188
Connecting to tiki.vn|203.162.81.188|:443... connected.
HTTP request sent, awaiting response... 404 Not Found
2017-10-14 18:54:06 ERROR 404: Not Found.
_
22
Aufziehvogel

Aufziehvogel ユーザーエージェントの変更とは別に、httpエラーコードも参照してください。あなたの場合、httpエラーコードは404で、これはクライアントエラー( NOT FOUND )を示します。

コンテンツをスクレイピングするためにWebサイトが認証されたセッションを必要とする場合、httpエラーコードは401になる可能性があり、クライアントエラーを示します( [〜#〜] unauthorized [〜#〜]

0
deshan