从百度图片搜索上下载叶片图像,作为柑橘溃疡病识别的负样本。
百度图片搜索的结果通过一个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+'k '+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>';
}
... {
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+'k '+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);//寻找开始标识符的为位置
}
}
}
}
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);//寻找开始标识符的为位置
}
}
}
}
搜索结果:
下载图片: