在学校上网一直不是很方便,难得有机会研究了一个东东,拿出来抛砖引玉,大家共同探讨批量下载与智能下载。
需求:
在6dzone.com上看到一些不错的图片,
www.6dzone.com/photo ...
www.6dzone.com/photo ...
但保存图片实在很麻烦,本来网速就超慢,还需要打开一个一个的网页,然后右击图片“另存为”,还是考虑一下批量下载。
分析:
目前用的较多的图片批量下载工具好像是 GlobalFetch ,下载的图片倒是很多,但99%不是自己想要的。
另外迅雷和网际快车都有批量下载功能,但必须是有共同特征的下载地址,只适合下载***001.jpg、***002.jpg、***003.jpg……之类地址的文件。
目前还没有发现一款软件可以满足我的要求,还是自己写个程序来模拟用户操作,毕竟数据都是要通过http完成的,从html代码中也能找到一些共性,把这些重复性的操作都交给程序来执行就行了。
每种语言都有各自的特点,cmd batch 做这些事实在是方便高效,即写即运行。而用高级语言实现就很麻烦,“杀鸡焉用宰牛刀”!
所需命令行工具
curl ——功能强大的命令行浏览器、下载工具
www.cn-dos.net/forum ...
wget ——功能强大的命令行下载工具
baike.baidu.com ...
sed ——功能强大的命令行流编辑器
www.cn-dos.net/forum ...
用好sed、grep、awk等编辑器还需掌握正则表达式
正则表达式
www.cn-dos.net/forum ...
要解决一个问题必须先有一个环境,毕竟一个方案不可能通吃所有问题,只针对6dzone的相册下载。个人喜欢使用遨游浏览器,先将喜欢的相册网址添加到收藏夹再将收藏的网址导出为bookmark.html文件。
使用sed解析bookmark.htm文件,获取所要的网址,
找出有网址的行
sed "/photo/!d" bookmark.htm
或者
sed -n "/photo/p" bookmark.htm
再获取引号中间的网址,合起来就是:(其中"的ASII码值为34,转换为正则表达式即为 \x22)
sed "/photo/!d;s/[^\x22]*\x22//;s/\x22.*//" bookmark.htm
另外6dzone需要注册用户认证登陆才能看到大图片,需要使用curl模拟用户登陆并导出cookie
首先得分析一下网页代码及其表单,推荐使用View page插件,另外IE的httpwatch和Firefox的TamperData都是很不错的插件!
curl提交表单一般有2种方法:get方式和post方式,这得取决于表单的method,另外还得分析一下 Action 和 提交表单要用的 Name
以下是cn-dos论坛登陆页面的html代码
----------------------------------------------------------------------------------------------------------
<FORM
action=logging.php?action=login method=post><INPUT type=hidden value=28c5c8a4 name=formhash> <INPUT type=hidden value=http://www.cn-dos.net/forum/viewthread.php?tid=22634&fpage=1&highlight=sed%20%2B%20wget%20%2B%20%E6%AD%A3%E5%88%99&sid=FHJYXn name=referer>
<TABLE cellSpacing=0 cellPadding=0 width="99%" align=center border=0>
<TBODY>
<TR>
<TD bgColor=#dde3ec>
<TABLE cellSpacing=1 cellPadding=4 width="100%" border=0>
<TBODY>
<TR class=header>
<TD colSpan=2>会员登录</TD></TR>
<TR>
<TD bgColor=#f8f9fc>隐身登录:</TD>
<TD class=smalltxt bgColor=#ffffff><SELECT name=loginmode> <OPTION value="" selected>- 使用默认 -</OPTION> <OPTION value=normal>正常模式</OPTION> <OPTION value=invisible>隐身模式</OPTION></SELECT> </TD></TR>
<TR>
<TD bgColor=#f8f9fc>界面风格:</TD>
<TD bgColor=#ffffff><SELECT name=styleid><OPTION value="" selected>- 使用默认 -</OPTION> <OPTION value=1>Default Style</OPTION></SELECT> </TD></TR>
<TR>
<TD bgColor=#f8f9fc>Cookie 有效期:</TD>
<TD class=smalltxt bgColor=#ffffff><INPUT type=radio value=31536000 name=cookietime> 一年 <INPUT style="BACKGROUND: #ffffcc" type=radio CHECKED value=31536000 name=cookietime> 一个月 <INPUT type=radio value=86400 name=cookietime> 一天 <INPUT type=radio value=0 name=cookietime> 浏览器进程 <A href="faq.php?page=usermaint#2" target=_blank>[相关帮助]</A></TD></TR>
<TR>
<TD bgColor=#ffffff colSpan=2 height=1></TD></TR>
<TR>
<TD align=middle colSpan=2><FONT color=red>注意:</FONT>老用户 <B>首次</B> 登录转换的PHP论坛前,请先修复密码,详情请见<A href="http://www.cn-dos.net/forum/announcement.php?id=2#2">论坛公告</A>。</TD></TR>
<TR>
<TR>
<TD width="21%" bgColor=#f8f9fc>用户名(必填):</TD>
<TD bgColor=#ffffff><INPUT style="BACKGROUND: #ffffcc" tabIndex=1 maxLength=40 size=25
name=username> <SPAN class=smalltxt><A href="register.php">立即注册</A></SPAN></TD></TR>
<TR>
<TD bgColor=#f8f9fc>密码(必填):</TD>
<TD bgColor=#ffffff><INPUT style="BACKGROUND: #ffffcc" tabIndex=2 type=password size=25 value=""
name=password> <SPAN class=smalltxt><A href="member.php?action=lostpasswd">忘记密码</A></SPAN></TD></TR>
----------------------------------------------------------------------------------------------------------
用curl登陆cn-dos论坛
curl -d "username=ngd&password=cndos" http://www.cn-dos.net/forum/logging.php?action=login
顺带提一下直接在浏览器中打开并登陆可以使用下面的代码
http://www.cn-dos.net/forum/logging.php?action=login&username=ngd&password=cndos&loginsubmit=.
将登陆后的cookie保存在6dzonecookie.txt中
使用cookie文件
伪装成IE浏览器
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.01)"
合起来就是
curl -c 6dzonecookie.txt -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.01)" -d "username=dddddd6&pwd=cndos" http://www.6dzone.com/user/f_login.asp>nul
wget最简单的用法
wget http://www.cn-dos.net/forum/images/default/logo.gif
我这网络不太稳定,网速超慢,再多加一些参数
wget -t 8 -w 3 -T 30 -c -N
其他的没什么好说的,主要是sed的用法,再来一个for嵌套循环就OK了。
全部代码:
@echo off
rem code by 拟谷盗 for download 6dzone photo.
curl -c 6dzonecookie.txt -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.01)" -d "username=dddddd6&pwd=cndos" http://www.6dzone.com/user/f_login.asp>nul
for /f "delims=" %%a in ('sed "/photo/!d;s/[^\x22]*\x22//;s/\x22.*//" bookmark.htm') do (
for /f "usebackq delims=" %%b in (`curl %%a ^| sed "/pic_id/!d;s/[^\x22]*\x22//;s/\x22.*//;s/photo.asp/pic.asp/g;s/\/photo/http:\/\/www.6dzone.com&/g"`) do (
curl -b 6dzonecookie.txt -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.01)" %%b | sed "/http:\/\/.*jpg/!d;s/.*http/http/g;s/jpg.*/jpg/g" >>picurl.list
wget -t 8 -w 3 -T 30 -c -N -i picurl.list
del picurl.list
)
)
del 6dzonecookie.txt
exit/b
粗略看了一下,写的很乱,暂时就这样了,有时间再整理整理。
另外代码也不够简洁,哪位达人再帮忙改改,以后下载网页图片就方便多了!

curl+wget+sed+bat文件 下载
rthost.fam.cx/cndos- ...
解压后运行 bat文件即可下载图片
[
Last edited by ngd on 2008-3-15 at 02:05 PM ]