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

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

文章图片

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

文章图片

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

文章图片

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

文章图片

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

文章图片

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

文章图片

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

文章图片



几乎从万维网诞生之日起 , 就已经使用Web抓取从网站中提取数据 。 早期 , 抓取主要是在静态页面上进行的 , 带有已知元素 , 标签和数据的页面 。
但是 , 最近 , Web开发中的先进技术使这项任务变得更加困难 。 在本文中 , 我们将探讨在新技术和其他因素阻止标准抓取的情况下 , 如何抓取数据 。
传统数据抓取
由于大多数网站会生成供人类阅读而不是自动阅读的页面 , 因此 , 网络抓取主要包括以编程方式消化网页的标记数据(例如右键单击 , 查看源代码) , 然后检测该数据中的静态模式来允许程序“读取”各种信息并将其保存到文件或数据库中 。

如果通常要找到报告数据 , 则可以通过将表单变量或参数传递给URL来访问数据 。 例如:

Python已成为最流行的Web抓取语言之一 , 主要原因是:Python创建了各种Web库 , 可以直接进行调用 , 用来从HTML和XML文件中提取数据 , 省去了自己编写的过程 。
基于浏览器的抓取
传统方法已经无法将进行有效的数据抓取 , 主要面临以下几个困难:

  • 证书 。 需要安装证书才能访问网站上数据所在的部分 。 访问初始页面时 , 出现提示 , 要求我选择计算机上安装的正确证书 , 然后单击“确定” 。
  • iframe 。 该网站使用的是iframe , 这使我的常规抓取工作陷入困难 。 有一个方法可以克服这种困难 , 可以尝试查找所有iframe网址 , 然后构建一个站点地图 , 但这工作量会变得很大 。
  • JavaScript 。 在填写带有参数(例如 , 客户ID , 日期范围等)的表格后访问数据 。 通常 , 会绕过表单 , 而只是将表单变量(通过URL或作为隐藏的表单变量)传递到结果页面并查看结果 。 但是在这种情况下 , 表单包含JavaScript , 这不允许我以常规方式访问表单变量 。
  • 因此 , 要做好放弃传统抓取方法 , 而是研究一种可能的基于浏览器抓取的工具 。 这与正常情况下的工作方式有所不同 , 与其直接进入页面 , 下载分析树并提取数据元素 , 不如使用浏览器访问所需的页面 , 然后抓取数据 , 这种抓取方法 , 无需处理上述障碍 。
    Seleniumis
    总的来说 , Seleniumis作为web应用程序的开源测试框架而流行 , 它使QA能够执行自动化测试、执行回放和实现远程控制功能(允许使用多个浏览器实例进行负载测试和多种浏览器类型) 。
    用于web抓取的常用语言是Python , 因为它有集成良好的库 , 通常可以处理所需的所有功能 。 当然 , Selenium库存在于Python中 。 这将允许我实例化一个浏览器Chrome Firefox IE等等 , 然后假装我自己正在使用这个浏览器 , 来访问我正在寻找的数据 。
    Project setup
    要开始实验 , 我需要设置项目并获得所需的一切 。使用Windows 10计算机 , 并确保具有相对更新的Python版本(版本3.7.3) 。创建了一个空白的Python脚本 , 然后 , 如果还没有加载库 , 请使用PIP(Python的软件包安装程序)加载认为可能需要的库 。下面这些是开始使用的主要库:
  • Requests(for making HTTP requests)
  • URLLib3(URL handling)
  • Beautiful Soup(in case Selenium couldn’t handle everything)
  • Selenium(for browser-based navigation)
  • 我还向脚本添加了一些调用参数(使用argparse库) , 以便可以使用各种数据集 , 从命令行使用不同的选项调用脚本 。这些包括客户ID , 从月/年到月/年 。
    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抓取网站简单的信息】无论哪种方式 , 最好在开始任何项目之前 , 先阅读条款和条件 。 要做一个合法的公民 。


    推荐阅读