从百度图片搜索上下载图片

 从百度图片搜索上下载叶片图像,作为柑橘溃疡病识别的负样本。

百度图片搜索的结果通过一个javascript函数动态生成:

function  funURL(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q)
{
arrImg[imgNum
++]='<a href=http://image.baidu.com/i?ct=503316480&z='+a+'&tn=baiduimagedetail&word='+trim(b)+'&in='+c+'&cl='+d+'&lm='+e+'&pn='+f+'&rn=1 target=_blank>
<img src=http://
'+g+'/it/u='+h+'&gp='+i+'.jpg></a>
<br><font size=1>
'+j+'x'+k+' '+l+''+m+'</font><br>
<div class=r><a href=http://image.baidu.com/ir?t=1&u=
'+trim(n)+'&f='+trim(o)+'&jn='+p+' target=_blank>'+trim(q)+'</a>';
}

其中,显示图像部分代码为:

< img src = http: // '+g+'/it/u='+h+'&gp='+i+'.jpg></a>

调用该js函数显示图像的代码为:

funURL( ' 0 ' , ' %CA%F7%D2%B6   ' , ' 7788 ' , ' 2&cm=1&sc=0 ' , ' -1 ' , ' 620 ' , ' t2.baidu.com ' , ' 3656415474,414517057 ' , ' 28 ' , ' 670 ' , ' 944 ' , ' 24 ' , ' jpg ' , ' http://www.52photoshop.cn/pic/FF152.JPG   ' , ' http://www.52photoshop.cn/pic27851.html   ' , ' 7788 ' , ' 植物,<strong>树叶</strong>图片素材27851--我...   ' );

只需要提取其第7,8,9个参数,构造url地址即可。

分析主要代码:

 

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Collections;

