`
cncomkyle
  • 浏览: 19587 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

抓取代理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内容

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}"

 

#rhino运行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代码。

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

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics