|如何使用Python和Selenium抓取网站简单的信息

文章图片

文章图片

文章图片

文章图片

文章图片

文章图片

文章图片
几乎从万维网诞生之日起 , 就已经使用Web抓取从网站中提取数据 。 早期 , 抓取主要是在静态页面上进行的 , 带有已知元素 , 标签和数据的页面 。
但是 , 最近 , Web开发中的先进技术使这项任务变得更加困难 。 在本文中 , 我们将探讨在新技术和其他因素阻止标准抓取的情况下 , 如何抓取数据 。
传统数据抓取
由于大多数网站会生成供人类阅读而不是自动阅读的页面 , 因此 , 网络抓取主要包括以编程方式消化网页的标记数据(例如右键单击 , 查看源代码) , 然后检测该数据中的静态模式来允许程序“读取”各种信息并将其保存到文件或数据库中 。
如果通常要找到报告数据 , 则可以通过将表单变量或参数传递给URL来访问数据 。 例如:
Python已成为最流行的Web抓取语言之一 , 主要原因是:Python创建了各种Web库 , 可以直接进行调用 , 用来从HTML和XML文件中提取数据 , 省去了自己编写的过程 。
基于浏览器的抓取
传统方法已经无法将进行有效的数据抓取 , 主要面临以下几个困难:
- 证书 。 需要安装证书才能访问网站上数据所在的部分 。 访问初始页面时 , 出现提示 , 要求我选择计算机上安装的正确证书 , 然后单击“确定” 。
- iframe 。 该网站使用的是iframe , 这使我的常规抓取工作陷入困难 。 有一个方法可以克服这种困难 , 可以尝试查找所有iframe网址 , 然后构建一个站点地图 , 但这工作量会变得很大 。
- JavaScript 。 在填写带有参数(例如 , 客户ID , 日期范围等)的表格后访问数据 。 通常 , 会绕过表单 , 而只是将表单变量(通过URL或作为隐藏的表单变量)传递到结果页面并查看结果 。 但是在这种情况下 , 表单包含JavaScript , 这不允许我以常规方式访问表单变量 。
因此 , 要 - Requests(for making HTTP requests)
- URLLib3(URL handling)
- Beautiful Soup(in case Selenium couldn’t handle everything)
- Selenium(for browser-based navigation)
我还向脚本添加了一些调用参数(使用argparse库) , 以便可以使用各种数据集 , 从命令行使用不同的选项调用脚本 。这些包括客户ID , 从月/年到月/年 。
Seleniumis
总的来说 , Seleniumis作为web应用程序的开源测试框架而流行 , 它使QA能够执行自动化测试、执行回放和实现远程控制功能(允许使用多个浏览器实例进行负载测试和多种浏览器类型) 。
用于web抓取的常用语言是Python , 因为它有集成良好的库 , 通常可以处理所需的所有功能 。 当然 , Selenium库存在于Python中 。 这将允许我实例化一个浏览器Chrome Firefox IE等等 , 然后假装我自己正在使用这个浏览器 , 来访问我正在寻找的数据 。
Project setup
要开始实验 , 我需要设置项目并获得所需的一切 。使用Windows 10计算机 , 并确保具有相对更新的Python版本(版本3.7.3) 。创建了一个空白的Python脚本 , 然后 , 如果还没有加载库 , 请使用PIP(Python的软件包安装程序)加载认为可能需要的库 。下面这些是开始使用的主要库:
Problem 1 – the certificate
我需要做出的第一个选择是要告诉Selenium使用哪种浏览器 。由于我通常使用Chrome , 并且它建立在开源Chromium项目(也可以Edge , Opera和Amazon Silk浏览器使用)上 , 因此我认为我会首先尝试 。
我可以通过添加所需的库组件来在脚本中启动Chrome , 然后发出几个简单的命令:
由于我没有以headless模式启动浏览器 , 因此 , 浏览器实际上出现了 , 我可以看到它在做什么 。它立即要求我选择一个证书(我以前安装过) 。
首先要解决的问题是证书 。 如何选择合适的并接受它才能进入网站?在对脚本的第一次测试中 , 我得到了这个提示:
这可不太好 , 我不想每次运行脚本时都手动单击“确定”按钮 。
事实证明 , 我无需编程即可找到解决方法 。虽然我希望Chrome能够在启动时通过证书验证 , 但是该功能并不存在 。但是 , 如果Windows注册表中存在某个条目 , Chrome确实可以自动选择证书 。您可以将其设置为选择它看到的第一个证书 , 或者更具体 。由于我只加载了一个证书 , 因此我使用了通用格式 。
因此 , 有了这个设置 , 当我告诉Selenium启动Chrome并出现一个证书提示时 , Chrome将自动选择证书并继续运行 。
Problem 2 – Iframes
现在我在站点中 , 出现了一个表单 , 提示我输入客户ID和报告的日期范围 。
通过在开发人员工具(F12)中检查表单 , 我注意到表单是在iframe中显示的 。 因此 , 在开始填充表单之前 , 需要切换到存在表单的适当iframe 。 为此 , 我调用了Seleniums开关功能 , 就像这样:
很好 , 它现在在正确的框架中 , 我能够确定组件 , 填充客户ID字段并选择日期下拉列表:
Problem 3 – JavaScript
表单上只剩下单击Find按钮 , 因此它将开始搜索 。 这有点棘手 , 因为Find按钮似乎是由JavaScript控制的 , 而不是一个普通的提交类型按钮 。 在开发人员工具中检查它 , 我找到了按钮图像 , 并能够通过右键单击获得它的XPath 。
然后 , 借助此信息 , 我在页面上找到了该元素 , 然后单击了它 。
瞧 , 表格已经提交 , 数据就出现了! 现在 , 我可以在结果页面上抓取所有数据并按需保存 。
Getting the data
首先 , 必须处理搜索什么都找不到的情况 。那很简单 。它会在搜索表单上显示一条消息而不会留下它 , 例如“找不到记录” 。 我只是搜索该字符串 , 如果找到它就停在那里 。
但是 , 如果结果确实实现了 , 数据将以div的形式加一个加号(+)来显示 , 以打开页面并显示其所有详细信息 。一个已打开的页面记录显示减号(-) , 单击该标记将关闭div 。单击加号将调用一个URL以打开其div并关闭所有打开的div 。
因此 , 有必要在页面上找到任何加号 , 收集每个加号旁边的URL , 然后遍历每个加号以获取每个事务的所有数据 。
在上面的代码中 , 我检索的字段是事务类型和状态 , 然后将其添加到计数中 , 以确定有多少事务符合指定的规则 。但是 , 我可以在页面明细中检索其他字段 , 例如日期和时间 , 子类型等 。
对于此项目 , 计数已返回给调用应用程序 。但是 , 它和其他抓取的数据也可能已存储在平面文件或数据库中 。
其他可能的BUG和解决方案
使用您自己的浏览器实例抓取现代网站时 , 可能还会遇到许多其他困难 , 但是大多数困难都可以解决 。这里有一些解决方法:
在浏览自己的网页时 , 你多久会发现自己在等待一个页面出现 , 有时要等好几秒钟?当以编程方式导航时 , 也会发生同样的情况 。 您寻找一个类或其他元素 , 但它不存在 , 幸运的是 , Selenium能够等待 , 直到它看到某个元素 , 如果元素没有出现 , 它可能时 , 就像这样:
通过验证码:某些站点使用验证码或类似内容来防止有害的机器人(他们可能会认为您是机器人) 。你可以在抓取里设置一个阻尼器 , 并使其减慢抓取速度 。
对于简单的提示(例如“ 2 + 3是多少?”) , 通常可以轻松阅读并弄清楚 。但是 , 对于更高级的验证 , 有些库可以帮助尝试破解它 。 例如2Captcha , Captcha的Death和Bypass Captcha 。
Summary: Python and Selenium
这是一个简短的演示 , 无论使用什么技术和涉及什么复杂性 , 几乎所有网站都可以被抓取 。基本上 , 如果您可以自己浏览该网站 , 则通常可以将其抓取 。
现在 , 需要说明的是 , 这并不意味着每个网站都会被抓取 。 有些网站有适当的合法限制 , 可以很简单的去理解 , 我想这个并没有任何困难 。 另一方面 , 一些网站欢迎并鼓励从其网站抓取数据 , 在某些情况下还提供了API来简化检索 。
【|如何使用Python和Selenium抓取网站简单的信息】无论哪种方式 , 最好在开始任何项目之前 , 先阅读条款和条件 。 要做一个合法的公民 。
推荐阅读
- 看观汽车|原装进口发动机,入门7万出头,看着动感坐着舒适,丰田致享如何
- 星车记|买车后如何正确调节座椅?
- 林郑月娥首度承认使用信用卡受限|被美国列入制裁名单,林郑月娥首度承认使用信用卡受限,有不便但感光荣
- 地震|菲律宾发生6.6级地震,地震来了该如何逃生?
- 思萌娱乐|老人收藏慈禧唯一真实照片,专家问多少钱才捐,老人如何回答的
- 喵家影视|求指导~河流退水后,如何能够钓到大草鱼?
- 孩子不爱收拾?如何提升孩子积极性,增强孩子的内因引导
- 央视新闻微信号|被叫停6年,木里矿区仍现大量存煤,盗采黑手如何伸进祁连山?
- 大众轿跑SUV探岳X上市—探岳/GTE/R-line/X四孪生兄弟该如何选?
- 看航海家如何用饱满的“汁水”挑动众人的味蕾
