Извлечение текущих ставок с помощью Beautfiul Soup - динамическое обновление значений
Это мое первое знакомство с Python и BeautifulSoup. Я пытаюсь получить текущую сумму ставки из определенного свойства, указанного на популярном веб-сайте аукциона (RealInsight), но не могу заставить BeautifulSoup получить фактическое целое число, которое я ищу, только HTML-код. Я ищу значение тега класса "sbn", которое составляет $3 250000 до фактического начала аукциона.
https://marketplace.realinsight.com/sales/details/XXX
Я думаю, это потому, что значение динамически обновляется и генерируется вне HTML-кода, но я не уверен, как проверить этот тезис или получить значение, если оно окажется верным. Я также думаю, что могу неправильно ссылаться на таблицу, в которой содержится значение, но, опять же, не очень опытный в python или bs4.
[ОБНОВЛЕНО ФИНАЛЬНЫМ КОДОМ НИЖЕ С ИСПОЛЬЗОВАНИЕМ МЕТОДА ewwink - УСТАРЕТЬ ОДИН РАЗ В ПЯТЬ СЕКУНД] - ОБНОВЛЕНО ДЛЯ КОНЕЧНОГО АУКЦИОНА
import bs4
import time
import csv
import datetime
import sys
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
my_url = 'https://marketplace.realinsight.com/sales/details/XXX'
uclient = uReq(my_url)
page_html = uclient.read()
uclient.close()
endmsg = "Auction End"
page_soup = soup(page_html, "html.parser")
propname = page_soup.title.text
bids = page_soup.select_one(".body-content")
currentbid = bids['data-nb']
bidincrement = bids['data-bi']
with open(propname + '_bids.csv','w',newline='') as f:
thewriter = csv.writer(f)
thewriter.writerow(['i','prop_name','date_time','bid_increment','bid_amt'])
for i in range(0,5,1):
try:
import sys
sale = page_soup.select_one("div.sale-end-text")
auctionend = sale.text.replace(" ", "")
if auctionend == sale.text.replace(" ", ""):
currentDT = datetime.datetime.now()
thewriter.writerow([i,endmsg,currentDT,currentbid])
print(endmsg,currentbid)
time.sleep(1)
sys.exit()
else:
print('will never get to this point')
except Exception:
pass
currentDT = datetime.datetime.now()
thewriter.writerow([i,propname,currentDT,bidincrement,currentbid])
print(i,propname,currentDT,bidincrement,currentbid)
time.sleep(1)
ОБНОВЛЕНО методом chitown88
import bs4
import datetime
import time
import csv
import selenium
from selenium import webdriver
driver = webdriver.Chrome(executable_path='C:\\Users\\XXXX\\Downloads\\chromedriver_win32\\chromedriver.exe')
driver.get('https://marketplace.realinsight.com/sales/details/XXX')
html = driver.page_source
page_soup = bs4.BeautifulSoup(html,"html.parser")
bids = page_soup.select("td.s-b-n")
propname = page_soup.title.text
currentbid = bids[0].text
with open(propname + '_bids.csv','w',newline='') as f:
thewriter = csv.writer(f)
thewriter.writerow(['i','prop_name','date_time','bid_amt'])
for i in range(0, 5, 1):
currentDT = datetime.datetime.now()
driver.refresh()
thewriter.writerow([i, propname, currentDT, currentbid])
print(i, propname, currentDT, currentbid)
time.sleep(1)
driver.close()
Я вижу число, которое я ищу ($3 250000) в коде HTML, но оно мигает и обновляется каждые несколько секунд, поэтому я думаю, что оно генерируется в другом месте.
Любое руководство будет с благодарностью.
3 ответа
Вам нужно будет загрузить страницу перед анализом. Селен идеально подходит для этого.
import bs4
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://marketplace.realinsight.com/sales/details/367')
html = driver.page_source
page_soup = bs4.BeautifulSoup(html,"html.parser")
bids = page_soup.select("td.s-b-n")
bid = bids[0].text
print(bid)
driver.close()
и вывод:
In [91]: print(bid)
$3,250,000
Вы можете использовать BeautifulSoup там data-sb
приписывать div.body-content
которые хранят значение ставки.
page_soup = soup(page_html, "html.parser")
bids = page_soup.select_one(".body-content")
print(bids['data-sb'])
# format the number
print('${:,d}'.format(int(float(bids['data-sb']))))
print(bids.attrs)
Я не мог заставить BeautifulSoup дать мне данные, но мне удалось через Selenium. У вас должен быть установлен chromedriver, а также Selenium, вы можете сделать это, набрав с консоли:
pip install selenium
Вот сценарий:
from selenium import webdriver
from selenium.webdriver.common.by import By
pageLink = 'https://marketplace.realinsight.com/sales/details/367'
# Setup our chrome preferences.
chromeOptions = webdriver.ChromeOptions()
# Change this variable to the path of the chromedriver you downloaded.
chromedriver = "D:\Downloads\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome( executable_path = chromedriver, chrome_options = chromeOptions )
driver.get( pageLink )
extractData = driver.find_element( By.XPATH, "/html/body/div[3]/section[2]/div/div[1]/div[2]/div[1]/div[2]/div/div[1]/div/table/tbody/tr[2]/td[2]" )
print( extractData.text )