休闲

selenium获取网页源码

时间:2010-12-5 17:23:32  作者:探索   来源:休闲  查看:  评论:0
内容摘要:用Selenium拿网页源码,最直接的方法就是driver.page_source。这行代码返回的是当前页面渲染完之后的HTML字符串。注意,是渲染完之后的。这点很关键,后面会展开说。 我刚开始用的时

用Selenium拿网页源码,网页最直接的源码方法就是driver.page_source。这行代码返回的网页是当前页面渲染完之后的HTML字符串。注意,源码是网页渲染完之后的。这点很关键,源码后面会展开说。网页

我刚开始用的源码时候踩过一个坑:明明浏览器里看到表格里有数据,page_source拿回来却是网页空的。折腾了半天才反应过来——页面是源码JS异步加载的,源码拿到的网页时候数据还没回来。解决办法也简单,源码加个显式等待就行:

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() driver.get("https://example.com/table") WebDriverWait(driver,网页 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "table.data-table tr")) ) html = driver.page_source driver.quit() 

等某个具体元素出现了再取源码,比死等time.sleep(5)靠谱得多。源码sleep的网页问题是,网络快的时候白等,网络慢的时候不够等。

page_source到底返回了什么

很多人以为page_source返回的就是右键“查看网页源代码”看到的内容。不是一回事。

右键查看源代码,拿到的是服务器最初返回的HTML。而page_source返回的是经过浏览器解析、CSS应用、JavaScript执行之后的DOM序列化结果。两者的差异可能非常大。比如一个React或Vue做的SPA页面,右键源码可能只有一个<div id="app"></div>,但page_source能拿到完整的渲染后结构。

这个特性在某些场景下是优势,在另一些场景下反而是麻烦。如果你只想拿到原始HTML做解析,用requests就够了,没必要启动一个浏览器。Selenium的价值在于那些必须执行JS才能拿到内容的页面。

编码问题别忽视

page_source返回的是Python的str类型,Unicode字符串。但偶尔会遇到乱码,尤其是中文页面。原因通常是浏览器对页面编码的判断和实际编码不一致。可以在driver.get()之前设置:

options = webdriver.ChromeOptions() options.add_argument("--lang=zh-CN") driver = webdriver.Chrome(options=options) 

或者在拿到源码后手动处理编码。不过这种情况现在越来越少了,现代浏览器对编码的自动检测已经做得不错。

无头模式下的差异

用--headless跑的时候,page_source有时候和正常模式拿到的内容不一样。我遇到过一次,某个网站检测到无头浏览器后返回了不同的页面内容。加个--user-agent伪装一下就好了。这也是Selenium被反爬的一个典型场景——navigator.webdriver属性在无头模式下是true,有些网站会检查这个。

如果不需要浏览器界面,无头模式确实省资源。但别默认它和正常模式行为完全一致。

拿到源码之后

源码拿到手,接下来一般是丢给BeautifulSoup或lxml解析。这里有个小建议:如果页面结构复杂,与其用Selenium的find_element一个个找元素,不如直接取page_source然后用BeautifulSoup做解析。Selenium的元素查找在复杂页面上性能并不好,每次调用都是一次跨进程通信。批量取源码再离线解析,速度会快很多。

当然,如果页面有iframe,记得先driver.switch_to.frame()再取源码,否则拿到的是外层页面的HTML,iframe里的内容看不到。

说到底,page_source就是Selenium提供的一个快照。什么时候取这个快照,取之前页面处于什么状态,直接决定了你拿到的东西有没有用。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap