我在抓取時做錯了什麼。不為我的代碼返回任何值

迪莉

我的代碼適用於一個站點而不是另一個站點。有人可以幫我嗎。

 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 地址發出請求。

然後通過library:使用JSON 響應內容,它將 JSON 字符串解碼為 Python 字典,因此示例代碼如下所示:requestsrequests.get("URL").json()

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.get('URL', headers=headers).json()
 
some_variable = response['some_dict_key_from_response']

或者,如果您不想處理繞過塊,您可以使用SerpApi的 Home Depot Search Engine Results API獲得所需的輸出這是一個帶有免費計劃的付費 API。

不同之處在於您不必像上面提到的那樣處理塊,弄清楚如何縮放請求的數量(如果需要),並且不需要隨著時間的推移維護它(如果 HTML 中的某些內容會發生變化) . 使用您正在尋找的產品查看Playground需要登錄)。

在線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 工作。


PS 我有一個專門的網絡抓取博客

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我的代碼做錯了什麼?Javascript,分頁

為什麼我的代碼會針對此問題返回錯誤?

為什麼在運行我的 discord.py 代碼時出現錯誤?

為什麼我的 discord.py 代碼中有這個錯誤

為什麼即使我的代碼與另一個 API 一起工作,我也會不斷收到語法錯誤:JSON 解析?

為什麼我的代碼不生成沒有 str 的隨機數?

為什麼我的代碼得到不同的結果?

為什麼我的 for 循環後的代碼被忽略?

為什麼我的 Javascript 代碼返回對像對象?

為什麼我的反向鍊錶代碼只返回第一個節點?

為什麼我的函數返回 0.0?(C 代碼)

為什麼我的代碼顯示超出時間限制?

為什麼我的代碼輸出錯誤,將英寸轉換為厘米,反之亦然

為什麼我的代碼給出錯誤:“sqlite3.OperationalError:沒有這樣的列:”?

為什麼我的 Python 代碼僅對某些輸入給出錯誤答案?

有誰知道為什麼我沒有得到輸出,代碼確實編譯但不返回任何輸出

為什麼我的 Symfony 表單在從 Controller 渲染時不顯示錯誤?

為什麼我在抓取 html 頁面時無法返回圖形?

為什麼此代碼不會導致重新定義錯誤?

JavaScript,我做錯了什麼?

在 django 中使用信號,嘗試為短信驗證生成代碼,但生成的代碼在 admin 中不可見。我錯過了什麼?

為什麼 StartsWith 只在我的機器上返回錯誤的值?

為什麼在使用字符串作為輸入時出現“Bash(輸入):找不到命令”錯誤,但是當我將代碼的那部分更改為整數時,它可以工作?

為什麼我在使用 ifs 函數時在 excel 中出現值錯誤?

為什麼我的 xpath 表達式不返回任何結果

為什麼我的 XPath 表達式不返回任何結果?

錯誤:不兼容的字符串類型:意外的返回值 - 這是我返回字符串時的代碼錯誤

為什麼我的 facebook iframe 代碼只在移動設備上不顯示視頻描述?

__builtin_prefetch 使它在我的代碼中更快。我需要在代碼中做什麼