请教如何下载得到某个图片呢?

无·法 2011-05-10 06:06:51
图片地址:
http://photo.pchome.com.tw/s13/c/h/chencan0814/book301/p130133146978.jpg

上面图片直接用浏览器打开是无法显示的,会提示“您所查询的网页不存在”,可是如果先打开网址
http://photo.pchome.com.tw/chencan0814/130133146978,然后再去打开
http://photo.pchome.com.tw/s13/c/h/chencan0814/book301/p130133146978.jpg(注意:貌似要将图片地址复制到浏览器地址栏回车才行的)这样就可以显示图片了。

所以面临的问题是,用urldownload、xmlhttp等方法下载http://photo.pchome.com.tw/s13/c/h/chencan0814/book301/p130133146978.jpg都会提示“您所查询的网页不存在”。

如果用webbrowser的话太慢了,而且还不稳定。对于这样的情况,各位高手有什么好办法根据图片url直接下载得到图片文件吗?
...全文
236 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2011-05-13
  • 打赏
  • 举报
回复
这样不爽.....

你看看这个机制:

添加一个定时器,时间设置为100ms,然后事件内容:

private sub timer1_timer()
timer1.enabled=false

winsock1.close
doevents
call xxxxxxxxx '这里的xxxxx是更换URL并调用connect的过程
end sub


然后在Winsock的close事件里:

Private Sub Winsock1_Close()
Close #1
timer1.enabled=true
End Sub

我的代码里是在CLOSE事件里设置TAG属性为"CLOSE"值,然后启动定时器.

定时器里扫描所有控件(我使用的是数组控件),发现了TAG="CLOSE"的控件,就UNLOAD它.

结构类似于这个代码:

http://www.m5home.com/blog/article.asp?id=65

你参考一下吧.
无·法 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 myjian 的回复:]

连接=连续........错别字了
[/Quote]可以就用一个winsock逐个下载的吧,就是一个完了后用下一个。

在Winsock1.Connect "photo.pchome.com.tw", 80后加了下面代码也不行
isComplete=false
do while not isComplete
doevents
loop
call Command1_Click

然后
Private Sub Winsock1_Close()
Close #1
isComplete=true
End Sub

我之前不知道可以通过.close来关闭,所以就做成了一个独立的exe,将图片地址通过参数传递给它,采集的时候就启动n个这样的exe进程,发现速度还很快,多进程啊。
嗷嗷叫的老马 2011-05-13
  • 打赏
  • 举报
回复
连接=连续........错别字了
嗷嗷叫的老马 2011-05-13
  • 打赏
  • 举报
回复
想连接下载,其实可以用WINSOCK数组啊,只要你的带宽足够,那就一次性输入20个地址,分别由20个WINSOCK去下载,哈哈.
之前我做的那个图片采集程序就是保持20个控件不断下载,谁完成了谁就申请下一个URL
无·法 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 myjian 的回复:]

CLOSE事件只是表明远程计算机关闭了连接,我们本地也要释放所使用的各种资源,比如端口与接连.
[/Quote]哦 原来两个close不是一个含义,如果要连续进行下载下一张图片的话那么就设置个变量在close事件中标记下就行了。
嗷嗷叫的老马 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sysdzw 的回复:]
对于这个代码还有一点小问题,为什么点击按钮后下载好图片了,然后我将图片删除再点击下按钮winsock就提示出错了?[/Quote]
如12楼所说,WINSOCK控件要CLOSE一下.

我知道XMLHTTP也可以使用引用页,但前年还是上前年有个朋友也是想用这个批量下载图片,结果发现这个引用页不怎么对劲,最后还是用的WINSOCK完成的.

至于URLDOWNLOADTOFILE函数,也没有细细研究过....
孤独剑_LPZ 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sysdzw 的回复:]
......
果然可行,有很多细节方面还不清楚,原来数据包最后一定要以两个回车结束的。
对于这个代码还有一点小问题,为什么点击按钮后下载好图片了,然后我将图片删除再点击下按钮winsock就提示出错了?
......
[/Quote]

改老马的代码,仅加3句,可以了
Private Sub Command1_Click()
Winsock1.Close
Call Winsock1_Close
IsData = False

Winsock1.Connect "photo.pchome.com.tw", 80
End Sub
嗷嗷叫的老马 2011-05-12
  • 打赏
  • 举报
回复
CLOSE事件只是表明远程计算机关闭了连接,我们本地也要释放所使用的各种资源,比如端口与接连.
li163 2011-05-12
  • 打赏
  • 举报
回复
标记一下,学习了
无·法 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 myjian 的回复:]

VB code
'窗体中一个Winsock1,一个Command1
Option Explicit

Dim Buff() As Byte
Dim IsData As Boolean '是否是数据

Private Sub Command1_Click()
Winsock1.Connect "photo.pchome.com.tw", 80
End Sub

Private Sub ……
[/Quote]果然可行,有很多细节方面还不清楚,原来数据包最后一定要以两个回车结束的。
对于这个代码还有一点小问题,为什么点击按钮后下载好图片了,然后我将图片删除再点击下按钮winsock就提示出错了?

