0 0

关于httpclient用法, post提交,抓取数据不全20

请教下面纠结的问题:
    我用httpclient,post提交参数,抓取指定检索到的的数据(分多个页面,一个页面一次提交请求),大部分抓取的数据都是全的,大概抓取了100左右页面数据,就开始有一页面的数据不全,断断续续,不全的数据是:没有我指定参数提交的检索到的数据(只有静态页面的数据,即:没有业务数据),但是请求返回来的状态是200,也获取不到异常,纠结了好几天;代码:

public String clientPost(String urll, String htmlbody) {
String[] repParams = htmlbody.split("&");
List<NameValuePair> data = new ArrayList<NameValuePair>();
HttpPost post = new HttpPost(urll);
for (String param : repParams) {
data.add(new BasicNameValuePair(param.substring(0,
param.indexOf("=")), param.substring(
param.indexOf("=") + 1, param.length())));
}
try {
// 参数
post.setEntity(new UrlEncodedFormEntity(data, "utf-8"));
// execute post
HttpResponse response = httpClient.execute(post);
if (response.getStatusLine().getStatusCode() == 200) {

a++;
System.out.println("第:" + a + "次请求成功");
HttpEntity entity = response.getEntity();
BufferedReader read = new BufferedReader(new InputStreamReader(
entity.getContent(), "utf-8"));
String currentLine;
System.out.println("entity.getContent:"
+ entity.getContent().toString().length());
StringBuffer buff = new StringBuffer();
while ((currentLine = read.readLine()) != null) {
buff.append(currentLine);
}
System.out.println("buff长度:" + buff.length());
if (buff.length() < 60000) {  //数据不全判断
int i = 1;
clientPost(urll, htmlbody);
System.out.println("第" + (a - i) + "页请求了" + (++i) + "次");
} else {
String urlContent = post.getURI().getRawPath()
+ "\r\n"
+ post.getRequestLine().toString()
+ "\r\n"
+ displayInfo(new UrlEncodedFormEntity(data,
"utf-8").getContent());
logContent(urlContent, buff.toString(), a + ".html");
System.out.println("buff:--------------"
+ buff.toString().length());
return buff.toString();
}
}

} catch (UnsupportedEncodingException e) {
e.printStackTrace();
logNetErr(e);
} catch (ClientProtocolException e) {
e.printStackTrace();
logNetErr(e);
} catch (IOException e) {
e.printStackTrace();
logNetErr(e);
} finally {
post.releaseConnection();
         httpClient.getConnectionManager().closeExpiredConnections();
}
return null;
}

还请各位碰到这样的问题指教下:

问题补充:
rommal7090 写道
你把代码全贴上来看看

没有必要吧,这个地方是出错的关键地方,函数的参数 htmlbody,是请求体,每次调用不一样,每一次调用就是请求一页的数据

问题补充:
wangqj 写道
有可能是源数据的问题,应该先确定抓取源的问题

,问题是:要是源数据问题的话,我这边是可以捕获的到异常的信息的吧,可否讲具体点呢

问题补充:
fslx2008 写道
你要抓取的页面是否有ajax的异步数据,页面如果包含这些延迟加载的数据,是不能通过一次抓取得到全部数据的。

这个不对的,异步加载的话,还是会再一次请求的。

问题补充:
wangqj 写道
源数据问题,你不一定能捕获到,如果你请求的页面dao报了异常,返回的数据为null,前端页面只是没有数据而已,你完全觉察不到

问题很好解决,如果内容有问题的打log

就这么说吧,我再一次补充下我的问题:如:我在一网站搜索框输入想要的car,出现了1万条数据,即:1000页,一页10条,我每一页去抓取,就一个post请求(有参数),当我抓取到了100页(大概)时候,突然有一页数据不全,不全意思是有数据,但是没有我要的业务数据,有的数据只是些静态的页面数据而已,这种情况,断断续续的,数据即使不全,请求的状态也是200(即成功),也捕获不到异常,上面说的 做log这个我想过,但是我现在要知道,哪出问题了,是我的连接请求问题呢?还是数据源问题呢?总之搞清楚出问题的根源。谢谢各位,有经验者请多多想想,多多指导。

问题补充:
hac103 写道
哥们,你用httpclient是模拟浏览器访问网页/登录等,这种东西感觉你最好先搞个抓包工具先看访问网页post,get的东西,就能找到你先要的东西了。

我想httpclient模拟浏览器,会有缓存机制(猜测),具体的还没有深入研究

问题补充:
fslx2008 写道
你要抓取的页面是否有ajax的异步数据,页面如果包含这些延迟加载的数据,是不能通过一次抓取得到全部数据的。

我用fiddler工具,查看到了,不是异步加载(ajax),一次请求全部数据都得到了,当然也很谢谢你的问答!~~

问题补充:
xj753277 写道
判断一定是抓取的页面有ajax请求,当你抓取的时候 ajax还没返回,所以就没抓全

没有异步请求,确定

