Board logo

标题: [原创]用wget简单检测代理服务器是否可用 [打印本页]

作者: lxmxn     时间: 2006-11-27 12:27    标题: [原创]用wget简单检测代理服务器是否可用


  平时上网的时候,有时会使用到代理服务器,常规的做法是去一些提供代理服务器列表的网站找一些我们想要的代理。但是上面有很多代理都是不可用的,难道要用手工一个个的去试哪个代理是否可用吗?用我们的批处理脚本就可以完成这个任务了。

  利用wget的代理功能,来下载一个固定的网页,比如www.baidu.com,我下载的是www.ip138.com这个网页,来达到简单检测一些网站的代理服务器列表是否可用的目的。我用的提供代理服务器列表的网站是:http://www.cnproxy.com/proxyedu1.html
   
  这个批处理并非可以完美的达到我们的目的,里面还有很多参数和格式可以修改,大家可以按照自己的意愿去修改里面的语句和参数。大家有什么意见也可以跟帖提出来。这个批处理最好可以放在一个文件夹中运行,因为中间会生成很多文件。

  关于wget这个小工具,可以在论坛里搜索一下,就可以找到了。

  在此,感谢 electronixtar 兄的提议和 redtek 兄的帮助。
@echo off&setlocal ENABLEDELAYEDEXPANSION&title 代理检测
if exist proxyedu1.html del proxyedu1.html /a/s >nul
if exist useproxy.txt del /a/q useproxy.txt
echo 于 %date% %time% 检测 http://www.cnproxy.com/proxyedu1.html 可用代理如下: >useproxy.txt
echo;>>useproxy.txt
echo ############################################################# >>useproxy.txt
wget http://www.cnproxy.com/proxyedu1.html >nul 2>nul
for /f "tokens=1,2 delims=^<trd>: " %%a in ('type proxyedu1.html ^| findstr /c:"HTTP" ') do (
        set set=
        set set=%%a
        set "set=!set:&#8205=!"
        set "set=!set!:%%b"
        echo 正在检测 !set! 代理,请稍等....
        wget -q -T 3 -t 1 -e "http_proxy=!set!" http://www.ip138.com -O - >nul 2>nul && echo 检测到 ******* !set! ******* 代理可用&&echo ----!set! >>useproxy.txt
)
start useproxy.txt
goto :eof


[ Last edited by lxmxn on 2006-11-27 at 01:01 PM ]
作者: 无奈何     时间: 2006-11-27 12:49
不错,不错,应该好好挖掘一下 wget 的功能。
wget 有几点给你补充一下:
wget -q 不输出下载记录信息
wget -O -  将下载内容输出到屏幕,不写入文件。
作者: lxmxn     时间: 2006-11-27 12:53

  多谢版主的指点啊。

  由于刚学习使用wget,所以还没发现这么多好用的参数呢,就连那个-t参数都是百度了才知道的。汗一个。
  
  我再把代码完善一下。

作者: redtek     时间: 2006-11-27 22:06
这么好玩的代码,又实用又给下载提供了更多的方便~:)))
欣赏~~
作者: vkill     时间: 2006-11-27 22:38
我以前也试过wget && 没有试成,可能没有加参数吧!
作者: electronixtar     时间: 2006-11-27 23:29
顶啊,我们教育网用户的福音啊!
作者: electronixtar     时间: 2006-11-27 23:52
忘记加分了,原创辛苦,狂顶
作者: vkill     时间: 2006-11-28 00:28
2个月前弄的自动设置代理的就因为没有法子验证而遗憾,现在呵呵~thanks
作者: NaturalJ0     时间: 2006-11-28 00:41
好东西啊。
下次是不是准备加入排序功能了?
作者: electronixtar     时间: 2006-11-28 01:01
在加入一个自动生成 pac 配置文件的~~哈哈
作者: a9319751     时间: 2006-11-28 01:01
GNU Wget 1.10.2, a non-interactive network retriever.
Usage: wget [OPTION]... [URL]...

Mandatory arguments to long options are mandatory for short options too.