我在Winsock1.Connect "photo.pchome.com.tw", 80后加了下面代码也不行
do while Winsock1.state<>0
doevents
loop
msgbox "winsock连接已经close"
无·法 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 myjian 的回复:]

引用 10 楼 sysdzw 的回复:
对于这个代码还有一点小问题,为什么点击按钮后下载好图片了,然后我将图片删除再点击下按钮winsock就提示出错了?
如12楼所说,WINSOCK控件要CLOSE一下.

我知道XMLHTTP也可以使用引用页,但前年还是上前年有个朋友也是想用这个批量下载图片,结果发现这个引用页不怎么对劲,最后还是用的WINSOCK完成的.

至于URLDOWNL……
[/Quote]数据传完了会自动触发Winsock1_Close的吧,这个从字面来看不就表示Winsock要关闭了吗?跟专门使用Winsock1.close有什么区别呢?
孤独剑_LPZ 2011-05-11
  • 打赏
  • 举报
回复
打不开网页
无·法 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 myjian 的回复:]

VB code
'窗体中一个Winsock1,一个Command1
Option Explicit

Dim Buff() As Byte
Dim IsData As Boolean '是否是数据

Private Sub Command1_Click()
Winsock1.Connect "photo.pchome.com.tw", 80
End Sub

Private Sub ……
[/Quote]谢谢了,我当时用xmlhttp设置引用页的“Referer: http://photo.pchome.com.tw/chencan0814/130133146978”,没调试通过,用post和get方法都不行。最后将socketsniff抓到的包数据都贴上还是得不到图片。 回去后试试你的winsock方法。
嗷嗷叫的老马 2011-05-10
  • 打赏
  • 举报
回复
'窗体中一个Winsock1,一个Command1
Option Explicit

Dim Buff() As Byte
Dim IsData As Boolean '是否是数据

Private Sub Command1_Click()
Winsock1.Connect "photo.pchome.com.tw", 80
End Sub

Private Sub Winsock1_Connect()
Dim HTTPStr As String

HTTPStr = "GET http://photo.pchome.com.tw/s13/c/h/chencan0814/book301/p130133146978.jpg HTTP/1.1" & vbCrLf & _
"Connection: Close" & vbCrLf & _
"Host: photo.pchome.com.tw" & vbCrLf & _
"Accept: */*" & vbCrLf & _
"Pragma: no -cache" & vbCrLf & _
"cache -Control: no -cache" & vbCrLf & _
"Referer: http://photo.pchome.com.tw/chencan0814/130133146978" & vbCrLf & _
"User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)" & _
vbCrLf & vbCrLf

Winsock1.SendData HTTPStr
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'HTTP/1.1 200 OK
'Date: Tue, 10 May 2011 13:15:45 GMT
'Server: Apache
'Last-Modified: Mon, 28 Mar 2011 16:57:49 GMT
'ETag: "10fe2916-1b265-49f8dd800c042"
'Accept -Ranges: bytes
'Content-Length: 111205
'Connection: Close
'Content-Type: image/jpeg
Dim tmpByte() As Byte, I As Long, J As Long, K As Long

If bytesTotal > 0 Then
Winsock1.GetData tmpByte
If IsData = False Then
Debug.Print StrConv(tmpByte(), vbUnicode)
For I = 0 To UBound(tmpByte) - 3
If tmpByte(I) = 13 And tmpByte(I + 1) = 10 And tmpByte(I + 2) = 13 And tmpByte(I + 3) = 10 Then '两个回车是HTTP头结束的标志.
IsData = True
Open "d:\11.jpg" For Binary As #1 '打开文件
If I + 4 < UBound(tmpByte) - 1 Then '如果后面还有数据就写入
I = I + 4
K = -1
For J = I To UBound(tmpByte)
K = K + 1
tmpByte(K) = tmpByte(J)
Next
ReDim Preserve tmpByte(K)
Put #1, , tmpByte()
End If
Exit For
End If
Next
Else
Put #1, , tmpByte()
End If
End If
End Sub

Private Sub Winsock1_Close()
Close #1
End Sub


居然调试了半天,以前记得的全忘了
嗷嗷叫的老马 2011-05-10
  • 打赏
  • 举报
回复
给你写个吧:)
嗷嗷叫的老马 2011-05-10
  • 打赏
  • 举报
回复
这个就是一个引用页功能而已,是网站防盗链的一个普通方法,没多复杂.

HTTP协议里使用Referer来定义请求的来源,如果Referer所标识的页面不是自己已知的指定页,则说明这个请求来自站外,服务器就可以拒绝本次请求,达到防盗链的功能.

使用WINSOCK发送一个包含Referer参数的HTTP请求就行了.
花诗雨露 2011-05-10
  • 打赏
  • 举报
回复
cookie 伪造下 试试
啊的发哦 2011-05-10
  • 打赏
  • 举报
回复
等高手出现,防盗链了
dbcontrols 2011-05-10
  • 打赏
  • 举报
回复
http://photo.pchome.com.tw/s13/c/h/chencan0814/book301/p130133146978.jpg不是图片的真正物理地址
jhone99 2011-05-10
  • 打赏
  • 举报
回复
原来是这么复杂的,关注

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