製品のタイトル、リンク、価格をカテゴリで取得したい 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()
私を助けてください!!!!ありがとう!
Scrapyのユーザーエージェントに基づいてブロックされています。
次の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)でこれを確認できます) 。
ここでは、robots.txtが有効な200ステータスコードを返すことがわかります。
多くのWebサイトはスクレイピングを制限しようとするため、スクレイピングの動作を検出しようとします。したがって、彼らはいくつかの指標を見て、あなたにコンテンツを提供するか、あなたのリクエストをブロックするかを決定します。私はまさにこれがあなたに起こっていることだと思います。
自宅のPCからは完全に正常に機能するが、サーバーからの要求(scrapy、wget、curlなど)にまったく応答しなかった(404でもない)1つのWebサイトをクロールしたいと思いました。
この問題の理由を分析するために実行する必要がある次のステップ:
次のように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.
_
Aufziehvogel ユーザーエージェントの変更とは別に、httpエラーコードも参照してください。あなたの場合、httpエラーコードは404で、これはクライアントエラー( NOT FOUND )を示します。
コンテンツをスクレイピングするためにWebサイトが認証されたセッションを必要とする場合、httpエラーコードは401になる可能性があり、クライアントエラーを示します( [〜#〜] unauthorized [〜#〜] )