抓取代理IP遇到的javascript解析问题 curlrhinojavascript
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代码。
如有同学知道这类工具,请回复。
下一篇: vue 怎么创建组件及组件使用方法