namespace  BaiduImages
{
    
/**
     * 从百度的图片搜索生成的HTML中分析出搜索获得的目标图像
     
*/
 
    
class BaiduImageUtils
    
{
        
/**
         * 分析的总控程序
         * 从JAVASCRIPT脚本中分析出调用JS函数的代码
         * 然后分析其参数
         * 根据参数构建URL地址
         * 返回页面中下一页链接地址
         
*/

        
public String parseImage(ref String content, ref LinkedList<String> imageUrls)
        
{
            String jsFunStartIdentifer 
= "funURL(";//javascript函数开始标识符
            String jsFunEndIdentifer = ")";  //javascript函数结束标识符 
            
            
int currentPos = 0;
            
int jsFunctionStartPos = content.IndexOf(jsFunStartIdentifer, currentPos);
            
int jsFunctionEndPos = jsFunctionStartPos;
            
while (jsFunctionStartPos > 0)
            
{
                jsFunctionStartPos 
= jsFunctionStartPos + jsFunStartIdentifer.Length;
                jsFunctionEndPos 
= content.IndexOf(jsFunEndIdentifer, jsFunctionStartPos);//寻找结束标识符的为位置


                
if (jsFunctionEndPos < jsFunctionStartPos || jsFunctionEndPos <= 0)
                    
break;

                String jsFunctionStr 
= content.Substring(jsFunctionStartPos, jsFunctionEndPos - jsFunctionStartPos);
                LinkedList
<String> parameters = new LinkedList<string>();//参数向量
                parseParameter(jsFunctionStr, ref parameters);// 从javascript函数中提取参数向量
                String currentUrl = generateURL(parameters);//根据参数向量构建网页的URL地址
                if(currentUrl!=null)
                    imageUrls.AddLast(currentUrl);    
//加入向量

                jsFunctionStartPos 
= content.IndexOf(jsFunStartIdentifer, jsFunctionEndPos + jsFunEndIdentifer.Length);//寻找开始标识符的为位置
            }

            String nextpageUrl 
= parseNextpage(ref content);
            
return nextpageUrl;
        }

        
/**
         * 分析页面中下一页链接地址
         * 
         * 先搜索下一页关键标识符,再搜索其链接开始标识符与链接结束标识符
         
*/

        
private String parseNextpage(ref String content)
        
{
            String nextpageStartIdentifer 
= "a href=";//下一页链接开始标识符
            String nextpageEndIdentifer = "><";       //下一页链接结束标识符
            String nextpageKeyIdentifer = "下一页";   //下一页关键标识符

            
int nextpageKeyPos = content.IndexOf(nextpageKeyIdentifer);
            
int nextpageStartPos=-1,nextpageEndPos=-1;
            
for (int i = nextpageKeyPos; i > 0; i--)
            
{
                String candidateStartStr
=content.Substring(i,nextpageStartIdentifer.Length);
                
if(candidateStartStr.Equals(nextpageStartIdentifer))
                
{
                    nextpageStartPos
=i+nextpageStartIdentifer.Length;//找到链接开始位置
                    break;
                }

            }

            nextpageEndPos 
= content.IndexOf(nextpageEndIdentifer, nextpageStartPos);//寻找链接结束位置
            String nextpageUrl=null;
            
if(nextpageStartPos>=0&&nextpageEndPos>=0)
                nextpageUrl
=content.Substring(nextpageStartPos,nextpageEndPos-nextpageStartPos);
            
return nextpageUrl;
        }

        
/**
         * 根据一个参数向量构建网页的URL地址
         * 构造格式为:src=http://'+g+'/it/u='+h+'&gp='+i+'.jpg
         * g,h,i为参数向量的第7,8,9个变量(下标依次为6,7,8)
         * (所有参数依次为:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q)
         
*/

        
private String generateURL(LinkedList<String> parameters)
        
{
            String[] paramArray 
= new String[17];
            
int count = 0;
            
foreach (String param in parameters)
            
{
                paramArray[count
++= param; 
            }

            String imageUrl 
= "http://" + paramArray[6+ "/it/u=" + paramArray[7+ "&gp=" + paramArray[8+ ".jpg";

            String urlKeyIdentifier 
= "baidu.com";//url地址中必须存在baidu域名,否则提取错误,删除之
            int index=imageUrl.IndexOf(urlKeyIdentifier);

            
return (index>0)?imageUrl:null;
        }

        
/**
         * 
         * 从javascript函数中提取参数向量
         * funURL('0','%CA%F7%D2%B6  ','26631','2&cm=1&sc=0','-1','19','t5.baidu.com','1132581693,1396616653','-36','600','396','104','jpg','
http://sucai.dabaoku.com/zhiwu/shuye/206.jpg  ','http://sucai.dabaoku.com/zhiwu/shuye/web/206.htm  ','26631','...?????<strong>??</strong>????206  ');
         * 分析结果为:以"--"字符隔开
         * 0--%CA%F7%D2%B6  --26631--2&cm=1&sc=0---1--19--t5.baidu.com--1132581693,1396616653
         * ---36--600--396--104--jpg--
http://sucai.dabaoku.com/zhiwu/shuye/206.jpg  
         * --
http://sucai.dabaoku.com/zhiwu/shuye/web/206.htm  --26631--...?????<strong>??</strong>????206 
         
*/

        
private void parseParameter(String jsFunctionStr, ref LinkedList<String> parameters)
        
{
            String startIdentifer 
= "'";//参数开始标识符
            String endIdentifer = "'";  //参数结束标识符 
            
//分析参数信息
            int currentPos = 0;
            
int paramStartPos = jsFunctionStr.IndexOf(startIdentifer, currentPos);
            
int paramEndPos = paramStartPos;
            
while (paramStartPos >= 0)
            
{
                paramStartPos
=paramStartPos + startIdentifer.Length;
                paramEndPos 
= jsFunctionStr.IndexOf(endIdentifer, paramStartPos);//寻找结束标识符的为位置
                if (paramEndPos < paramStartPos|| paramEndPos <= 0)
                    
break;

                String parameter 
= jsFunctionStr.Substring(paramStartPos, paramEndPos - paramStartPos);
                parameters.AddLast(parameter);
                paramStartPos 
= jsFunctionStr.IndexOf(startIdentifer, paramEndPos + endIdentifer.Length);//寻找开始标识符的为位置
            }

       
        }

    }

}

搜索结果:

下载图片:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值