当前位置: 首页 > news >正文

利用Selenium和PhantomJS提升网页内容抓取与分析的效率

核心观点:效率的提升之道

Selenium本身是一个自动化测试工具,用于模拟真实用户操作。直接使用它来爬虫可能会很慢。提升效率的关键在于,将其从“模拟视觉化用户”转变为“高性能的无头数据采集工具”。

第一部分:为什么是 Selenium + 无头模式?

  1. 处理动态内容:对于通过JavaScript异步加载数据的页面(如单页应用SPA),传统的<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">Requests</font>库无法获取完整内容。Selenium可以驱动浏览器完整执行JS,直接获取最终渲染的DOM。
  2. 绕过简单反爬:可以模拟真实浏览器的行为,如滚动、点击、输入等,使得爬虫行为更接近人类,从而绕过一些基于用户行为检测的反爬机制。
  3. 无头模式的效率飞跃
    • PhantomJS的遗产:PhantomJS是早期无头浏览器的代表,不需要图形界面,节省了资源。
    • 现代替代品:Chrome和Firefox都推出了原生的无头模式,性能更优,兼容性更好,是当前的主流选择。我们应放弃PhantomJS,转向Chrome/Firefox的无头模式

第二部分:现代化高效实践(代码示例)

以下示例均使用 Selenium + Chrome 无头模式

1. 基础设置:启用无头模式并优化选项
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
import zipfile# 代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 创建Chrome选项
chrome_options = Options()# 创建代理认证插件
def create_proxy_auth_extension(proxy_host, proxy_port, proxy_username, proxy_password, scheme='http'):"""创建带有代理认证的Chrome扩展"""# 插件配置manifest_json = """{"version": "1.0.0","manifest_version": 2,"name": "Chrome Proxy","permissions": ["proxy","tabs","unlimitedStorage","storage","<all_urls>","webRequest","webRequestBlocking"],"background": {"scripts": ["background.js"]},"minimum_chrome_version":"22.0.0"}"""background_js = """var config = {mode: "fixed_servers",rules: {singleProxy: {scheme: "%s",host: "%s",port: parseInt(%s)},bypassList: ["localhost"]}};chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});chrome.webRequest.onAuthRequired.addListener(function(details) {return {authCredentials: {username: "%s",password: "%s"}};},{urls: ["<all_urls>"]},['blocking']);""" % (scheme, proxy_host, proxy_port, proxy_username, proxy_password)# 创建临时插件文件import tempfileimport osfrom pathlib import Pathplugin_dir = tempfile.mkdtemp()plugin_file = Path(plugin_dir) / "proxy_auth_plugin.zip"with zipfile.ZipFile(plugin_file, 'w') as zp:zp.writestr("manifest.json", manifest_json)zp.writestr("background.js", background_js)return plugin_file# 创建代理认证插件
proxy_plugin = create_proxy_auth_extension(proxy_host=proxyHost,proxy_port=proxyPort,proxy_username=proxyUser,proxy_password=proxyPass
)# 添加插件到Chrome选项
chrome_options.add_extension(proxy_plugin)# 核心:启用无头模式
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1920,1080")# 可选:禁用图片加载
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)# 初始化驱动
driver = webdriver.Chrome(options=chrome_options)try:# 测试代理是否生效driver.get("https://httpbin.org/ip")page_source = driver.page_sourceprint(page_source)print("代理设置成功!")# 您的实际爬虫代码# driver.get("https://example.com")# ... 其他操作finally:driver.quit()# 清理临时文件import osimport shutilplugin_dir = os.path.dirname(proxy_plugin)if os.path.exists(plugin_dir):shutil.rmtree(plugin_dir)
2. 效率提升技巧:智能等待代替固定休眠

固定使用<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">time.sleep()</font>是效率低下的主要原因。应使用显式等待

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdriver.get("https://example.com/dynamic-content")try:# 显式等待:最多等10秒,直到指定元素出现在DOM中# 一旦元素出现,立即继续执行,无需等待完10秒target_element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "dynamic-content-list")))# 对找到的元素进行操作items = target_element.find_elements(By.TAG_NAME, "li")for item in items:print(item.text)except Exception as e:print("元素未在指定时间内加载出来:", e)
3. 高级分析:直接执行JavaScript获取数据

有时,数据直接保存在页面的JS变量中,直接提取比解析HTML更高效。

