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代码。
如有同学知道这类工具,请回复。
相关推荐
一款很好用的代理IP抓取软件,可设定自动抓取代理IP的时间段,可设定开机启动,自动去重,自动存档,支持后台操作。
通过Java网络爬虫爬取指定代理ip网上的ip,利用了jsoup、httpclient技术实现
一个文件抓取免费的代理IP,验证后并存入mysql数据库,另一个文件循环排除已失效的IP,可用来创建自己的代理IP池
抓取网页IP和端口并设置代理 可以抓取下面网页的IP和端口 http://www.cnproxy.com/proxy1.html 个人写着用的。
代理IP自动抓取并检查 c# 源码及exe
在使用爬虫爬取网络数据时,如果长时间对一个网站进行抓取时可能会遇到IP被封的情况,这种情况可以使用代理更换ip来突破服务器封IP的限制。 随手在百度上搜索免费代理IP,可以得到一系列的网站,这里我们通过对西刺...
免费抓取代理IP,自动搜索网络代理,抓取代理网站内容
根据输入的ip段获取ip所属地址信息
爬虫抓取京东价格 解析Json格式 对所有开发抓取京东价格人员非常有帮助。
提供公开代理ip的抓取,以及代理的管理后台,以及代理的展示后台。 目前是使用scrapy来抓取 ,上的公开代理,使用flask来管理抓取到的代理,以及对其它爬虫提供代理服务,使用react + flux来管理代理的后台页面。 但...
node.js实现抓取代理ip 主要文件:index.js /* * 支持:node.js v7.9.0 */ const cheerio=require('cheerio'); const fetch =require('node-fetch'); const Promise=require('bluebird'); let mongoose=require('...
可以抓取网路中的所有ip包!可以方便学习者更直观的查看各种基于ip的协议。
智能导入文本IP:可以从任意文本文件中解析出IP 智能导网页IP:可以从任意网址网页中解析出IP 智能搜捕IP:自动从搜索引擎搜捕海量IP 智能绿色IP代理软件 简单点击立即生效
php抓取ip138数据库的代码,在命令行下执行效率最高,经测试,网页下载速率可达700kb/s,数据库设计按照id、开始ip、结束ip、地址一、地址二设计,有效减小数据库体积,提高检索效率。使用时请先安装php及mysql
Web数据抓取中的正则表达式解析2022优秀文档.pptx
在线抓取百度地图,使用JavaScript在线抓取,代码很少。
# 此项目的目的是为了抓取测试各代理免费IP,并测试提供可使用的IP给其他爬虫使用 import requests import re import random import time import os from functools import reduce """ 1.随机报头 2.ip地址池 """ # ...
在不知道设备地址的情况下,轻松获取ip地址,进行设备配置
python代码获取免费的代理ip,每次运行自动抓取最新的西刺免费代理IP
易语言伪造网页访问ip地址 结合HTTP扩展请求头 X-Forwarded-For 可以...X-Forwarded-For 后面就会继续添加该代理设备的IP地址。 因此,一般来说,我们要获得客户端地址,直接从 X-Forwarded-For 拿到第一个 IP 地址即可