Author: Zhuotong Nan (giscn@msn.com)
AHK是很好用的在windows下实现自动化的脚本语言,对于有一定编程基础的童鞋,很快就可以上手写代码。ahk的官方网址是http://www.autohotkey.com/,其forum里有大量的他人写好的脚本。
本文实现一个从网页里自动提取数据的一个例子。
目的
从40407.com网站里自动批量得到《武林3》70区豪侠礼包代码。原始网站界面如下,
1. 进入http://fahao.40407.com/11417.html,点击“淘号”按钮,如果未登陆,则提示登录。登录后弹出淘号界面如下图,
从界面中获取以XX打头的15位代码。
2. 关闭“查看卡号”,然后重复步骤1,可以得到一系列的代码。
现在的目的是实现其自动化,并把得到的代码保存到一个文本文件(gifts.txt)里。
实现
1. 点击“我要淘号”时,本地与远程有一个通讯。利用chrome自带的inspect element的network功能(也可以用任何网络分析工具),在“我要淘号”上右键选 inspect element, 到Network tab上,这时点一下“我要淘号”执行一次通讯,Network将捕捉到通讯信息。
我们可以看到通讯的header。我们需要做的是模拟chrome的通讯用ahk来实现。
2. ahk有几个有用的他人写的http通讯脚本,一个叫httpquery,一个叫httprequest,都很优秀,但前者2010年后已经不再继续支持,并且不支持cookies文件头。而cookie信息是我们这个任务里的关键,否则“我要淘号”返回是要求登陆的信息。httprequest可以从这个网址下载:http://www.autohotkey.com/community/viewtopic.php?t=73040
3. 代码实现。本代码实现了自动获取500个号码。
; Author: Zhuotong Nan (giscn@msn.com)
; Date: 8/8/2012loop, 500
{
url := “http://fahao.40407.com/app/common.php”
data := “a=taohao&id=11417”header :=”Cookie: PHPSESSID=da317c26545caafa204520e4c89276c9; DedeUserID=427080; DedeUserID__ckMd5=d770e5fdd4d5a237; DedeLoginTime=1344523159; DedeLoginTime__ckMd5=2233e446322305d5; Hm_lvt_75e3d45d3ad80ecb1af209e743d1b514=1344521115290,1344521187845,1344523168489; Hm_lpvt_75e3d45d3ad80ecb1af209e743d1b514=1344523168489`nReferer: http://fahao.40407.com/11417.html`nConnection: keep-alive”
options :=””bytes := httprequest(url, data, header, options)
sleep 500
;parse gift code
pos:=Regexmatch(data,”XXw{13}”)if pos!=0
{
code := substr(data,pos,15)
fileappend,%code%`n,gifts.txt
}sleep 1000
fileappend,%data%`n,test.html
}#include httprequest.ahk
ESC::
exitapp
4. 注意httprequest有4个参数,参数1是访问的地址,参数2是上传的数据(post data)和下载过来的内容(放同一个参数里),参数3是上传的http头,响应的http头也在参数3里,参数4是选项。我们需要使用的是前3个参数。注意参数3 header的构造,不同的key-value对使用分行符(`n)来分隔。而且这里必须要增加cookie信息,这个信息可以从chrome里分析得到。传回来的数据存放在参数2,data里。
5. 使用了正则表达式,从下载过来的data 里进行pattern分析。礼包代码是以XX开头的15长度的大小写字母和数字组成。表达式为XXw{13}。
6. #include httprequest.ahk 把httprequest脚本包括进来,所以前文可以调用httprequest函数。
7. 获取的代码存放在 gifts.txt里。
8. 使用本代码前,必须事先用chrome (或者IE等别的浏览器,需要对应获取其cookie)登录成功。按esc键随时退出。
结论
本文演示了使用AHK从网页自动批量获取指定数据。使用了httprequest方法,其中关键是必须维持cookie信息。
使用本代码前,必须事先用chrome