Startup:
  -V,  --version           display the version of Wget and exit.
  -h,  --help              print this help.
  -b,  --background        go to background after startup.
  -e,  --execute=COMMAND   execute a `.wgetrc'-style command.

Logging and input file:
  -o,  --output-file=FILE    log messages to FILE.
  -a,  --append-output=FILE  append messages to FILE.
  -d,  --debug               print lots of debugging information.
  -q,  --quiet               quiet (no output).
  -v,  --verbose             be verbose (this is the default).
  -nv, --no-verbose          turn off verboseness, without being quiet.
  -i,  --input-file=FILE     download URLs found in FILE.
  -F,  --force-html          treat input file as HTML.
  -B,  --base=URL            prepends URL to relative links in -F -i file.

Download:
  -t,  --tries=NUMBER            set number of retries to NUMBER (0 unlimits).
       --retry-connrefused       retry even if connection is refused.
  -O,  --output-document=FILE    write documents to FILE.
  -nc, --no-clobber              skip downloads that would download to
                                 existing files.
  -c,  --continue                resume getting a partially-downloaded file.
       --progress=TYPE           select progress gauge type.
  -N,  --timestamping            don't re-retrieve files unless newer than
                                 local.
  -S,  --server-response         print server response.
       --spider                  don't download anything.
  -T,  --timeout=SECONDS         set all timeout values to SECONDS.
       --dns-timeout=SECS        set the DNS lookup timeout to SECS.
       --connect-timeout=SECS    set the connect timeout to SECS.
       --read-timeout=SECS       set the read timeout to SECS.
  -w,  --wait=SECONDS            wait SECONDS between retrievals.
       --waitretry=SECONDS       wait 1..SECONDS between retries of a retrieval.
       --random-wait             wait from 0...2*WAIT secs between retrievals.
  -Y,  --proxy                   explicitly turn on proxy.
       --no-proxy                explicitly turn off proxy.
  -Q,  --quota=NUMBER            set retrieval quota to NUMBER.
       --bind-address=ADDRESS    bind to ADDRESS (hostname or IP) on local host.
       --limit-rate=RATE         limit download rate to RATE.
       --no-dns-cache            disable caching DNS lookups.
       --restrict-file-names=OS  restrict chars in file names to ones OS allows.
       --user=USER               set both ftp and http user to USER.
       --password=PASS           set both ftp and http password to PASS.

Directories:
  -nd, --no-directories           don't create directories.
  -x,  --force-directories        force creation of directories.
  -nH, --no-host-directories      don't create host directories.
       --protocol-directories     use protocol name in directories.
  -P,  --directory-prefix=PREFIX  save files to PREFIX/...
       --cut-dirs=NUMBER          ignore NUMBER remote directory components.

HTTP options:
       --http-user=USER        set http user to USER.
       --http-password=PASS    set http password to PASS.
       --no-cache              disallow server-cached data.
  -E,  --html-extension        save HTML documents with `.html' extension.
       --ignore-length         ignore `Content-Length' header field.
       --header=STRING         insert STRING among the headers.
       --proxy-user=USER       set USER as proxy username.
       --proxy-password=PASS   set PASS as proxy password.
       --referer=URL           include `Referer: URL' header in HTTP request.
       --save-headers          save the HTTP headers to file.
  -U,  --user-agent=AGENT      identify as AGENT instead of Wget/VERSION.
       --no-http-keep-alive    disable HTTP keep-alive (persistent connections).
       --no-cookies            don't use cookies.
       --load-cookies=FILE     load cookies from FILE before session.
       --save-cookies=FILE     save cookies to FILE after session.
       --keep-session-cookies  load and save session (non-permanent) cookies.
       --post-data=STRING      use the POST method; send STRING as the data.
       --post-file=FILE        use the POST method; send contents of FILE.

HTTPS (SSL/TLS) options:
       --secure-protocol=PR     choose secure protocol, one of auto, SSLv2,
                                SSLv3, and TLSv1.
       --no-check-certificate   don't validate the server's certificate.
       --certificate=FILE       client certificate file.
       --certificate-type=TYPE  client certificate type, PEM or DER.
       --private-key=FILE       private key file.
       --private-key-type=TYPE  private key type, PEM or DER.
       --ca-certificate=FILE    file with the bundle of CA's.
       --ca-directory=DIR       directory where hash list of CA's is stored.
       --random-file=FILE       file with random data for seeding the SSL PRNG.
       --egd-file=FILE          file naming the EGD socket with random data.

