规章库中的RPA挑战与Python解决方法

in #cn3 months ago

昨天晚上,8月31日,我想在国家规章库里找到一些应急管理部(https://www.gov.cn/zhengce/xxgk/gjgzk/
)的法律法规。这个库在中国政府网上,有2574个法律文件,页面看起来很简单。只要点击右边的链接,就可以看到清晰的法规文本。我觉得这是个好机会,决定用RPA自动化程序写个简单代码来处理这些文件。

我的计划很简单,就是用RPA影刀程序循环打开这些页面,然后摘取需要的内容。然而,当程序运行到第二次循环时,总是失败。我在社区发帖搜索相应的问题进行求助,但没有找到答案。于是,我决定自己动手,调试代码。

在调试时,我发现虽然文件名可以成功获取,但链接全都是空值。看起来这是页面的一种反爬手段,不允许程序自动抓取数据。于是,我决定放弃RPA程序,改用Python手动摘取文件名和链接。

我打开了浏览器的开发者模式,仔细查看法律法规条文的链接文件名和一些style和class属性。找到相关的class特征后,我让ChatGPT帮我写一段代码。我告诉GPT:

编写python程序,使用模拟网页操作的库获取资料。最初的网址为:“https://www.gov.cn/zhengce/xxgk/gjgzk/index.htm?searchWord=”;要求设置请求头以模拟浏览器避免被察觉并拒绝;网页加载成功后,点击网页的元素“应急管理部”,链接未查询到。点击该元素后,网页右侧部分会加载应急管理部的法律法规若干条,然后按照上面的内容摘取链接和文件名,需要摘取的内容特点在<div class="wgx main-content">;我需要摘取的内容为其中的链接和文件名。示例为:“<a docurl="http://www.gov.cn/zhengce/2015-03/16/content_5712842.htm"><h5>金属非金属矿山建设项目安全设施目录(试行)</h5>”。将这些内容写入一个二维列表。
获取该页面数据后,点击该页面的“下一页”。页面加载后,重复上面摘取链接和文件名的操作,将获得的二维列表内容和上一页的列表,以追加的方式添加。直到最后一页,将列表内容写入excel表格,保存在桌面。

它很快给了我代码,但运行时报错。问题出在我的ChromeDriver版本太旧,和当前Chrome浏览器不兼容。

我赶紧去升级ChromeDriver,但是我不知道是否这个软件的下载也有限制,很多镜像网站都打不开,只能用英文网站。英文对我来说有些不是很顺,一开始还找错了地方。费了一些功夫,我终于下载到了正确的ChromeDriver。经过几次尝试,我发现只需要把新的ChromeDriver和它的附属文件复制到原来的文件夹中,就可以正常运行了。从114版本升级到128版本,和浏览器一致。

升级完ChromeDriver,问题解决了一部分,但新的挑战又来了。页面的反爬措施依然在起作用。我试着模拟人工操作,但程序还是找不到应急管理部的具体位置。虽然应急管理部在网页上唯一且有明确的class属性,但运行时总是模拟点击失败。

我无奈之下,安排程序暂停,手动点击了应急管理部的按钮,然后再让程序自动摘取文件名和链接。这一步倒是顺利了,但点击下一页按钮时,又遇到了新的麻烦。页面上“下一页”的按钮属性比较特殊,不能用常规方法获取。我于是再次使用开发者模式找到了“下一页”按钮的class属性(class="turnPage next-page">下一页</>
),把它告诉ChatGPT。它帮助我写了一段新的代码,这次程序终于能准确定位到“下一页”按钮了。

然而,麻烦还是没有结束。当页面到达最后一页时,“下一页”按钮变成了灰色,无法点击。但程序还是不断尝试点击,陷入了死循环。为了避免这个问题,我找到“下一页”按钮变成灰色时的disable属性( class="turnPage next-page" disabled="disabled">下一页)
),再次让ChatGPT修改了代码。然而,尽管加入了disable这个条件,程序仍然会不断点击“下一页”。看样子这可能也是反爬的一个策略(我的水平太低,超级小白,只是想借人工智能的力量干点事)。

无奈之下,我只能另想办法。通过目测页面数量,我告诉程序根据页面数量和用户输入的页数进行操作。当然,这部分我要求程序用图形交互的模式进行操作,否则太麻烦了。这样,程序运行得比较顺畅,终于能够正常提取所有页面的内容了。

此外,我还下载了住房和城乡建设部的法律法规文件名和链接。接下来,我打算先用这些文件名和链接尝试打开对应的网页,并摘取其中的内容。只有摘取成功后,我才会继续处理其他部门的法律法规。

Coin Marketplace

STEEM 0.22
TRX 0.20
JST 0.034
BTC 99266.82
ETH 3364.44
USDT 1.00
SBD 3.11