httpclient 抓取网页(缺点是需要人工寻找post请求的url和对应的参数 )

优采云 发布时间: 2022-03-07 18:19

  httpclient 抓取网页(缺点是需要人工寻找post请求的url和对应的参数

)

  缺点是需要手动查找post请求的url和对应的参数。

  参考:

  1.为 GET 和 POST 请求添加请求参数和标头(使用 HttpClient,Java)

  2.关于爬取js加载的内容(参考本博客的流程,比如找到实际的请求url)

  以一条新闻为例:

  1.使用F12,先在网络中的文件列表中找到该网页,双击弹出详细信息。“文本”查看网页内容,发现该信息对应的信息没有显示在网页上,说明是稍后加载的。

  

  2.尝试在文本中搜索关键字以查看正在请求哪些文件获取数据。例如,在文本中搜索第一个单词“海关总署”可能会找到多个文件,需要进行判断和选择。

  

  对应的请求体为“id:98212”,即请求参数

  3.查看标题

  主要取决于请求的url和请求的方法,有时还需要设置user-agent。需要使用post方法

  

  4.代码编写

  创建一个 Java Maven 项目并添加依赖项:

  

org.apache.httpcomponents

httpclient

4.5.6

com.google.code.gson

gson

2.2.4

  下载的jar包如下图所示:

  

  代码如下,我只拿到了文章的body:

  import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

import java.util.Map;

import org.apache.http.HttpEntity;

import org.apache.http.NameValuePair;

import org.apache.http.client.entity.UrlEncodedFormEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.http.message.BasicNameValuePair;

import org.apache.http.util.EntityUtils;

import com.google.gson.Gson;

/**

* http://news.cqcoal.com/blank/nc.jsp?mid=98212

* 该网页的新闻主题是动态生成的,希望获取内容

* @author yangc_cong

*

*/

public class TestNewContent {

/**

* 针对请求的链接,使用post方法获取返回的数据

* @param urlStr String类型

* @return 这里是Map类型

*/

private Map getPageContByHttpCl(String urlStr) {

CloseableHttpClient httpclient = HttpClients.createDefault();

HttpPost post = new HttpPost(urlStr);

String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362";

post.setHeader("User-Agent", userAgent);

CloseableHttpResponse response = null;

String result = null;

// 创建请求参数

List list = new LinkedList();

BasicNameValuePair param1 = new BasicNameValuePair("id", "98212");

list.add(param1);

// 使用URL实体转换工具

UrlEncodedFormEntity entityParam = null;

try {

entityParam = new UrlEncodedFormEntity(list, "UTF-8");

post.setEntity(entityParam);

} catch (UnsupportedEncodingException e1) {

e1.printStackTrace();

}

try {

response = httpclient.execute(post);

HttpEntity entity = response.getEntity();

result = EntityUtils.toString(entity, "UTF-8");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

response.close();

httpclient.close();

} catch (IOException e) {

e.printStackTrace();

}

}

System.out.println(result);

Gson gson = new Gson();

Map map = gson.fromJson(result, Map.class);

return map;

}

private void parse_content(Map map) {

//java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map

ArrayList arrayList = (ArrayList)(map.get("rows"));

Map innerMap = (Map) arrayList.get(0);

String source = (String) innerMap.get("source");

String bodyhtml = (String) innerMap.get("body");

System.out.println("source: "+source);

System.out.println("bodyhtml:"+'\n'+bodyhtml);

}

public static void main(String[] args) {

TestNewContent test1 = new TestNewContent();

String urlStr = "http://news.cqcoal.com/manage/newsaction.do?method:getNewsArchives";

Map map = test1.getPageContByHttpCl(urlStr);

test1.parse_content(map);

}

}

  运行截图:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线