[英]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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.