搜索
查看: 9726|回复: 15

[已解决]如何保存网页上的图片到文件?

  [复制链接]

7

主题

36

帖子

461

积分

二级会员

Rank: 3Rank: 3

积分
461
发表于 2011-10-7 16:55:06 | 显示全部楼层 |阅读模式
本帖最后由 llm1978 于 2011-10-8 09:21 编辑

http://bbs.aardio.com/thread-2099-1-1.html
想通过上面的支持库来识别图片,但不知道如何将页面上的图片保存到文件的方法。

站里很多下载图片来保存的例子,却没有直接保存页面上的图片实例,下载验证码会刷新验证码而跟页面实际显示的验证码图片不一样,所以求助。
回复

使用道具 举报

0

主题

50

帖子

374

积分

二级会员

Rank: 3Rank: 3

积分
374
发表于 2011-10-7 17:09:31 | 显示全部楼层

[color=#0000ff][color=#0000ff]那个帖子里就有 你仔细看[/color] [color=#0000ff] [/color] v

那个帖子里就有 你仔细看


var
str = http.get("http://www.cetv.com/Imgchk/validatecode.asp")
string.save(
"/test.bmp", str)
回复

使用道具 举报

7

主题

36

帖子

461

积分

二级会员

Rank: 3Rank: 3

积分
461
 楼主| 发表于 2011-10-7 17:11:38 | 显示全部楼层

他是通过http再次访问获取图片,那样的话图片会被刷新的,跟页面上显示的不一样。

他是通过http再次访问获取图片,那样的话图片会被刷新的,跟页面上显示的不一样。
回复

使用道具 举报

33

主题

543

帖子

3304

积分

荣誉会员

Rank: 8Rank: 8

积分
3304
发表于 2011-10-7 17:12:29 | 显示全部楼层

你可以了解一下验证码的原理,根本无需考虑验证码同步的问题,以最后一次下载的验证码为准。 (当然前提是 Cookie 共享,在aardio中如果你用的是 Web

你可以了解一下验证码的原理,根本无需考虑验证码同步的问题,以最后一次下载的验证码为准。
(当然前提是 Cookie 共享,在aardio中如果你用的是 Web 窗体和 inet.http 库,则无需考虑这个问题)
回复

使用道具 举报

7

主题

36

帖子

461

积分

二级会员

Rank: 3Rank: 3

积分
461
 楼主| 发表于 2011-10-7 17:24:34 | 显示全部楼层

测试了,不行,必须用显示的验证码才能登陆

测试了,不行,必须用显示的验证码才能登陆
回复

使用道具 举报

7

主题

36

帖子

461

积分

二级会员

Rank: 3Rank: 3

积分
461
 楼主| 发表于 2011-10-7 19:36:40 | 显示全部楼层

[quote][size=2][color=#999999]lujjjh 发表于 2011-10-7 17:12[/color] [url=forum.php?

lujjjh 发表于 2011-10-7 17:12
你可以了解一下验证码的原理,根本无需考虑验证码同步的问题,以最后一次下载的验证码为准。
(当然前提是 ...

我是用Web 窗体打开网页,然后inet.http 库获取验证码图片,调用那个识别库后填写表单,用doscript执行网页里提交表单函数,返回却是验证码不正确。
回复

使用道具 举报

33

主题

543

帖子

3304

积分

荣誉会员

Rank: 8Rank: 8

积分
3304
发表于 2011-10-7 20:04:21 | 显示全部楼层

[quote][size=2][color=#999999]llm1978 发表于 2011-10-7 19:36[/color] [url=forum.php

llm1978 发表于 2011-10-7 19:36
我是用Web 窗体打开网页,然后inet.http 库获取验证码图片,调用那个识别库后填写表单,用doscript执行网 ...

要注意读取的顺序,最后一个读取的验证码总是有效验证码。另外要注意验证码的地址。例如下面这个例子,页面加载完毕之后再用 inet.http 重新读取验证码显示到 picturebox 中,若填入网页中的验证码,一定会报验证码错误,最后读取的 picturebox 中的那个验证码才是有效的验证码。



import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; bottom=359;scroll=1;text="aardio Form";right=487 )
winform.add(
picturebox={ bottom=352;right=144;left=16;top=312;font=LOGFONT( name=
"\xCB\xCE\xCC\xE5";h=-12 );z=2;text="picturebox";cls="picturebox" };
static={ bottom=304;right=472;left=8;top=8;font=LOGFONT( name=
"\\xCB\\xCE\\xCC\\xE5";h=-12 );z=1;nWrap=1;transparent=1;text="static";cls="static" }
)
/*}}*/

import web.form;
import inet.http;

var wb = web.form(winform.static);

wb.go(
"http://www.cetv.com/member/reg.htm?referer=http://www.cetv.com/")
winform.show();
wb.wait();

winform.picturebox.image = inet.http().get(
"http://www.cetv.com/Imgchk/validatecode.asp");

wb.doScript(
"fCheck = function () { return true }");

win.loopMessage();
return winform,wb;


回复

使用道具 举报

7

主题

36

帖子

461

积分

二级会员

Rank: 3Rank: 3

积分
461
 楼主| 发表于 2011-10-7 20:51:51 | 显示全部楼层

[i=s] 本帖最后由 llm1978 于 2011-10-7 21:07 编辑 [/i] [quote][size=2][color=#999999]luj

本帖最后由 llm1978 于 2011-10-7 21:07 编辑
lujjjh 发表于 2011-10-7 20:04
要注意读取的顺序,最后一个读取的验证码总是有效验证码。另外要注意验证码的地址。例如下面这个例子,页 ...

import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; bottom=359;scroll=1;text="aardio Form";right=487 )
winform.add(
picturebox={ bottom=352;right=144;left=16;top=312;font=LOGFONT( name="\\\\xCB\\\\xCE\\\\xCC\\\\xE5";h=-12 );z=2;text="picturebox";cls="picturebox" };
static={ bottom=304;right=472;left=8;top=8;font=LOGFONT( name="\\\\\\\\xCB\\\\\\\\xCE\\\\\\\\xCC\\\\\\\\xE5";h=-12 );z=1;nWrap=1;transparent=1;text="static";cls="static" }
)
/*}}*/

import web.form;
import inet.http;
import aspriseOCR;



var wb = web.form(winform.static);

wb.go("http://www.cetv.com/member/reg.htm?referer=http://www.cetv.com/")
winform.show();
wb.wait();

getImage = function(url,file){
    var http = inet.http();
    var str = http.get(url)
    string.save(file, str)  
    return file;
}

//识别网络验证码
var str = aspriseOCR.ocr(
    getImage("http://www.cetv.com/Imgchk/validatecode.asp"
    ,"/test.bmp")
)

wb.getEle("username").value = "llm1978" ;
wb.getEle("password").value = "112233" ;
wb.getEle("surepassword").value = "112233" ;
wb.getEle("email").value = "123@123.com" ;
wb.getEle("mobile").value = "13888888888" ;
wb.getEle("validatecode").value = str ;


winform.picturebox.image = "\test.bmp"

//winform.picturebox.image = inet.http().get("http://www.cetv.com/Imgchk/validatecode.asp");

//wb.doScript("fCheck = function () { return true }");

win.loopMessage();
return winform,wb;


按照管理员提示,这样确实可以,但这里提交是通过点击按钮完成的而不是通过javascript函数完成,明天再去公司看看,谢谢。
QQ截图20111007203939.jpg
回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
发表于 2011-10-7 22:48:35 | 显示全部楼层

[color=#0000ff]import[/color][color=#000000] win.ui; [/color][color=#008000]/*

import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; bottom=249;scroll=1;right=349;text="aardio Form" )
winform.add(
picturebox={ bottom=53;right=204;left=21;top=9;z=2;text=
"picturebox";cls="picturebox" };
static={ nWrap=1;bottom=218;right=326;left=23;transparent=1;top=65;z=1;text=
"static";cls="static" }
)
/*}}*/

import web.form;

//创建web窗体
var wb = web.form( winform.static );

//打开目标网站
wb.go("http://www.baidu.com")
//显示窗体
winform.show()  

qEle = wb.waitQueryEles( src=
"logo";tagName = "^IMG$")
wb.execEle(qEle[1],
"Copy")

import com.picture;
import win.clip

//复制网页图片并保存到文件
com.picture.fromBitmap(win.clip.readBitmap()).Save("/logo.gif")

//复制网页图片并显示到图片控件
winform.picturebox.setImage( win.clip.readBitmap() )

//进入消息循环
win.loopMessage();
return winform,wb;

点评

同意: 5.0 真棒: 5.0
同意: 5 真棒: 5
高手就是高手,代码精辟  发表于 2011-10-11 23:48
回复

使用道具 举报

0

主题

50

帖子

374

积分

二级会员

Rank: 3Rank: 3

积分
374
发表于 2011-10-8 08:44:17 | 显示全部楼层

[quote][size=2][color=#999999]llm1978 发表于 2011-10-7 20:51[/color] [url=forum.php

llm1978 发表于 2011-10-7 20:51
import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; bottom=359;scroll=1;text="aardio Form ...

直接下载验证码,然后post不就行了吗
import web.form;
import aspriseOCR
import inet.http;
import inet.url
/*DSG{{*/
var winform = win.form(parent=...; bottom=249;scroll=1;right=349;text="aardio Form" )
winform.add(  )
/*}}*/

winform.wndproc =
function(hwnd,message,wparam,lparam){
   
select(message) {//判断消息类型
        case 0x10/*_WM_CLOSE窗口关闭消息*/{
            
        }
        
case 0x205/*_WM_RBUTTONUP 鼠标右键弹起,弹出菜单*/begin
            
//var x,y = ::LOWORD(lparam), ::HIWORD(lparam)
            //winform.popmenu.popup();//弹出菜单
        end
        
else{
            
        }
    }
   
//无返回值则继续调用默认回调函数
}

wb = web.form( winform);

getImage =
function(url,file){
   
var http = inet.http();
   
var str = http.get(url)
    string.save(file, str)  
   
return file;
}
//识别网络验证码
var str = aspriseOCR.ocr(
    getImage(
"http://www.cetv.com/Imgchk/validatecode.asp" ,"/test.bmp")
    )

io.open();
var formEncode = inet.url.encode;

username=
"user94573974" //用户名
password="111222" //密码
mail="saf@s346e4tf.com" //邮箱

var http = inet.http()
var html = http.post("http://www.cetv.com/member/userreg_save.htm", "username="++username++"&button=" + "&password="++password++"&surepassword=111222&email="+formEncode(mail) + "&mobile=13911111111&validatecode="++str++"&Submit="+ "&Submit="+ "&bio="+ "&");
io.print(html)
execute("pause");
io.close();


回复

使用道具 举报

7

主题

36

帖子

461

积分

二级会员

Rank: 3Rank: 3

积分
461
 楼主| 发表于 2011-10-8 09:20:59 | 显示全部楼层

谢谢各位,已解决。

谢谢各位,已解决。
回复

使用道具 举报

0

主题

1

帖子

12

积分

新手入门

Rank: 1

积分
12
发表于 2012-2-20 23:19:06 | 显示全部楼层

怎么解决的呢?“ 现在也碰到这个问题了

怎么解决的呢?“
现在也碰到这个问题了
回复

使用道具 举报

12

主题

77

帖子

483

积分

二级会员

Rank: 3Rank: 3

积分
483
发表于 2013-2-6 15:18:35 | 显示全部楼层

[quote][size=2][color=#999999]编程 发表于 2011-10-7 22:48[/color] [url=forum.php?mod=

编程 发表于 2011-10-7 22:48
import win.ui;
/*DSG{{*/
var winform = win.form(parent=...; bottom=249;scroll=1;right=349;text="A ...

既解决了验证码同步问题,又使获得的图像与网页一至,看起来比较舒服。另外请教一下
  1. import win.ui;
  2. import inet.http
  3. import gdip;
  4. /*DSG{{*/
  5. var winform = ..win.form( bottom=699;scroll=1;text="aardio Form";right=647;parent=...)
  6. winform.add(
  7. button={ bottom=698;right=407;left=345;top=666;z=3;text="button";cls="button" };
  8. static={ bottom=647;text="static";left=-17;top=-30;z=1;transparent=1;right=638;cls="static" };
  9. picturebox={ bottom=693;right=223;left=103;autosize=1;top=657;z=2;cls="picturebox" }
  10. )
  11. /*}}*/

  12. import web.form;
  13. //创建web窗体
  14. var wb = web.form( winform.static );
  15. //打开目标网站
  16. wb.go("http://bbs.xmfish.com/register.php")
  17. wb.wait("");//等待指定网址,可以使用模式匹配语法
  18. var ele = wb.getEle("authmobile")  
  19. ele.value = "13788014028"

  20. var http = inet.http();
  21. var bmpdata = http.get("http://bbs.xmfish.com/ck.php?nowtime=1")
  22. var bmp = gdip.bitmap( bmpdata )
  23. winform.picturebox.setImage(bmp.copyHandle())

  24. winform.show()
  25. //进入消息循环
  26. win.loopMessage();
  27. return winform,wb;
  28. 我这样取得的难证码手工填进去后为什么不正确呢?
复制代码
回复

使用道具 举报

0

主题

1

帖子

6

积分

新手入门

Rank: 1

积分
6
发表于 2014-1-10 16:14:32 | 显示全部楼层

怎么解决的

怎么解决的
回复

使用道具 举报

4

主题

16

帖子

164

积分

一级会员

Rank: 2

积分
164
发表于 2018-2-4 00:01:52 | 显示全部楼层

9楼“编程”的答案是正解,其它人没有完全明白楼主意思,或者是觉得楼主没必要那样做。但是有些网站还必须那样做,比如支付宝。
回复

使用道具 举报

3

主题

16

帖子

99

积分

一级会员

Rank: 2

积分
99
发表于 2018-2-4 12:26:05 | 显示全部楼层
9楼正解,插眼备查。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-11-17 19:41 , Processed in 0.078125 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表