簡體   English   中英

在Python中設計簡單的網頁抓取工具時遇到的問題

[英]Issues designing a simple web scraper in Python

我遵循了一個在線教程,並成功地創建了一個與逐步遵循相同的Web抓取工具。

但是,當嘗試在所需的網站上實現此代碼時,控制台上返回的所有數據都是空白。 我希望有人可以查看我放下的短代碼來收集數據,看看我是否正確地完成了此操作,或者我是否意識到網站上的某些協議不允許從中擦除數據。

# import libraries
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup 

myurl = "http://smartgriddashboard.eirgrid.com/#all/generation"

# opening up connection, grabbing the page
uClient = uReq(myurl)
page_html = uClient.read()
uClient.close()

# html parsing
page_soup = soup(page_html, "html.parser")

# find the data of interest
key_stats = page_soup.findAll("div",{"class":"key-stats-container"})

然后,當我嘗試調用key_stats時,出現的全部是[]。 如前所述,在在線教程的示例網頁上執行此操作時,該類中的所有數據都已存儲。

我不是專業的程序員,所有這一切對我來說都是很新的,因此,感謝您的協助。

問題在於,您嘗試從頁面抓取的div是使用Javascript動態生成的。 它不在HTML源代碼中 ,這意味着urllib.request無法訪問該信息。 在瀏覽器中加載頁面時,您應該注意到該信息並不立即顯示在屏幕上,統計信息會在頁面加載后幾秒鍾出現。

您可以嘗試瀏覽網站的Javascript或Source文件,並嘗試查找信息的來源 (通常是JSON或XML文件),也可以使用selenium之類的東西(自動瀏覽器)在相關信息之后解析頁面。元素在頁面上:

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

driver = webdriver.Chrome()

try:
    driver.get("http://smartgriddashboard.eirgrid.com/#all/generation") # load the page
    WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.key-stats-container > .stat-box'))) # wait till relevant elements are on the page
except:
    driver.quit() # quit if there was an error getting the page or we've waited 15 seconds and the stats haven't appeared.
stat_elements = driver.find_elements_by_css_selector('.key-stats-container > .stat-box')
for el in stat_elements: 
    print(el.find_element_by_css_selector('label').text)
    print(el.find_element_by_css_selector('p').text)
driver.quit()                                      

WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.key-stats-container > .stat-box')))將等待15秒鍾或until通過CSS選擇器找到元素until超時,您可以根據需要更改15秒。

我在那里等待,而不是僅僅等待.key-stats-container ,而是等待.key-stats-container > .stat-box (具有stats-box類的元素,它是.key-stats-container的直接子元素),因為在那里這是.key-stats-container已加載的點,但統計數據卻沒有:

   <span class="load"></span>
    <div class="error-msg">
        <p>We had some trouble gathering the data.</p>
        <p>Refresh to try again.</p>
    </div>
</div>

這是輸出:

LATEST SYSTEM
GENERATION
4,885 MW
THERMAL GENERATION
(COAL, GAS, OTHER)
56.81 %
RENEWABLE
GENERATION
43.03 %
NET
IMPORT
0.16 %

看起來好像整個頁面都沒有下載。 您可以使用print(page_soup.prettify())

一種解決方法是使用Selenium打開Web瀏覽器,然后下載頁面:

from selenium import webdriver
from bs4 import BeautifulSoup as soup
driver = webdriver.Firefox(profile)
driver.get('http://smartgriddashboard.eirgrid.com/#all/generation')
page_soup = soup(driver.page_source, 'html.parser')
  • 請注意,Selenium需要安裝geckodriver
  • 我敢肯定有更好的方法,使用Requests或其他方法。
  • 一種超級簡單的方法是通過右鍵單擊Web瀏覽器,然后獲取Beautiful Soup來使用它來獲取頁面源。

順便說一句,雖然它起作用了,但是您的findAll似乎是舊方法。 新方法CSS選擇器可能更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM