最近需要爬取国家家养动物种质资源库里的部分畜禽遗传资源,但爬页面数据一直都只能爬到无关痛痒的标题什么的,真正重要的数据却一直都获取不到。在我的观察之下,这些数据在点开网页“检查”的Elements后是可以显示的,但却不存在于网页源代码里,这是为什么呢?
原来,现在很多网站都采用了动态加载技术,即在页面加载完成后,通过 JavaScript 在页面上添加或修改内容,这些动态加载的内容(可能包括异步加载的数据、通过 AJAX 请求获取的数据等)不会在初始的 HTML 源代码中出现,因此无法直接通过爬虫获取到。要获取这些数据,需要使用能够执行 JavaScript 的工具如Selenium。
当我加入了Selenium模块后,数据就可以如愿加载到啦!代码如下:
# 爬取国家家养动物种质资源库下畜禽遗传资源[山羊]的全部信息
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from time import sleep
if __name__ == "__main__":
# 实例化一个浏览器对象(传入浏览器的驱动程序)
service = Service(executable_path='./chromedriver.exe')
bro = webdriver.Chrome(service=service)
# 让浏览器发起对CDAD的访问请求
bro.get(url='https://www.cdad-is.org.cn/admin/Zylist/index?type=cngenetics1&subtype=11')
# 显式等待页面元素加载完成(最长等待时间设置为10秒),等tbody标签里有“山羊”文本再往后推进
WebDriverWait(bro, 10).until(EC.text_to_be_present_in_element((By.TAG_NAME, "tbody"), "山羊"))
# page_source获取浏览器当前页面的页面源码数据
page_text = bro.page_source
# 持久化存储
with open('./test.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
# 让程序暂停执行5秒钟,以确保页面所有内容都已加载完成
sleep(5)
# 关闭浏览器,释放资源
bro.quit()
把test.html在Chrome打开之后是下面这个样子,和原页面几乎没差,就是超链点了之后显示404emmm。