我試圖從 AJIO 網站進行抓取,但似乎 Python 正在獲取的內容與我在檢查確切網頁元素時看到的內容并不完全相同。頁面上似乎存在某種 Java 代碼,它在后端創建 HTML 頁面,但是當我嘗試在 Python 中獲取頁面內容時,它向我顯示了 Java 代碼而不是確切的 HTML 頁面。任何人都可以為此提出解決方案嗎?下面是我正在使用的代碼。
在下面的代碼中,我在最后一行之后收到錯誤“TypeError: 'NoneType' object is not iterable”,這是因為未通過“soup=BeautifulSoup(page.text,'html.parser')”正確獲取頁面。我可以在檢查 HTML 頁面時看到“預覽”類,但是當 python 獲取它時,我在其中找不到“預覽”類。
import requests
from bs4 import BeautifulSoup
url="https://www.ajio.com/men-jeans/c/830216001?query=:relevance&gridColumns=5"
page=requests.get(url)
ajio=BeautifulSoup(page.content,'html.parser')
print(ajio.prettify()) '''Problem
jeans_list = ajio.find('script',attrs={'class':'preview'})
for jeans in jeans_list:
print(jeans_list.prettify())
uj5u.com熱心網友回復:
如果想決議這個站點,你應該從JavaScript代碼中獲取JSON物件。然后將其轉換為 Python dict 并獲取 Jeans 資料。
你的目標看起來像這樣
<script>
window.__PRELOADED_STATE__ = {"wishlist":{},
....
"apiStatusMessage":""}}};
</script>
因此,您可以使用regex獲取它,將其決議為 dict 并找到存盤資料的位置。
這是如何查找產品名稱和價格的示例
import requests
import re
import json
url="https://www.ajio.com/men-jeans/c/830216001?query=:relevance&gridColumns=5"
page=requests.get(url)
m = re.search(r' window.__PRELOADED_STATE__ = ({. ?}}});', page.text)
raw_json = m.group(1)
data_dict = json.loads(raw_json)
jeans_list = data_dict["grid"]["entities"].values()
for jeans in jeans_list:
print(f"name: {jeans['name']}; price: {jeans['price']['value']}")
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/401195.html
上一篇:串列轉換為空白資料框
