c httpclient抓取网页(【每日一题】模拟客户端(第九期))

优采云 发布时间: 2021-09-15 04:12

  c httpclient抓取网页(【每日一题】模拟客户端(第九期))

  获取网页其实就是模拟客户端(PC、手机...)发送请求,获取响应数据文档,解析相应数据的过程。 ---我明白了,如果你有任何错误,请告诉我

  一般来说,常用的请求方式有三种:GET、POST、HEAD

  GET 请求的数据用作 url 的一部分。对于GET请求,附加数据长度有限,数据安全性低

  POST请求,数据作为标准数据传输到服务器,数据长度不限,数据通过加密传输,安全性高

  HEAD 类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取头部

  停止八卦。

  通过 GET 请求获取网页

  UrlConnection下载网页通过InputStream读取数据,通过FileOutPutStream写入文件

  public class DownloadHtml {

/**

* 方法说明:用于下载HTML页面

*@param SrcPath 下载目标页面的URL

*@param filePath 下载得到的HTML页面存放本地目录

*@param fileName 下载页面的名字

*/

public static void downloadHtmlByNet(String SrcPath,String filePath,String fileName){

try{

URL url = new URL(SrcPath);

URLConnection conn = url.openConnection();

//设置超时间为3秒

conn.setConnectTimeout(3*1000);

//防止屏蔽程序抓取而返回403错误

conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

//输出流

InputStream str = conn.getInputStream();

//控制流的大小为1k

byte[] bs = new byte[1024];

//读取到的长度

int len = 0;

//是否需要创建文件夹

File saveDir = new File(filePath);

if(!saveDir.exists()){

saveDir.mkdir();

}

File file = new File(saveDir+File.separator+fileName);

//实例输出一个对象

FileOutputStream out = new FileOutputStream(file);

//循环判断,如果读取的个数b为空了,则is.read()方法返回-1,具体请参考InputStream的read();

while ((len = str.read(bs)) != -1) {

//将对象写入到对应的文件中

out.write(bs, 0, len);

}

//刷新流

out.flush();

//关闭流

out.close();

str.close();

System.out.println("下载成功");

}catch (Exception e) {

e.printStackTrace();

}

}

//测试

public static void main(String[] args) {

//下载网页<br />    url是要下载的指定网页,filepath存放文件的目录如d:/resource/html/ ,filename指文件名如"下载的网页.html"

  <br />

downloadHtmlByNet(url,filepath,filename);

}

}

  HttpClient 是 Apache Jakarta Common 下的一个子项目。提供高效、最新且功能丰富的客户端编程工具包,支持 HTTP 协议

  public static void downloadHtmlByNet(String SrcPath,String filePath,String fileName){

DefaultHttpClient httpClient=new DefaultHttpClient();//初始化httpclient

BasicHttpParams httpParams=new BasicHttpParams();//初始化参数<br />

  //模拟浏览器访问防止屏蔽程序抓取而返回403错误<br />user_agent="Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36     <br /><br />user_agent="Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"

  

httpParams.setParameter("http.useragent", user_agent);

httpClient.setParams(httpParams);

try {

HttpGet httpGet=new HttpGet(SrcPath);

HttpContext httpContext=new BasicHttpContext();

HttpResponse httpResponse=httpClient.execute(httpGet,httpContext);

HttpEntity entity=httpResponse.getEntity();

if(entity!=null){

writeToFile(entity,filePath,fileName);//将entity内容输出到文件

}

} catch (ClientProtocolException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

finally {

httpClient.getConnectionManager().shutdown();

}

}

  private static void writeToFile(HttpEntity entity, String filepath, String filename) {

//输出流

try{

InputStream str = entity.getContent();

//控制流的大小为1k

byte[] bs = new byte[1024];

//读取到的长度

int len = 0;

//是否需要创建文件夹

File saveDir = new File(filePath);

if(!saveDir.exists())

{

saveDir.mkdir();

}

File file = new File(saveDir+File.separator+fileName);

//实例输出一个对象

FileOutputStream out = new FileOutputStream(file);

//循环判断,如果读取的个数b为空了,则is.read()方法返回-1,具体请参考InputStream的read();

while ((len = str.read(bs)) != -1) {

//将对象写入到对应的文件中

out.write(bs, 0, len);

}

//刷新流

out.flush();

//关闭流

out.close();

str.close();

System.out.println("下载成功");

}

catch(Exception e){

e.printStackTrace();

}

}

  唉,我以前忘记了,所以了解更多并记住,下次我使用该帖子获取有用的数据。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线