ibm

随笔 - 1, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

爬行动物

<?

// 这段代码是运行在命令行模式的.
$ua='Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)';
$downlod_path="F:\\";     // 下载文件保存目录
$cookie_file="cookie.dat";
$loginpost='user=dullwolf&pass=123456&CkiExp=-1&submitflag=ddddls-%2B%2B%2B&regbtn.x=50&regbtn.y=31';
$login_url='http://club.joyes.com/User/Login.asp';
$jar_url="http://sou.joyes.com/game_down.aspx?type=gam&id=";
$idlist=array(55397,55409,55387);   //要下多少文件这里自己加

function curl_gorush($id=''){
global $cookie_file,$ua,$downlod_path,$loginpost,$login_url,$jar_url;
echo   $id==='' ? "正在登陆...\n" : "正在下载文件\tid=$id\n";
$ch = curl_init();
$url= $id===''?$login_url:$jar_url.$id;
curl_setopt($ch, CURLOPT_URL,$url );
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_USERAGENT,$ua);
curl_setopt($ch, CURLOPT_COOKIEFILE,$cookie_file);   
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);   
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

if ($id===''){
curl_setopt($ch, CURLOPT_POST, 1);     
curl_setopt($ch, CURLOPT_POSTFIELDS,$loginpost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);  
$content=curl_exec($ch);
curl_close ($ch);
return !empty($content) && strpos($content,"登陆成功")!==false;
}else{
$fp=fopen($downlod_path.$id.'.jar','wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close ($ch);
fclose($fp);
}
}
if (!extension_loaded('curl')) dl("php_curl." . PHP_SHLIB_SUFFIX);
curl_gorush()?array_walk($idlist,'curl_gorush'):die("登陆失败\n");
?>


复制上面的代码保存到 x:\xxx\xxxxxx.php

然后建立一个批处理文件 run.bat (run.bat放哪个目录都可以)
内容如下: 假设你的php安装在D盘

d:\your_php.exe_path\php.exe x:\xxx\xxxxxx.php
pause


双击 run.bat 运行, 哈哈,下载的那三个 jar文件乖乖的躺在 F:\了
上面的代码共38行,其实 referer和 useragent欺骗是完全不要的,对方服务器根本没有检查这个

只需要在代码中加多1行,就可以支持通过代理服务器抓取.
只需要在代码中加多不超过10行,就可以支持通过代理服务器抓取,并每次抓取都更换不同的代理
再花一泡尿的功夫就可以支持多线程下载. 不过我看这里每个文件才几百kb,也没有必要搞多线程
去下了,线程间调度起来的那些时间都可能下了好几个了.

做这种事情还是 3p 的强项啊 (perl,php,python), 估计拿perl写十来行代码都可以搞定.
用c#那就是高射炮打蚊子啦

对了,要想搞代理服务器列表的话,来这里,包你满载而归
http://www.cnblogs.com/ashun/archive/2007/06/01/python_proxy_checker.html

太热,实在睡不着啊. 又停水.



下面这个解决方案需要三个文件

1. 批处理文件。 run.bat 代码如下, 注意,只有两行,千万保存的时候不要折行

c:\curl.exe --silent --output nul --data "user=dullwolf&pass=123456&CkiExp=-1" --location --cookie-jar %temp%\cookie.dat http://club.joyes.com/User/Login.asp
for /f %%i in (idlist.txt) do c:\curl.exe --output e:\%%i.jar --location --cookie %temp%\cookie.dat "http://sou.joyes.com/game_down.aspx?type=gam&id=%%i"

2. curl.exe 文件
这个文件在苹果机系统里面是操作系统内置的, windows平台 只能自己去下载
下载地址 http://curl.haxx.se/download/curl-7.16.3-win32-nossl-sspi.zip  
文件大小只有 256kb, 下载完后加解缩,里面只有一个 curl.exe和一些文档
把curl.exe保存到c:\ (如果你保存到其他目录,请修改上面批处理文件的路径为你保存的路径)

3. 自己用记事本建立一个文件 idlist.txt
里面存放你要抓取的 id号码,一行一个
我调试的时候 idlist.txt 的内容如下:
55397
55409
55387


ok 搞定后,双击run.bat 自动登录,并下载

友情提示:

idlist.txt要和run.bat放在通一个目录.

另外,如果你要下载的id是一个区段的话,就没有必要用idlist.txt一个个去加了

比如,要下载 id 为 1000,1001,1002,1003,1004..........4000
可以不用idlist.txt
只需要把 run.bat第二行改为

c:\curl.exe --output e:\#1.jar --location --cookie %temp%\cookie.dat "http://sou.joyes.com/game_down.aspx?type=gam&id=[1000-4000]"

有些网站需要检查 user-agent 和 referer 的

那就在 curl.exe 添加他们, 如:
c:\curl.exe --user-agent "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT;)" --referer "http://www.abc.com/123.htm"


把 run.bat 升级了一下


@echo off
set savepath=e:\
set username=dullwolf
set pass=123456
set runcmd=c:\curl.exe
set idfile=idlist.txt

%runcmd% --silent --data "user=%username%&pass=%pass%&CkiExp=-1" --location --cookie-jar %temp%\cookie.dat http://club.joyes.com/User/Login.asp | find "登陆成功"

if %errorlevel%==1 (goto loginerror) else goto download

:download
for /f %%i in (%idfile%) do %runcmd% --output %savepath%%%i.jar --location --cookie %temp%\cookie.dat "http://sou.joyes.com/game_down.aspx?type=gam&id=%%i"
exit

:loginerror
echo 登陆失败
pause

posted on 2007-08-31 14:03 Ue天 阅读(554) 评论(0)  编辑 收藏 引用 网摘


只有注册用户登录后才能发表评论。
网站导航: