Python爬取动态网页:Selenium与Dryscrape实战指南
本文详解Python爬取动态网页的两种主流方案:Dryscrape与Selenium。重点讲解Selenium在Ubuntu下的安装步骤,包括geckodriver的下载与路径配置,以及解决Firefox版本兼容性问题。通过代码示例演示如何调用浏览器引擎获取JS执行后的页面源码,并解决常见报错,如模块调用错误及元素定位方法。
Python拥有丰富的网络爬虫库,能帮助用户便捷地抓取页面并提取有价值的数据。然而,常规爬虫往往只能获取静态HTML源代码,类似于浏览器中的“查看网页源代码”功能,无法捕获JavaScript脚本执行后生成的动态内容。针对这一痛点,本文提供几种Python抓取JS渲染后页面信息的可行方案。
1、两种基本的解决方案
1.1 用dryscrape库动态抓取页面
JavaScript脚本需由浏览器引擎执行并返回结果,因此,模拟浏览器行为是抓取JS渲染页面的直接方式。WebKit作为开源浏览器引擎,Python提供了多个库来调用它,其中dryscrape便是其中之一,专门用于处理包含JS等复杂内容的网页。
import dryscrape # 使用dryscrape库 动态抓取页面 def get_url_dynamic(url): session_req=dryscrape.Session() session_req.visit(url) #请求页面 response=session_req.body() #网页的文本 #print(response) return response get_text_line(get_url_dynamic(url)) #将输出一条文本
该方法同样适用于其他包含JS的网页。尽管能满足动态页面抓取需求,但其显著缺点是速度极慢。考虑到Python调用WebKit请求页面、加载JS文件、执行脚本并返回结果的全过程,耗时较长是必然的。此外,还有PythonWebkit、PyWebKitGit、Pygt(可用于编写浏览器)及pyjamas等库也能实现类似功能。
1.2 selenium web测试框架
Selenium是一个Web测试框架,允许调用本地浏览器引擎发送网页请求,因此同样可用于抓取页面内容。
# 使用 selenium webdriver 可行,但会实时打开浏览器窗口
def get_url_dynamic2(url): driver=webdriver.Firefox() #调用本地的火狐浏览器,Chrom 甚至 Ie 也可以的 driver.get(url) #请求页面,会打开一个浏览器窗口 html_text=driver.page_source driver.quit() #print html_text return html_text get_text_line(get_url_dynamic2(url)) #将输出一条文本
这也可视为一种临时解决方案。与Selenium类似的框架还有windmill,但因其配置相对复杂,此处不再赘述。
2、selenium的安装与使用
2.1 selenium的安装
在Ubuntu系统中,可直接通过pip install selenium进行安装。需注意以下版本差异原因:
1. Selenium 3.x版本起,在webdriver/firefox/webdriver.py的__init__方法中,executable_path参数默认为"geckodriver";而2.x版本中该参数为"wires"。
2. Firefox 47及以上版本,需下载第三方驱动,即geckodriver。
此外,还需执行以下特殊操作:
1. 下载geckodriver,下载地址为:
mozilla/geckodriver
2. 解压后将geckodriver文件移动至/usr/local/bin/目录下即可:
sudo mv ~/Downloads/geckodriver /usr/local/bin/
2.2 selenium的使用
1. 常见运行报错:
driver = webdriver.chrome() TypeError: 'module' object is not callable
解决方案:浏览器名称需严格区分大小写,应使用Chrome、Firefox或Ie。
2. 通过
content = driver.find_element_by_class_name('content')
定位元素时,该方法返回FirefoxWebElement对象。若要获取包含的文本值,可通过
value = content.text
到此这篇关于python如何爬取动态网站的文章就介绍到这了,更多相关python怎么动态网站内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









