本文实现一个较为复杂的自动化流程,从多Web页面中提取到我们需要的信息。
要求
具体需要实现的完整流程描述如下:
1. 访问 http://fahao.07073.com/19547.html,截图如下:
2. 点击每一个 “淘号”,如果没有登录,即提示登录,如果已经登录,则在一个弹出的iframe里显示一个号码。
我们需要把这个号码得到。
3. 每页25个号码,一共74页,第一页url为 http://fahao.07073.com/19547.html,第二页为http://fahao.07073.com/19547-2.html,第三页为 -3,类推。
简单的方法恐怕不行,我们需要一种更为合理的方法。
实现
先看一下点击淘号时发生了什么,每点击,其实是调用一个叫activate()的javascript函数,参数是8位的数字id。这个函数把 id组装到类似下面的url里,
http://fahao.07073.com/?action=sumtao&id=15721753
其中 15721753便是其中的id。通过访问此url,返回iframe里的内容,iframe里的号码以”XX4670t6XF21783″的形式表达,前2个是XX打头,其后是13位或字母或数字。
因此我们的实现流程就简单了,分为四步,1. 根据页面pattern下载全部的74个网页的内容,存在本地;2. 利用规则表达式提取到id;3. 利用id组装合适的url,再次把全部的iframe 下载到本地;4. 对全部的iframe进行分析,提取礼包号码。
其中,几个规则表达式的pattern可以表示为,
id: “activate(d{8})”
礼包号: “value=””w{15}”””
对应与流程,实现为4个ahk脚本。
dl_all_pages.ahk,下载全部页码的网页内容,保存在pages目录下,命名为 页码.html,如9.html表示第9页的内容,70.html表示第70页的内容。其中使用了ahk自带的 urldownloadtofile函数。
; Author: Zhuotong Nan (giscn@msn.com)
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
pg :=74
;download all pages
loop,%pg%
{
pageurl_pat = http://fahao.07073.com/19547-%A_Index%.html
urldownloadtofile,%pageurl_pat%,pages%A_Index%.html
}
find_ids.ahk,从74页内容html文件中提取到全部的id,保存在ids.txt文件里。id以分号(;)分隔。
; find ids
ids :=””
outfile_ids := “ids.txt”
loop,pages*.html
{
fileread,file_cont,pages%a_loopfilename%
;parse “activate(16492748)” from file_cont
startpos :=1
loop
{
pos :=regexmatch(file_cont,”activate(d{8})”,””,startpos)
startpos := pos+17
if pos=0
break
id:=substr(file_cont,pos+9,8)
ids = %id%;%ids%
}
}
fileappend,%ids%,%outfile_ids%
dl_wl3hao.ahk,根据id号,下载全部的iframe,iframe里包括需要的礼包号码,每个id下载过来的内容保存在以id命名的txt里,放在nos目录下。
id_file :=”ids.txt”
fileread,file_cont,%id_file%
;http://fahao.07073.com/?action=sumtao&id=15721753
loop,Parse,file_cont,;
{
urldownloadtofile,http://fahao.07073.com/?action=sumtao&id=%a_loopfield%,nos%a_loopfield%.txt
}
find_wl3_gifts.ahk,根据iframe内容,利用规则表达式得到需要的信息。保存在gifts.txt里,每行一个礼包号。
; find wl3 gift no
gifts :=””
outfile_gifts := “gifts.txt”
loop,nos*.txt
{
fileread,file_cont,nos%a_loopfilename%
;parse value=”XX4670t6XF21783″ from file_cont
pat:= “value=””w{15}”””
pos :=regexmatch(file_cont,pat)
gift:=substr(file_cont,pos+7,15)
gifts = %gift%`r`n%gifts%
}
fileappend,%gifts%,%outfile_gifts%
最终的gifts.txt 如下图所示。
结论
本文演示了如何从一个比较复杂的多网页批量提取需要的数据。利用了一些基本的网络函数,和规则表达式。使用AHK实现。有关AHK的更多介绍可以参阅其官方网站,google, autohotkey即可找到。