1. ホーム
  2. python-3.x

[解決済み] スクレイピングで何が間違っているのでしょうか。私のコードのために値を返さない

2022-03-13 02:33:42

質問

私のコードは、あるサイトでは動作しますが、別のサイトでは動作しません。どなたか助けてください。

 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のために働いています。