[英]Python, web scraping and BeautifulSoup but does not work
我想從以下 html 代碼中抓取所有產品的列表,以及它們是“庫存”還是“缺貨”。
<div class="js-product-sizer sizes__layout built" data-scope="conversion-zone">
<div class="sizes__wrapper sizes__wrapper--visible" data-id="1042303" data-sellableonline="true">
<span class="sizes__button sizes__button--selected" role="button" data-quantity="">Taglia</span>
<ul class="sizes__list" role="listbox">
<li class="sizes__size" data-id="969834" data-belowthreshold="false" data-quantity="true" data-available-quantity="1631" data-backinstockqualified="false" data-locale="it" data-storeprice="€1,49" data-storename="Cavallino, Lecce" data-price="1.49" data-weight="0.528" data-favstore-stock="10" data-favstore-above-threshold="false" data-favstore-cnc1h="true" aria-labelledby="size-selector-title" role="option">
<span class="sizes__info" data-tnr-size-selector-bootstrap-by-text="">0,5 KG</span>
<span class="sizes__stock"
<span class="sizes__stock__info" data-tnr-size-selector-stock-info="">Disponibile</span>
</span>
</li>
<li class="sizes__size" data-id="969842" data-belowthreshold="false" data-quantity="false" data-available-quantity="0" data-backinstockqualified="true" data-locale="it" data-storeprice="€3,49" data-storename="Cavallino, Lecce" data-price="3.49" data-weight="1.074" data-displayname="Disco ghisa bodybuilding 28mm" data-favstore-stock="0" data-favstore-above-threshold="false" data-favstore-cnc1h="false" aria-labelledby="size-selector-title" role="option">
<span class="sizes__info" data-tnr-size-selector-bootstrap-by-text="">1 KG</span>
<span class="sizes__stock">
<span class="sizes__stock__info sizes__stock__info--nostock" data-tnr-size-selector-stock-info="">0 disponibili</span>
我已經運行了以下代碼:
import requests
from bs4 import BeautifulSoup
import time
r = requests.get('https://www.decathlon.it/p/disco-ghisa-bodybuilding-28mm/_/R-p-7278?mc=1042303&c=NERO')
soup = BeautifulSoup(r.text, 'html.parser')
for anchor_tag in soup.find_all(class_="js-product-sizer sizes__layout built")[0].findChildren():
if "sizes_stock" in anchor_tag['class']:
print(f"Size {anchor_tag.text} OOS")
else:
print(f"Size {anchor_tag.text} in stock!")
但它給了我以下錯誤:
IndexError: list index out of range
如前所述,他們有一種方法可以檢測自動化過程以獲取信息。 如果您使用 selenium 訪問頁面 a,它確實會顯示 html。 所以你可以使用 selenium 獲取頁面源,然后進行解析。
還在那里清理了你的邏輯。 無論是否有任何可用數量,您都在打印'in stock'
。
此外,如果您只是要在使用find_all()
時拉出第一個元素( soup.find_all(class_="js-product-sizer sizes__layout built")[0]
),不妨簡單地使用find()
,因為這正是它返回的,它找到的第一個元素。
代碼:
from selenium import webdriver
from bs4 import BeautifulSoup
import time
url = 'https://www.decathlon.it/p/disco-ghisa-bodybuilding-28mm/_/R-p-7278?mc=1042303&c=NERO'
while True:
driver = webdriver.Chrome(executable_path=r'C:/chromedriver_win32/chromedriver.exe')
meta = 'ROBOTS'
while meta == 'ROBOTS':
driver.get(url)
page = driver.page_source
soup = BeautifulSoup(page,'html.parser')
if 'name' in soup.find('meta').attrs:
meta = soup.find('meta')['name']
else:
meta = False
driver.close()
anchor_tag = soup.find(class_="js-product-sizer sizes__layout built")
items_list = anchor_tag.find_all('li')
for item in items_list:
if item['data-weight'] == '0.528':
continue
quantity = item['data-available-quantity']
itemStr = item.text.split('\n')
if int(quantity) > 0:
itemStr.insert(2,quantity)
itemStr = ' '.join(itemStr).strip()
if item['data-available-quantity'] == '0':
print(f"Size {itemStr} OOS")
else:
print(f"Size {itemStr} in stock!")
time.sleep(60)
Output:
Size 0,5 KG 1584 Disponibile in stock!
Size 1 KG 0 disponibili OOS
Size 2 KG 0 disponibili OOS
Size 5 KG 0 disponibili OOS
Size 10 KG 0 disponibili OOS
Size 20 KG 0 disponibili OOS
您可以通過調用來查看您的代碼有什么問題
r.raise_for_status()
或手動檢查r.status_code
。
您將看到requests.exceptions.HTTPError: 403 Client Error: Forbidden for url:...
。 因此,在您的響應文本中確實沒有帶有 class 的 div,並且無法獲取索引為 0 的元素並引發IndexError
。 您嘗試抓取的網站正在檢測簡單的抓取請求,請嘗試至少設置一些標頭(也許fake_useragent可以幫助您)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.