【问题标题】:dynamic values web scraping动态值网页抓取
【发布时间】:2018-12-11 08:14:29
【问题描述】:

大家好,我一直在尝试在网络上抓取一些包含不断变化的值的页面,但到目前为止我无法获得价格。谁能帮帮我,这是我到目前为止到达的地方!

import requests
import bs4
from urllib.request import Request, urlopen as uReq
from bs4 import BeautifulSoup as soup 
from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

my_url = 'https://www.cryptocompare.com/'
binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe')
options = Options()
options.set_headless(headless=True)
options.binary = binary
cap = DesiredCapabilities().FIREFOX
cap["marionette"] = True
driver = webdriver.Firefox(firefox_options=options, capabilities=cap, executable_path="C:/Users/Genti/AppData/Local/Programs/Python/Python36-32/Lib/site-packages/selenium/geckodriver.exe")
browser = webdriver.Firefox(firefox_binary=binary)
browser.get(my_url)
html = browser.execute_script("return document.documentElement.outerHTML")

sel_soup = soup(html, 'html.parser')
prices = sel_soup.findAll("td", {"class":"price"})
print(prices)

【问题讨论】:

  • 你想要所有 10 个价格?
  • 是的,我想了解所有价格
  • 您想实时获取最新值还是只提取 10 个价格?
  • 我想提取所有最新的价格,但我只想提取价格和货币名称,没有更多可能形成表格
  • 可以说理想的情况是让我获得货币名称、价格和日期

标签: python selenium web-crawler


【解决方案1】:

您可以尝试下面的代码来获取货币名称、价格

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import datetime

from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

my_url = 'https://www.cryptocompare.com/'
binary = FirefoxBinary('C:/Program Files/Mozilla Firefox/firefox.exe')
options = Options()
options.set_headless(headless=True)
options.binary = binary
cap = DesiredCapabilities().FIREFOX
cap["marionette"] = True
driver = webdriver.Firefox(firefox_options=options, capabilities=cap, executable_path="C:/Users/Genti/AppData/Local/Programs/Python/Python36-32/Lib/site-packages/selenium/geckodriver.exe")
driver.get(my_url)

names = [name.text.split('\n')[0] for name in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, 'desktop-name')))]
prices = [price.text for price in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, 'current-price-value')))]

print(datetime.datetime.now())
for name, price in zip(names, prices):
    print(name + " - " + price)

【讨论】:

  • @antonio 在定义名称和价格时收到错误 selenium.common.exceptions.TimeoutException: 消息:我没有得到任何回报
  • @GentBytyqi ,我不是安东尼奥,但没关系 :)) 你能仔细检查一下是否打开了所需的页面吗? (制作页面截图)您可能会被重定向到另一个页面
  • @Anderson 没有打开页面
  • @GentBytyqi ,您是否仅在无头 Firefox 中尝试过?您如何检查是否打开了正确的页面?
  • 以前页面是自动打开的,现在不是了。
【解决方案2】:

以防万一,如果您想要所有 10 个价格。您必须将所有价格存储在一个列表中,如下所示:

all_prices = driver.find_elements_by_css_selector("td[class='price'] div")  

然后只需遍历一个循环来获取值:

for price in all_prices:  
  print(price.text)  

如果您遇到任何困难,请告诉我。

【讨论】:

  • 我在获得输出时遇到了一些困难,基本上我在命令提示符下运行所有​​代码,但没有得到任何结果
【解决方案3】:

如果你想使用 BS 而不是 Selenium Webdriver:

prices = sel_soup.select("td[class^='price'] > div")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2020-05-24
    • 2012-09-25
    相关资源
    最近更新 更多