日期:2014-05-16  浏览次数:20412 次

抓取代理IP遇到的javascript解析问题

1. 问题描述:

利用脚本去自动从下面的这个网站抓取一些proxy ip:

[http://www.samair.ru/proxy/ip-address-01.htm]

[http://www.samair.ru/proxy/ip-address-02.htm]

[http://www.samair.ru/proxy/ip-address-03.htm]

...

[http://www.samair.ru/proxy/ip-address-30.htm]

?

通过curl跟awk,sed结合去抓取解析页面信息来获取代理IP跟Port

?

问题是抓取下来的结果中含有javascript代码如下:

110.77.204.131<script type="text/javascript">document.write(":"+u+w+u+w)</script>

从上面的代码可以看到,port变成了一些javascript变量输出。

?

通过firebug去分析,原来页面include了一个js文件,其中就一个函数来定义了每个英文字母对应的数字值。

?

再进一步调查,发现这个网站提供了几十页的proxy ip,但是每一页包含的js字符转换函数都不同。

?

为了让脚本能获取到正确的Port数值,必须解决如何解析这个js函数来获取最终的字母数字值对应表。

?

2. 解决方案:

利用Rhino Shell[https://developer.mozilla.org/en-US/docs/Rhino/Shell]来加载获取这个函数结果,在这个函数最后加上以下代码,把其中的变量名跟对应值输出:

? ? for(name in this) {print(name+\":\"+this[name]);}

?

测试结果如下:

$> rhino -f temp.js?

t:5

h:4

n:7

y:3

o:8

j:2

m:6

g:0

l:1

r:9

?

3. 测试跟源码:

getProxyList.sh:

#!/bin/bash

?

test_url=$1

?

temp_js="$(date +%Y_%m_%d_%H_%M_%S).js"

?

page_content=`curl -s -G "${test_url}"`

?

hostName=`printf "%s" "${test_url}" | sed -n -e '{s/.*\(http:\/\/\\)\([^\/]*\).*/\1\2/g;p;}'`

?

js_path=`printf "%s\n" "${page_content}" | \

sed -n -e '/type="text\/javascript"/p' | \

sed -n -e '/src="\/js\/[0-9]*\.js"/p' | \

sed -n -e '{s/.*src="\([^"]*\)".*/\1/g;p;}'`

?

js_content=`curl -s -G "${hostName}${js_path}"`

?

getAllVarJs="for(name in this) {print(name+\":\"+this[name]);}"

?

printf "%s\n%s" "${js_content}" "${getAllVarJs}" > "${temp_js}"

?

sed_sub_str=`rhino -f "${temp_js}" | \

awk -F ':' '

{

printf"s/%s/%s/g;",$1,$2;

}END{printf"\n"}'`

?

# printf "%s\n" "${sed_sub_str}"

?

printf "%s\n" "${page_content}" | \

awk '{printf"%s",$0}END{printf"\n"}' ?| \

sed -n -e '{s/.*<table id="proxylist">\(.*\)<\/table>.*/\1/g;p;}' | \

sed -n -e '{s/^[[:blank:]][[:blank:]]*//g;p;}' | \

sed -n -e '{s/>[[:blank:]][[:blank:]]*</></g;p;}' | \

sed -n -e '{s/\(<\/tr>\)/\1\n/g;p;}' | \

sed -n -e '{/script/p}' | \

sed -n -e '{s/<tr>//g;s/<\/tr>//g;s/<\/td>//g;p;}' ?| \

awk -F '<td>' '{print $2}' | \

sed -n -e '{s/\(.*\)<script.*write(":"\(.*\)).*/\1:\2/g;s/+//g;p;}' | \

sed -n -e '{'"${sed_sub_str}"'p;}'

?

rm -f "${temp_js}"

?

$> sh getProxyList.sh http://www.samair.ru/proxy/ip-address-02.htm

110.208.26.192:9000

110.208.26.204:9000

110.208.26.221:9000

110.208.27.111:9000

110.208.27.118:9000

110.208.27.142:9000

110.208.27.60:9000

110.208.27.75:9000

110.5.104.238:80

110.78.162.238:3128

111.1.32.51:82

111.119.161.46:80

...

?

4. 进一步研究:

以上解决方案是需要手工分析对应代码,找到对应的JS方法来做解析分析。

应该有更加智能自动的方法来模拟firefox浏览器直接生成js运行后的html代码。

如有同学知道这类工具,请回复。

?

?

?

?

?