#python #pandas #beautifulsoup #dynamic #python-requests
#питон #панды #прекрасный суп #динамический #python-запросы
Вопрос:
Я мог бы извлечь часть нужных мне значений из html, но я не могу извлечь все значения. Как я мог полностью получить значения в python ?
import time import requests !pip install beautifulsoup4 import bs4 !pip install lxml from bs4 import BeautifulSoup import pandas as pd headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'} output =[] url = "https://m.pcone.com.tw/store/0670386?ref=d_item_store" r = requests.get(url, headers = headers) soup = bs4.BeautifulSoup(r.text,"lxml") for product in soup.find_all("a",class_='product-list-item'): productname = product.find("div",class_='name limit-2-line').get_text(strip=True) productprice= product.select_one("span",class_='symbol-price').string ordercount = product.find('span',class_="order_count").string[:-3] if product.find('span',class_="order_count")else None print(f'{productname}:{productprice}:{ordercount}') output.append([productname, productprice, ordercount]) df = pd.DataFrame(output, columns=['商品名稱', '價格', '購買人數']) df.to_excel('松果-瑞昌.xlsx', index=False)
Ответ №1:
На самом деле данные динамически загружаются javascript из api-вызовов json-ответа, поэтому BeautifulSoup не может захватить данные. Минимальное рабочее решение от api, использующее только запросы следующим образом:
import requests import pandas as pd headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'} params={ 'items_per_page': '20', 'null':'' , 'page': '1', 'sortBy': 'default', 'sortDir': 'desc', 'store_id': '0670386' } output =[] #url = "https://m.pcone.com.tw/store/0670386?ref=d_item_store" api_url='https://www.pcone.com.tw/api/filterSearchTP' for i in range(1,14): params['total_pages'] = i resp = requests.get(api_url, headers = headers,params=params).json() for item in resp['products']: productname=item['name'] productprice=item['msrp'] ordercount=item['order_count'] #print(ordercount) output.append([productname, productprice, ordercount]) df = pd.DataFrame(output, columns=['商品名稱', '價格', '購買人數']) df.to_excel('松果-瑞昌.xlsx', index=False)