我们爬取网页过程中,经常发现我们想要获得的数据并不能简单的通过解析HTML代码获取
1. 使用示例
2. 详细介绍
2.1 声明浏览器对象
2.2 访问页面
2.3 查找元素
2.3.1 单个元素
下面是详细的元素查找方法
第二种:
2.3.2 多个元素
2.4 元素交互操作
比如说在搜索框内输入文字:
2.5 交互动作
2.6 执行JavaScript
比如拖拽下拉
2.7 获取元素信息
2.7.1 获取属性
2.8 Frame
2.9 等待
2.9.1 隐式等待
需要特别说明的是:
2.9.2 显式等待
2.10 浏览器的前进/后退
2.11 对Cookies进行操作
2.12 选项卡管理
就可以使用selenium来实现。
文深入探讨如何运用PHP高效获取网页HTML元素信息。
运用文件读取函数,获取网页数据。
利用PHP脚本的强大功能,网页数据的采集中极为便捷,各类网页元素亦可转化为字符形式线上展现。
2.使用正则表达式匹配目标元素
面对诸多网页需求,巧妙运用正则表达式可以精准且迅速搜寻并提取所需的HTML元素。核心技术在于结合正则表达式与网页数据,以实现精确筛选及获取这些元素的目的。
3.使用DOMDocument类解析网页
借助 DOMDocument 类,PHP 为我们提供了深入分析和处理网页的途径。该类功能强大且易用,尤其以其精准读取 HTML 文档树及其灵活操作的表现,在准确获取所需元素方面具有显著优势。
4.使用Simple HTML DOM库
对于正则表达式和DOMDocument类的初学者而言,可能会遭遇困难。为提升工作效率,可尝试借助于诸如Simple HTML DOM这类第三方工具。该工具能准确挖掘所需HTML元素,大幅缩减项目开发时间。
5.使用XPath查询语言
凭借其卓越性能,XPath在应对XML及HTML文档元素抽取任务中表现非凡,为我们提供了对HTML元素的精准与灵动操纵。
6.使用cURL库发送HTTP请求
借助PHP中cURL库的功能优势,我们能够精确满足各种网络页面内容获取和模拟仿真的需求,从而突出页面关键信息的精度提取。
7.处理JavaScript生成的内容
针对个性化需求,运用JavaScript也可实现网站内容的动态生产。为高效达成此目的,我们能依赖于PHP所提供的两种无头浏览器工具包——Selenium以及PhantomJS。
8.处理AJAX请求返回的数据
为了实现在网页间的数据交互和沟通,尤其是借助AJAX技术模拟网络传输和数据获取过程的各项操作,我们会充分利用PHP中独有的CURL模块和众多第三方厂商开发的高效能库,它们将会成为你处理海量信息的强大后盾。
9.使用API接口获取数据
若目标网站具备API访问许可,那么仅需根据接口文档所指定的请求参数,便可自动获取并拆分JSON或者XML格式的回馈数据,进而达到信息交换的目标。
10.注意事项和其他方法
在获取网页中的HTML元素时,需要注意以下几点:
-确保目标网页存在且可访问;
-遵守目标网站的使用规则和法律法规;
-防止对目标网站造成过大的访问压力;
-根据具体需求选择合适的方法和工具。
运用此策略,能精准提取所需HTML组件,为构建多样化应用及特性提供强大后盾。盼望本文能对您在PHP开发过程中网页元素搜寻有所裨益。
析动态内容
根据权威机构发布的全球互联网可访问性审计报告,全球约有四分之三的网站其内容或部分内容是通过JavaScript动态生成的,这就意味着在浏览器窗口中“查看网页源代码”时无法在HTML代码中找到这些内容,也就是说我们之前用的抓取数据的方式无法正常运转了。解决这样的问题基本上有两种方案,一是JavaScript逆向工程;另一种是渲染JavaScript获得渲染后的内容。
JavaScript逆向工程
下面我们以“360图片”网站为例,说明什么是JavaScript逆向工程。其实所谓的JavaScript逆向工程就是找到通过Ajax技术动态获取数据的接口。
但是当我们在浏览器中通过右键菜单“显示网页源代码”的时候,居然惊奇的发现页面的HTML代码中连一个<img>标签都没有,那么我们看到的图片是怎么显示出来的呢?原来所有的图片都是通过JavaScript动态加载的,而在浏览器的“开发人员工具”的“网络”中可以找到获取这些图片数据的网络API接口,
那么结论就很简单了,只要我们找到了这些网络API接口,那么就能通过这些接口获取到数据,当然实际开发的时候可能还要对这些接口的参数以及接口返回的数据进行分析,了解每个参数的意义以及返回的JSON数据的格式,这样才能在我们的爬虫中使用这些数据。
关于如何从网络API中获取JSON格式的数据并提取出我们需要的内容,在之前的《文件和异常》一文中已经讲解过了,这里不再进行赘述。
使用Selenium
尽管很多网站对自己的网络API接口进行了保护,增加了获取数据的难度,但是只要经过足够的努力,绝大多数还是可以被逆向工程的,但是在实际开发中,我们可以通过浏览器渲染引擎来避免这些繁琐的工作,WebKit就是一个利用的渲染引擎。
WebKit的代码始于1998年的KHTML项目,当时它是Konqueror浏览器的渲染引擎。2001年,苹果公司从这个项目的代码中衍生出了WebKit并应用于Safari浏览器,早期的Chrome浏览器也使用了该内核。在Python中,我们可以通过Qt框架获得WebKit引擎并使用它来渲染页面获得动态内容,关于这个内容请大家自行阅读《爬虫技术:动态页面抓取超级指南》一文。
如果没有打算用上面所说的方式来渲染页面并获得动态内容,其实还有一种替代方案就是使用自动化测试工具Selenium,它提供了浏览器自动化的API接口,这样就可以通过操控浏览器来获取动态内容。首先可以使用pip来安装Selenium。
pip3 install selenium
下面以“阿里V任务”的“直播服务”为例,来演示如何使用Selenium获取到动态内容并抓取主播图片。
import requests from bs4 import BeautifulSoup def main(): resp = requests.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang') soup = BeautifulSoup(resp.text, 'lxml') for img_tag in soup.select('img[src]'): print(img_tag.attrs['src']) if __name__ == '__main__': main()
运行上面的程序会发现没有任何的输出,因为页面的HTML代码上根本找不到<img>标签。接下来我们使用Selenium来获取到页面上的动态内容,再提取主播图片。
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.common.keys import Keys def main(): driver = webdriver.Chrome() driver.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang') soup = BeautifulSoup(driver.page_source, 'lxml') for img_tag in soup.body.select('img[src]'): print(img_tag.attrs['src']) if __name__ == '__main__': main()
在上面的程序中,我们通过Selenium实现对Chrome浏览器的操控,如果要操控其他的浏览器,可以创对应的浏览器对象,例如Firefox、IE等。运行上面的程序,如果看到如下所示的错误提示,那是说明我们还没有将Chrome浏览器的驱动添加到PATH环境变量中,也没有在程序中指定Chrome浏览器驱动所在的位置。
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
为了解决上面的问题,可以到Selenium的官方网站找到浏览器驱动的下载链接并下载需要的驱动,在Linux或macOS系统下可以通过下面的命令来设置PATH环境变量,Windows下配置环境变量也非常简单,不清楚的可以自行了解。
export PATH=$PATH:/Users/Hao/Downloads/Tools/chromedriver/
其中/Users/Hao/Downloads/Tools/chromedriver/就是chromedriver所在的路径。
*请认真填写需求信息,我们会在24小时内与您取得联系。