问题补充:
wangqj 写道
1、到了第100页,他的库里存的数据有问题(比如库里存了带html标签的内容,导致页面标签不闭合),页面没有数据,但是你请求返回的肯定是200,只有一些静态内容。可以用日志打印一下url,手动去请求一下试试
2、如果是服务器压力导致的异常问题,你sleep10秒钟再抓一次试试

你说的是服务器压力问题,这个我想过,且,要sleep10秒。但是当100页数据不全(服务器压力问题),那么到了101等更多的页面时候,为什么就不会有数据不全的问题呢?我没有做任何的sleep操作。再一次请教下~~!谢谢

问题补充:
guazi 写道
既然前100页没有问题,说明代码基本是ok的,数据源的问题可能比较大,这样,你把没有抓到数据的请求打印出来,然后用这些参数去确认一下,看是否能拉到数据,我怀疑是拉不到的。试试吧

其实这些问题,我们只是在猜测吧,如网络异常,数据源问题等等。我想我现在要做的应该是把具体的某一次没有成功的请求(数据不全),重新请求,可能不会再出现了,数据不全的问题。这我想只是个解决问题方法的转变吧,但是我想确认知道这个问题出现的根源吧。这样以后再出现这种问题或者没有出现这种问题,我可以提前做好相应的方法去准备。

问题补充:
fslx2008 写道
问题补充:

fslx2008 写道

你要抓取的页面是否有ajax的异步数据,页面如果包含这些延迟加载的数据,是不能通过一次抓取得到全部数据的。

这个不对的,异步加载的话,还是会再一次请求的。


没看懂你说的意思,我说的不知道你看懂没有,页面中包含通过ajax延迟加载的数据的话,只抓取一次是不能将整个页面的内容取到的,而且从你的问题和代码中也没有关于再一次请求的实现

没有延迟加载的,我确认过没有用到ajax,在这一块

问题补充:
fslx2008 写道
不知道你能否把你要抓取的页面发来,让大家一起分析下呢,你的实现代码就不用了。

链接:http://59.151.93.244/search!doOverviewSearch.action

12个答案 按时间排序 按投票排序

0 0

采纳的答案

源数据问题,你不一定能捕获到,如果你请求的页面dao报了异常,返回的数据为null,前端页面只是没有数据而已,你完全觉察不到

问题很好解决,如果内容有问题的打log

2012年3月07日 14:57
0 0

我认为是网站禁止你抓取的表现。

2012年3月15日 15:01
0 0

不知道你能否把你要抓取的页面发来,让大家一起分析下呢,你的实现代码就不用了。

2012年3月08日 13:41
0 0

问题补充:

fslx2008 写道

你要抓取的页面是否有ajax的异步数据,页面如果包含这些延迟加载的数据,是不能通过一次抓取得到全部数据的。

这个不对的,异步加载的话,还是会再一次请求的。


没看懂你说的意思,我说的不知道你看懂没有,页面中包含通过ajax延迟加载的数据的话,只抓取一次是不能将整个页面的内容取到的,而且从你的问题和代码中也没有关于再一次请求的实现

2012年3月08日 13:36
0 0

既然前100页没有问题,说明代码基本是ok的,数据源的问题可能比较大,这样,你把没有抓到数据的请求打印出来,然后用这些参数去确认一下,看是否能拉到数据,我怀疑是拉不到的。试试吧

2012年3月08日 12:49
0 0

1、到了第100页,他的库里存的数据有问题(比如库里存了带html标签的内容,导致页面标签不闭合),页面没有数据,但是你请求返回的肯定是200,只有一些静态内容。可以用日志打印一下url,手动去请求一下试试
2、如果是服务器压力导致的异常问题,你sleep10秒钟再抓一次试试

2012年3月08日 11:30
0 0

服务端没有返回数据的长度?

2012年3月07日 20:28
0 0

哥们,你用httpclient是模拟浏览器访问网页/登录等,这种东西感觉你最好先搞个抓包工具先看访问网页post,get的东西,就能找到你先要的东西了。

2012年3月07日 17:27
0 0

判断一定是抓取的页面有ajax请求,当你抓取的时候 ajax还没返回,所以就没抓全

2012年3月07日 16:10
0 0

有可能是源数据的问题,应该先确定抓取源的问题

2012年3月07日 14:09
0 0

你要抓取的页面是否有ajax的异步数据,页面如果包含这些延迟加载的数据,是不能通过一次抓取得到全部数据的。

2012年3月07日 09:57
0 0

你把代码全贴上来看看

2012年3月06日 17:33