# 假设页面有一个JS变量:var userData = {name: "John", id: 123};
user_data = driver.execute_script("return window.userData;")
print(user_data) # 直接得到Python字典:{'name': 'John', 'id': 123}# 或者,用JS进行复杂的DOM查询或操作
all_links_text = driver.execute_script("""var links = Array.from(document.querySelectorAll('a'));return links.map(link => link.textContent);
""")
print(all_links_text)

第三部分:超越基础,构建稳健的爬虫系统

  1. 并发与池化
    • 使用<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">concurrent.futures.ThreadPoolExecutor</font>管理多个浏览器实例。
    • 注意:每个WebDriver实例资源开销大,需要根据机器性能谨慎控制并发数。
    • 考虑使用<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">selenium-grid</font>进行分布式爬取。

规避检测

- <font style="color:rgb(15, 17, 21);">现代网站会检测自动化工具。可以使用</font>`<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">selenium-stealth</font>`<font style="color:rgb(15, 17, 21);">等库来隐藏Selenium的特征。</font>
- <font style="color:rgb(15, 17, 21);">随机化用户代理、视口大小和鼠标移动轨迹。</font>
  1. python
from selenium_stealth import stealth
# ... 驱动初始化后
stealth(driver,languages=["en-US", "en"],vendor="Google Inc.",platform="Win32",webgl_vendor="Intel Inc.",renderer="Intel Iris OpenGL Engine",fix_hairline=True,)
  1. 错误处理与重试机制
    • 网络不稳定、元素未找到等情况很常见,必须使用<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">try-except</font>块并实现重试逻辑。

总结:效率提升清单

操作低效做法高效做法
浏览器模式使用有图形界面的浏览器使用Chrome/Firefox无头模式
等待方式大量使用<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">time.sleep(n)</font>使用**<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">WebDriverWait</font>**
显式等待
资源加载加载所有图片、CSS、字体禁用图片加载,可选择性阻塞不必要资源
驱动管理每次任务都创建/销毁驱动考虑使用驱动池(需自行实现)
数据提取仅通过<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">page_source</font>
然后解析
结合**<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">execute_script</font>**
直接从JS上下文获取
并发单线程顺序爬取多线程/分布式(Selenium Grid)

最终建议:虽然Selenium功能强大,但它始终是资源密集型工具。在爬虫项目中,应遵循 “首选轻量级,不得已再用Selenium” 的原则。首先尝试分析网站的API接口(通过浏览器开发者工具的“网络”面板),能用<font style="color:rgb(15, 17, 21);background-color:rgb(235, 238, 242);">Requests</font>模拟API调用是速度最快、最稳定的方案。当面对纯JS渲染、且没有清晰API的网站时,Selenium配合无头浏览器才是你的终极武器。

http://www.dtcms.com/a/549058.html

相关文章:

  • QML学习笔记(四十七)QML与C++交互:上下文对象
  • 农业物联网实践:基于 ESP8266 与土壤传感器的智能灌溉系统开发与部署
  • 【Windows 10 企业版 LSTC】下安装【英特尔® 显卡控制中心】
  • Linux常用操作命令详解
  • 十堰专业网站建设公司网站建设预算
  • 深圳网站设计+建设首选网站开发iis怎么配置
  • Angular【起步】
  • Unity ComputeShader入门指南
  • 铜鼻子冷压端子视觉检测机 尺寸外观瑕疵自动化检测设备
  • 强化学习(RL)简介及其在大语言模型中的应用
  • 沈阳自主建站模板网站代理维护
  • 东莞做展示网站的公司济南网络科技公司排名
  • 云栖实录 | 阿里云发布Elasticsearch Serverless 2.0,重塑AI搜索时代基础设施
  • 解决 InfiniteScroll 滚动 BUG
  • Python实现随机选播视频的示例代码
  • 做网站开发多少钱制作网站步骤
  • CSS实现渐变色边框(Gradient borders)
  • 本地部署集成全能平台 Team.IDE 并实现外部访问
  • 深圳科技网站建设字节跳动公司简介
  • 前端技术栈全景图:从HTML到现代框架的演进之路
  • 手机网站 制作睢宁县凌城做网站的
  • DeerFlow介绍
  • Java 程序员的 Vue 指南 - Vue 万字速览(01)
  • TortoiseSVN 右键不显示的解决方法
  • 仓颉语言实战:从零构建闰年判断工具库
  • 网络基础知识简易急速理解---BGP边界网关协议
  • 【Linux网络】Socket编程实战,基于UDP协议的Echo Server
  • 函数列的上下极限
  • C#面试题及详细答案120道(31-40)-- 委托与事件
  • 网站设计排名北京sem分析