FTP options:
       --ftp-user=USER         set ftp user to USER.
       --ftp-password=PASS     set ftp password to PASS.
       --no-remove-listing     don't remove `.listing' files.
       --no-glob               turn off FTP file name globbing.
       --no-passive-ftp        disable the "passive" transfer mode.
       --retr-symlinks         when recursing, get linked-to files (not dir).
       --preserve-permissions  preserve remote file permissions.

Recursive download:
  -r,  --recursive          specify recursive download.
  -l,  --level=NUMBER       maximum recursion depth (inf or 0 for infinite).
       --delete-after       delete files locally after downloading them.
  -k,  --convert-links      make links in downloaded HTML point to local files.
  -K,  --backup-converted   before converting file X, back up as X.orig.
  -m,  --mirror             shortcut for -N -r -l inf --no-remove-listing.
  -p,  --page-requisites    get all images, etc. needed to display HTML page.
       --strict-comments    turn on strict (SGML) handling of HTML comments.

Recursive accept/reject:
  -A,  --accept=LIST               comma-separated list of accepted extensions.
  -R,  --reject=LIST               comma-separated list of rejected extensions.
  -D,  --domains=LIST              comma-separated list of accepted domains.
       --exclude-domains=LIST      comma-separated list of rejected domains.
       --follow-ftp                follow FTP links from HTML documents.
       --follow-tags=LIST          comma-separated list of followed HTML tags.
       --ignore-tags=LIST          comma-separated list of ignored HTML tags.
  -H,  --span-hosts                go to foreign hosts when recursive.
  -L,  --relative                  follow relative links only.
  -I,  --include-directories=LIST  list of allowed directories.
  -X,  --exclude-directories=LIST  list of excluded directories.
  -np, --no-parent                 don't ascend to the parent directory.

Mail bug reports and suggestions to <bug-wget@gnu.org>.
作者: lxmxn     时间: 2006-11-28 03:44


  Quote:
下次是不是准备加入排序功能了?

  兄弟说的是以什么排序?

  Quote:
在加入一个自动生成 pac 配置文件的~~哈哈

  不懂pac文件的格式,请指点一下。。

作者: snowbbbb     时间: 2006-11-28 03:48
先给vkill兄弟说声对不起~ 点着看的时候不小心点到那了 好奇之下看了看 结果扣了你一分
你也来扣我一分吧 或者哪天我见你发言的时候再给你加上一分
作者: NaturalJ0     时间: 2006-11-28 04:32
排序是指,用户指定一个网页要上,然后按连接这个网页的速度把可用代理显示出来。
作者: ccwan     时间: 2006-11-28 04:46
好啊!刚刚试过,很棒!给兄加分了。
作者: lxmxn     时间: 2006-11-28 05:58

  Re : NaturalJ0

  谢谢兄的提议。
  我想了一下,发现wget里面有一个 -S 参数可以统计下载的详细信息,包括了连接的速度,速度是通过前后两个时间间接得到的,如果要排序的话,必须要分析这个 -S 参数得到的信息,这样势必会比较麻烦。而且楼顶的代码里面,设置的wget超时获取网页的时间是3秒钟,这样检测出来的速度应该是可以的,如果你要更快的代理连接速度,那么可以修改 -T 参数的值。

  Re ccwan :

  多谢兄弟的鼓励。

作者: wang6610     时间: 2006-11-28 06:51
它会会接着检测第2、3...页吗?
作者: lxmxn     时间: 2006-11-28 11:39

  Re : wang6610

  它只能检测指定的那一业网页代理列表,如果你想检测其它的页面的代理列表,可以手动添加URL到批处理里面。我也会尽量完善它的。

作者: yunlin     时间: 2006-11-28 13:10
DDDDDDDDDDDDDDD
作者: bigcarp     时间: 2007-1-8 23:39
好!顶
作者: lixinwu     时间: 2007-1-25 17:00
真是不错,可惜只能验证那一个网站的代理,换一个就不行了,那个网站的代理全部失效了,最好找个能天天更新的验证。或者把代码编写的智能一些,可以对付大部分的代理站点。
作者: lixinwu     时间: 2007-1-25 17:55
大侠能不能帮忙把这个网站的代理提出并验证啊?http://proxy.chedan.org/
作者: vkill     时间: 2007-1-26 02:01


  Quote:
