当前位置:首页 > 知识

易语言网页采集教程

用易语言做网页采集,易语言网页采核心就三件事:发请求、集教拿源码、易语言网页采抠数据。集教别把它想复杂了,易语言网页采网上那些教程动不动就上正则、集教多线程、易语言网页采代理池,集教新手看完直接劝退。易语言网页采我刚开始玩采集的集教时候,用易语言写的易语言网页采第一段代码,总共不到二十行,集教照样把某论坛的易语言网页采帖子标题全扒下来了。

先解决“发请求”这一步。集教易语言自带“网页_访问”命令,易语言网页采在“精易模块”里,没这个模块你连门都进不去。下载好模块,在支持库配置里勾上,代码里写:

网页源码 = 到文本 (网页_访问 (“https://www.example.com/list?page=1”))

就这么一行。返回值就是服务器吐给你的HTML。别管什么User-Agent、Cookie,先跑通再说。我第一次测试拿的是某新闻站,直接返回200,源码里密密麻麻的<div class="title">,看着就踏实。

拿到源码之后,才是真正动手的地方。很多教程一上来就让你学正则表达式,我不推荐。易语言有“文本_取出中间文本”这个命令,比正则直观十倍。比如源码里有这么一段:

<a href="/post/12345.html" class="title">易语言采集实战</a>

你想拿到标题“易语言采集实战”,写:

标题 = 文本_取出中间文本 (网页源码, “class="” + #引号 + “title” + #引号 + “>”, “</a>”)

看着有点绕,因为引号要转义。实际写的时候用常量或者直接拼接,跑一次就懂了。取链接同理,把href="和"之间的内容抠出来。我见过有人用正则搞了半小时,用取出中间文本三分钟搞定。

但这里有个坑:如果一页有二十个标题,你上面那种写法只能取到第一个。怎么办?用“文本_取中间_批量”命令,它返回一个文本数组。代码大概长这样:

标题数组 = 文本_取中间_批量 (网页源码, “class="” + #引号 + “title” + #引号 + “>”, “</a>”)
计次循环首 (取数组成员数 (标题数组), i)
调试输出 (标题数组 [i])
计次循环尾 ()

跑起来,输出窗口唰唰唰列出所有标题。那一刻的爽感,比打游戏通关还实在。

分页怎么处理?观察URL规律。大多数网站是page=1、page=2这样递增。写个循环,把页码拼进去:

计次循环首 (10, 页数)
网址 = “https://www.example.com/list?page=” + 到文本 (页数)
网页源码 = 到文本 (网页_访问 (网址))
' 接着抠数据
计次循环尾 ()

十页数据,几秒钟跑完。但你要真这么干,大概率会被封IP。我试过连续请求某电商网站,前三十页正常,第三十一页直接返回403。解决办法也简单——加延时。在循环里塞一句延时 (2000),两秒一次,稳得很。别贪快,采集是长跑,不是百米冲刺。

还有编码问题。有些网站是GBK,有些是UTF-8。易语言默认处理GBK,遇到UTF-8的页面,取出来的中文全是乱码。用“编码_Utf8到Ansi”转一下就行:

网页源码 = 编码_Utf8到Ansi (网页_访问 (“https://www.example.com”))

这个坑我踩过三次。第一次以为是模块坏了,重装;第二次以为是网站反爬,换IP;第三次才反应过来是编码。现在养成了习惯,拿到源码先看<meta charset=那一行。

最后说个真事。上个月帮朋友采集某政府公开数据,网站结构乱得要命,标题和日期混在一个<td>里。我用取出中间文本硬抠,抠了四十多行代码,跑一遍发现漏了三条。后来换了个思路,先把整个<table>取出来,再按<tr>分割,最后逐行处理。代码反而短了,准确率也上去了。采集这活儿,有时候退一步看整体结构,比死磕局部字符串管用。

工具就是这些:精易模块、网页_访问、文本_取出中间文本、文本_取中间_批量、编码转换、延时。组合起来能应付八成以上的静态网页。动态加载的?那得抓包找接口,又是另一个故事了。

分享到: