欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-29 08:58:51
...

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代码。

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