Originally posted by lixinwu at 2007-1-25 17:55:
大侠能不能帮忙把这个网站的代理提出并验证啊?http://proxy.chedan.org/

不知道p-proxy能否帮你
作者: lixinwu     时间: 2007-1-26 03:03
好啊,请p-proxy大侠来帮帮忙啊!
作者: lixinwu     时间: 2007-1-26 04:23
哦,原来是个程序啊。。。。使用了一下,可惜不支持这个网站的代码
作者: lixinwu     时间: 2007-1-26 04:24
用楼主的代码改一下应该可以提取,楼主这个也简洁的多,体积小的多。。。
作者: honghunter     时间: 2007-12-4 07:16
不好意思,翻老贴了。

主要是一直没有看懂下面几句,希望能有大侠给讲解一二:

1       set set=                                
2       set set=%%a
3       set "set=!set:&#8205=!"
4       set "set=!set!:%%b"

主要疑问:
1,是否系统的关键字作为环境变量名字,不会有问题吗?
2,为什么每次设置前,都要设置为空一次?第一句可以省略吗?
3,看网页的原始内容是:
<tr><td>202.105.182.20&#8205:80</td><td>HTTP</td><td>328,813,813</td><td>广东省珠海市</td></tr>
不太明白代理地址截取出来的算法。
作者: honghunter     时间: 2007-12-4 07:59
还有个问题,就是当源代码中的数据,变成如下形式的时候,怎么兼顾两张方式哪?
<tr><td>211.142.213.11&#8204&#8205:80</td><td>HTTP</td><td>110,7203,7203</td><td>湖南省长沙市 移动</td></tr>
作者: honghunter     时间: 2007-12-4 08:04

REM $Id: get.proxy.bat 80 2007-12-04 08:21:12Z honghunter $
REM 原作者:lxmxn
REM 摘自:http://www.cn-dos.net/forum/viewthread.php?tid=25126&fpage=0&highlight=&page=1
REM
IF "%ORG_PATH%"=="" CALL D:\dev\dps4e\check_proxy\env_setting.bat

@ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION&title 代理检测

IF "%1"=="sub1" GOTO sub1

:main
IF EXIST useproxy.txt DEL /a/q useproxy.txt

FOR /L %%A IN (1,1,10) DO CALL %0 sub1 %%A
START useproxy.txt
GOTO :eof

:sub1
SHIFT /1
ECHO;>>useproxy.txt
ECHO 于 %date% %time% 检测 http://www.cnproxy.com/proxy%1.html 可用代理如下: >>useproxy.txt
ECHO;>>useproxy.txt
ECHO ############################################################# >>useproxy.txt
IF EXIST proxy%1.html DEL proxy%1.html /a/s >nul
wget http://www.cnproxy.com/proxy%1.html >nul 2>nul
:html_down_ok
title 正在检测proxy%1,请稍等....
FOR /f "tokens=1,2 delims=^<trd>: " %%a IN ('type proxy%1.html ^| findstr /c:"HTTP" ') DO (
        set set=
        set set=%%a
        SET "tempset=!set:&#8204&#8205=!"
        IF "!tempset!"=="!set!" SET "tempset=!set:&#8205=!"
        set "set=!tempset!:%%b"
        ECHO 正在检测 !set! 代理,请稍等....
        wget -q -T 3 -t 1 -e "http_proxy=!set!" http://www.dps4e.com -O - >nul 2>nul && echo 检测到 ******* !set! ******* 代理可用&&echo ----!set! >>useproxy.txt
)
IF EXIST proxy%1.html DEL proxy%1.html /a/s >nul
GOTO :eof
[ Last edited by honghunter on 2007-12-4 at 04:40 PM ]
作者: jethroso     时间: 2008-11-20 12:20
刚试试不行啊?怎么全是######号呢?


[ Last edited by jethroso on 2008-11-20 at 12:24 ]