[解決済み] スクレイピングで何が間違っているのでしょうか。私のコードのために値を返さない
質問
私のコードは、あるサイトでは動作しますが、別のサイトでは動作しません。どなたか助けてください。
import requests
from bs4 import BeautifulSoup
URL = "https://www.homedepot.com/s/311256393"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
results = soup.find(id="root")
print(results.prettify())
以下のコードでは、出力が表示されますが、ウェブサイト上で何か違いがありますか?
import requests
from bs4 import BeautifulSoup
URL = "https://realpython.github.io/fake-jobs/"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
results = soup.find(id="ResultsContainer")
print(results.prettify())
解決方法は?
The Home Depotを解析する場合、プロキシを使用する必要があります(あなたのIPが米国外の場合、そうでない場合、それは
アクセス拒否
エラー)、そしてその GraphQL API からのデータをパースします (
Dev Tools -> Network -> Fetch\XHR -> find appropriate name -> Headers (opened tab on the right after clicking on the name) -> URL
を作成し、適切なURLアドレスにリクエストしてください。
次に
JSONレスポンスコンテンツ
を経由して
requests
ライブラリを使用します。
requests.get("URL").json()
これはJSONの文字列をPythonの辞書にデコードするもので、そのため
コード例
は次のようになります。
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
# additional headers if response is not 200 (look inside "Headers tab in Devtools")
}
response = requests.post('URL', headers=headers).json()
some_variable = response['some_dict_key_from_response']
また、ブロックの迂回が面倒な場合は ホームデポ検索エンジン結果API のSerpApiを使用しています。無料プランのある有料APIです。
違いは、上記のようなブロックを扱う必要がないこと、リクエストの数をどのように拡張するかを考える必要がないことです ( 必要なら )、長期間にわたってメンテナンスする必要がない( HTML内の何かが変更される場合 ). をチェックしてみてください。 探していた商品でプレイグラウンド .
と統合するためのコード例 オンラインIDEでの使用例 :
from serpapi import GoogleSearch
import os
params = {
"api_key": os.getenv("API_KEY"),
"engine": "home_depot_product", # ↓↓↓
"product_id": "311256393" # https://www.homedepot.com/s/311256393 ←
# ↑↑↑
}
search = GoogleSearch(params)
results = search.get_dict()
title = results["product_results"]["title"]
link = results["product_results"]["link"]
price = results["product_results"]["price"]
rating = results["product_results"]["rating"]
print(title, link, price, rating, sep="\n")
# actual JSON response is much bigger
'''
20 in. x 20 in. Palace Tile Outdoor Throw Pillow with Fringe
https://www.homedepot.com/p/Hampton-Bay-20-in-x-20-in-Palace-Tile-Outdoor-Throw-Pillow-with-Fringe-7747-04413111/311256393
19.98
5.0
'''
利用可能なものをざっと見てみると
product_results
:
for key in results["product_results"]:
print(key, sep="\n")
'''
product_id
title
description
link
upc
model_number
favorite
rating
reviews
price
highlights
brand
images
bullets
specifications
fulfillment
'''
免責事項:私はSerpApiのために働いています。
関連
-
[解決済み] TypeError: _thread.lockオブジェクトをpickleできません。
-
[解決済み] PyCharmでpython 3.4を使用する際にInvalid Python SDK Errorが発生する。
-
[解決済み] TypeError: append() に 1 つの必須位置引数がない: 'values'
-
[解決済み] 修正方法:cx_Oracle.DatabaseError: DPI-1047: 64 ビット Oracle クライアントライブラリが見つかりません - Python
-
[解決済み] Python 3 の requests.get でデータを取得する前にページがロードされるのを待つ
-
[解決済み] PySNMP による snmpwalk
-
[解決済み] python3 で cv2 をインポートするには?
-
[解決済み] Pythonのエラーメッセージ io.UnsupportedOperation: not readable(読めません
-
[解決済み] シンタックスエラーと変数アノテーションのターゲットが不正であるというエラーが発生します。どうすれば直せますか?[クローズド]
-
[解決済み] スクレイピングで何が間違っているのでしょうか。私のコードのために値を返さない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ImportError: libcublas.so.9.0: 共有オブジェクトファイルを開くことができない
-
[解決済み】なぜELIF Invalid Syntax Errorが発生するのでしょうか?
-
[解決済み] TypeError: _thread.lockオブジェクトをpickleできません。
-
[解決済み] Pythonで "filter "オブジェクトの長さを求める方法
-
[解決済み] PySNMP による snmpwalk
-
[解決済み] sklearnのprecision_recall_fscore_supportの出力はどのように並べられるのでしょうか?
-
[解決済み] pygame: pygame.KEYDOWNが動作しない
-
[解決済み] python3のdateutil.parserの代わりとなるものは何ですか?
-
[解決済み] ~/.conda/envs. ~/anaconda3/envs.
-
[解決済み] virtualenvを削除する方法を教えてください。