如何用PHP制作一个可以点击按钮并在页面上提交表单的网络爬虫



我在经过大量研究后发布了这个问题,同时也了解到这个问题的标题可能会引发人们对我制作这样一个爬虫的意图的怀疑。

所以,我想我必须描述一下我所面临的情况。

我是印度的执业律师(在一些国家是"律师");他喜欢并从事编码和Linux方面的工作。对于印度的执业律师来说,最大的挑战之一(以及其他许多挑战)是在执业过程中必须经历很多卑微的任务。查看每日原因清单(法院每天公布的清单,显示今天列出的案件)就是这样一项任务。

印度的法院没有统一的案件清单机制。他们中的大多数人都有发布案件的网站,但并没有以统一的格式发布。一个网站会将它们发布为PDF,有些则以表格形式发布为HTML页面

一名法律办事员几乎每天都会花相当多的时间查看这些原因清单,以了解第二天会发生哪些案件。有时,书记员可能会错过一个职位(因为很多异常情况;法院登记问题)。

这促使我写了一个脚本(用Python),为我以前的办公室有很多案件的特定法庭制作一个爬虫。然后,我用PHP重写了它。

现在,我想为它添加更多功能,以浏览其他法院的列表。然而,我遇到了一个障碍,因为有些网站发布的列表不是纯HTML,而是PDF文件。为了下载PDF文件,我必须点击按钮并提交表格。

例如,我所讨论的法院是喀拉拉邦高等法院。他们的原因列表页面是用HTML/PHP编写的,然而,相关的选项卡和按钮使用JavaScript(我根本不熟悉)。因此,我需要模拟点击和浏览按钮和表单(提交日期)。

处理获得的PDF文件完全是另一回事(我认为这是可能的)。

因此,我的问题。

首先,让我们澄清一下:访问某些网站并执行某些操作的网络爬虫需要

  • 能够发送请求
  • 解析HTML
  • 执行Javascript

您将需要某种浏览器,可以是广泛可用的浏览器,也可以是浏览器引擎。对于基于PHP的浏览器引擎,请阅读问题、文章,在这里找到最适合你的:PHP无头浏览器?

几年前,我们和我以前的教授一起写了一篇关于语义提取的文章。我们的想法是通过将HTML规则映射到可以嵌入其中的概念中,将HTML代码转换为语义层次结构。我们已经在Javascript中实现了概念验证,多年来我在许多与PHP相关的提取任务中都使用了它,通常可以在数小时内解决大型问题。一种非常简单实用的方法是实现服务器端代码,我主要用PHP来实现,在那里你可以加载你的页面,向目标网站发送请求,并将响应传输到你的浏览器。通过这种代理,您可以建立与您打算挖掘的网站的连接,从而将其HTML发送回您的浏览器。

您将面临的问题:

  • CSS文件的相对URL
  • Javascript文件的相对URL
  • 通过Javascript发送到相关URL的请求
  • 其他资源(即图像)的相对URL

您需要修复所有这些URL差异,以便加载的页面能够正常工作。

当页面通过代理运行时,您可以实现自己的Javascript,该脚本将在页面加载后执行,并使用代理添加要加载的Javascript。这将确保您的脚本(无论是什么)能够执行您需要的操作。

现在,要执行的Javascript应该是什么?基本上,您可以使用开发工具在原始站点上进行实验。

例如:您知道您需要登录,这包括填写用户名/密码并单击按钮。你可能需要一个看起来像这样的脚本,但这因站点而异:

document.getElementById("username").value = "myusername";
document.getElementById("password").value = "mypassword";
document.getElementById("login").click();

因此,您创建了一个内容与上面类似的脚本,并确保在加载页面时完成。当然,您可能需要实现导航和实际提取。由于您需要一个文件,它将出现在您的下载文件夹中。它超出了这个答案的范围,所以我将专注于提取。您可能还需要重复进行分页或永久滚动,您可以相应地在Javascript中触发事件。

如果出于某种原因,这种简单化的方法不适合你,那么这个想法应该使用你选择通过PHP使用的浏览器引擎,缺点是你通常无法进行可视化测试。

你不一定需要像我们在论文中提出的那样的专业体系,但如果你需要,那么你可能想阅读我们写的论文和其他类似的论文。为了总结语义树背后的思想,您可以为您拥有的概念定义一些抽象的导航和/或提取规则,这些规则将在共享同一概念的多个网站上工作,并且概念更改的可能性/频率低于网站中的结构更改。因此,您定义了在特殊情况下可以推翻的一般规则。例如,如果你抓取了100个不同的网站,所有这些网站都有一些带有页面和有用记录的表,所有这些都有一些详细链接,那么这个概念就可以概括起来,你在站点到站点级别的问题就简化为";如何将我的一般概念应用于该特定结构";,它通常只涉及每个站点的几行JS,而您对提取的数据所做的内部逻辑在各个站点之间保持准相似。

有时,您只需在浏览器的开发工具中查看网络活动,就可以查看它生成的URL。

例如,我看到一个hckerala.gov.in/causelist.php的请求。

你可以在你的网络爬虫或终端中提出这个请求,例如,使用cURL:

curl https://hckerala.gov.in/causelist.php -H 'User-Agent: Mozilla/5.0 (Linux)' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'X-Requested-With: XMLHttpRequest' -H 'Origin: https://hckerala.gov.in' -H 'Referer: https://hckerala.gov.in/causelist.php' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' --data-raw 'type=fetchlistbyjudge&judge=159&list_date=07-04-2021'

以下是我得到的数据:

{"VC (HONOURABLE MRS. JUSTICE ANU SIVARAMAN) Chamber list 2":{"cases":{"KLHC010025852021":{"cino":"KLHC010025852021","case_details":"WP(C) 935/2021","pet_name":"V.S. HARIKUMAR","res_name":"THE SECRETARY TO GOVERNMENT","pet_adv":["S.V.PREMAKUMARAN NAIR","SRI.R.T.PRADEEP","SMT.M.BINDUDAS","SRI.K.C.HARISH"],"res_adv":["SRI.JIBU P THOMAS","SRI.V.A.MUHAMMED","SRI.M.SAJJAD","GOVERNMENT PLEADER- SERVED ON"],"regcase_type":157,"reg_no":935,"reg_year":2021,"room_no":"VC                  ","cheader":" BY VIDEO CONFERENCINGrnNOTE: 1. PARTICIPANTS WHO ARE ATTENDING THE VIDEO CONFERENCINGrnSHOULD JOIN BY 10.00 AMrn2. THE ADVOCATES SHOULD FOLLOW THE PRESCRIBED DRESS CODE,rnWITH OR WITHOUT ROBES AND GOWN","cfooter":"","for_bench_id":4274,"originalsr_no":0,"main_sr_no":138,"clink_code":"215700019342021","main_case":

最新更新