相关推荐

    java httpclient 抓取 数据 和jar 包

    在本篇文章中,我们将深入探讨如何使用Java HttpClient来抓取网页数据以及如何打包成jar文件。 **一、Java HttpClient简介** Java HttpClient 是 Apache HttpClient 库的一部分,它提供了丰富的功能,包括连接管理...

    httpClient+jsoup 抓取网页数据

    HttpClient和Jsoup是两个Java库,分别专注于HTTP通信和HTML解析,它们常被组合使用来高效地抓取网页数据。下面我们将详细探讨这两个库及其在网页抓取中的应用。 HttpClient是由Apache软件基金会开发的一个库,主要...

    HttpClient get、post 请求,抓取网络数据,jar包以及源码

    POST请求常用于向服务器提交数据。HttpClient中对应的类是`HttpPost`。首先创建`HttpPost`对象,然后使用`NameValuePair`或`HttpEntity`来设置POST的数据: ```java HttpPost httpPost = new HttpPost(...

    C# 模拟Post抓取数据

    POST请求通常用于提交表单数据,而不仅仅是获取静态网页内容。在本文中,我们将深入探讨如何使用C#实现这个功能,以及相关的重要知识点。 首先,要模拟POST请求,我们需要理解HTTP协议的基本原理。POST请求包括一个...

    HttpClient抓取网页Demo

    在本文中,我们将深入探讨HttpClient的基本用法,以及如何使用它来抓取网页内容。 首先,你需要在项目中引入HttpClient的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org....

    java动态提交网站httpclient

    总结来说,Java HttpClient是一个强大的工具,能够帮助我们方便地与Web服务器进行交互,动态提交数据。通过理解和掌握其用法,开发者可以构建各种复杂的网络应用程序,进行数据抓取、自动化测试或集成服务。

    httpclient测试登录并提交表单功能

    - 首先尝试直接提交数据(`postData`),如果失败,则执行登录操作(`postSignin`)后再次尝试提交数据。 - 如果直接提交数据成功,则表示用户已经登录或无需登录即可访问资源。 - **`postData` 方法**: - 创建...

    HttpClient发送http请求(post和get)需要的jar包+内符java代码案例+注解详解

    HttpClient库中的类和方法通常不需要使用注解,因为它的配置主要通过对象构造和方法调用来完成。然而,如果你在使用日志框架(如Log4j),可能需要在项目中添加相应的日志配置,如`@Log4j`,以便在代码中记录...

    Jsoup+httpclient 模拟登陆和抓取

    Jsoup+httpclient 模拟登录和抓取知识点: 1. Jsoup库使用介绍: - Jsoup是一个Java的HTML解析器,能够直接解析HTML文档,提供类似于jQuery的操作方法。 - 主要功能包括从URL、文件或字符串中解析HTML,使用DOM或...

    C#post登陆然后进行提交抓数据

    我们需要将这个cookie添加到`HttpClient`的默认请求头中,以便在提交数据或抓取页面时保持会话: ```csharp client.DefaultRequestHeaders.Add("Cookie", "session_id=your_session_id"); ``` 至于数据抓取,可以...

    HttpClient网页抓取工具包整合

    - HttpClient常用于网页抓取,配合HTML解析库(如Jsoup)可以提取网页数据。 - 在自动化测试中,模拟用户请求以验证服务器端功能。 在实际使用中,HttpClient的灵活性和强大功能使其成为Java开发者的首选HTTP...

    httpclient抓取网页数据和所需的10个jar包

    以上只是HttpClient的基础使用方法,实际应用中可能需要处理更多细节,如重试策略、超时设置、Cookie管理、身份验证等。HttpClient库还支持更高级的功能,如POST请求、PUT请求、DELETE请求,以及HTTP/2协议。 总结...

    httpclient远程网页抓取工具

    首先,我们来了解一下HTTPClient的基本用法。创建一个HttpClient实例通常是第一步,这可以通过`HttpClientBuilder`或者`HttpClients`类来实现。例如: ```java CloseableHttpClient httpClient = HttpClients....

    HttpClient 登录163邮箱

    - `BasicHttpEntityEnclosingRequest`:如果需要POST数据,可以使用此类包装请求实体。 - `DefaultHttpClient`:HttpClient的一个实现,包含了默认的连接管理器和配置。 4. **身份验证** 对于登录操作,可能需要...

    爬数据案例 httpclient htmlparser

    在Java中,使用`httpclient`可以方便地构建HTTP请求,发送GET、POST以及其他HTTP方法,并接收服务器响应。例如,我们可以创建一个`CloseableHttpClient`实例,然后通过`HttpGet`或`HttpPost`对象来指定请求URL和参数...

    HttpClient 获取数据

    HttpClient的使用方法可能包括创建一个HttpClient实例,设置请求方法(GET、POST等)、URL、请求头、查询参数或请求体,然后发送请求并接收响应。响应对象通常会包含状态码、头部信息和响应体,可以从中提取出需要的...

    httpclient

    在本文中,我们将深入探讨HttpClient的主要功能、使用方法以及在网络爬虫中的应用。 一、HttpClient简介 HttpClient是由Apache软件基金会开发的一个开源项目,主要用于处理HTTP协议。它支持HTTP/1.1和HTTP/2,提供...

    java抓取网页数据

    在“java抓取网页数据”这个主题中,我们将深入探讨如何利用Java来抓取并处理互联网上的信息。 首先,我们要了解什么是网络爬虫。网络爬虫(Web Crawler)是自动遍历互联网的程序,通过抓取网页内容并存储在本地,...

Global site tag (gtag.js) - Google Analytics