-
关于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.action2012年3月06日 16:58
12个答案 按时间排序 按投票排序
-
采纳的答案
源数据问题,你不一定能捕获到,如果你请求的页面dao报了异常,返回的数据为null,前端页面只是没有数据而已,你完全觉察不到
问题很好解决,如果内容有问题的打log2012年3月07日 14:57
-
问题补充:
fslx2008 写道
你要抓取的页面是否有ajax的异步数据,页面如果包含这些延迟加载的数据,是不能通过一次抓取得到全部数据的。
这个不对的,异步加载的话,还是会再一次请求的。
没看懂你说的意思,我说的不知道你看懂没有,页面中包含通过ajax延迟加载的数据的话,只抓取一次是不能将整个页面的内容取到的,而且从你的问题和代码中也没有关于再一次请求的实现2012年3月08日 13:36
-
既然前100页没有问题,说明代码基本是ok的,数据源的问题可能比较大,这样,你把没有抓到数据的请求打印出来,然后用这些参数去确认一下,看是否能拉到数据,我怀疑是拉不到的。试试吧
2012年3月08日 12:49
-
1、到了第100页,他的库里存的数据有问题(比如库里存了带html标签的内容,导致页面标签不闭合),页面没有数据,但是你请求返回的肯定是200,只有一些静态内容。可以用日志打印一下url,手动去请求一下试试
2、如果是服务器压力导致的异常问题,你sleep10秒钟再抓一次试试2012年3月08日 11:30
-
哥们,你用httpclient是模拟浏览器访问网页/登录等,这种东西感觉你最好先搞个抓包工具先看访问网页post,get的东西,就能找到你先要的东西了。
2012年3月07日 17:27
相关推荐
在本篇文章中,我们将深入探讨如何使用Java HttpClient来抓取网页数据以及如何打包成jar文件。 **一、Java HttpClient简介** Java HttpClient 是 Apache HttpClient 库的一部分,它提供了丰富的功能,包括连接管理...
HttpClient和Jsoup是两个Java库,分别专注于HTTP通信和HTML解析,它们常被组合使用来高效地抓取网页数据。下面我们将详细探讨这两个库及其在网页抓取中的应用。 HttpClient是由Apache软件基金会开发的一个库,主要...
POST请求常用于向服务器提交数据。HttpClient中对应的类是`HttpPost`。首先创建`HttpPost`对象,然后使用`NameValuePair`或`HttpEntity`来设置POST的数据: ```java HttpPost httpPost = new HttpPost(...
POST请求通常用于提交表单数据,而不仅仅是获取静态网页内容。在本文中,我们将深入探讨如何使用C#实现这个功能,以及相关的重要知识点。 首先,要模拟POST请求,我们需要理解HTTP协议的基本原理。POST请求包括一个...
在本文中,我们将深入探讨HttpClient的基本用法,以及如何使用它来抓取网页内容。 首先,你需要在项目中引入HttpClient的依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org....
总结来说,Java HttpClient是一个强大的工具,能够帮助我们方便地与Web服务器进行交互,动态提交数据。通过理解和掌握其用法,开发者可以构建各种复杂的网络应用程序,进行数据抓取、自动化测试或集成服务。
- 首先尝试直接提交数据(`postData`),如果失败,则执行登录操作(`postSignin`)后再次尝试提交数据。 - 如果直接提交数据成功,则表示用户已经登录或无需登录即可访问资源。 - **`postData` 方法**: - 创建...
HttpClient库中的类和方法通常不需要使用注解,因为它的配置主要通过对象构造和方法调用来完成。然而,如果你在使用日志框架(如Log4j),可能需要在项目中添加相应的日志配置,如`@Log4j`,以便在代码中记录...
Jsoup+httpclient 模拟登录和抓取知识点: 1. Jsoup库使用介绍: - Jsoup是一个Java的HTML解析器,能够直接解析HTML文档,提供类似于jQuery的操作方法。 - 主要功能包括从URL、文件或字符串中解析HTML,使用DOM或...
我们需要将这个cookie添加到`HttpClient`的默认请求头中,以便在提交数据或抓取页面时保持会话: ```csharp client.DefaultRequestHeaders.Add("Cookie", "session_id=your_session_id"); ``` 至于数据抓取,可以...
- HttpClient常用于网页抓取,配合HTML解析库(如Jsoup)可以提取网页数据。 - 在自动化测试中,模拟用户请求以验证服务器端功能。 在实际使用中,HttpClient的灵活性和强大功能使其成为Java开发者的首选HTTP...
以上只是HttpClient的基础使用方法,实际应用中可能需要处理更多细节,如重试策略、超时设置、Cookie管理、身份验证等。HttpClient库还支持更高级的功能,如POST请求、PUT请求、DELETE请求,以及HTTP/2协议。 总结...
首先,我们来了解一下HTTPClient的基本用法。创建一个HttpClient实例通常是第一步,这可以通过`HttpClientBuilder`或者`HttpClients`类来实现。例如: ```java CloseableHttpClient httpClient = HttpClients....
- `BasicHttpEntityEnclosingRequest`:如果需要POST数据,可以使用此类包装请求实体。 - `DefaultHttpClient`:HttpClient的一个实现,包含了默认的连接管理器和配置。 4. **身份验证** 对于登录操作,可能需要...
在Java中,使用`httpclient`可以方便地构建HTTP请求,发送GET、POST以及其他HTTP方法,并接收服务器响应。例如,我们可以创建一个`CloseableHttpClient`实例,然后通过`HttpGet`或`HttpPost`对象来指定请求URL和参数...
HttpClient的使用方法可能包括创建一个HttpClient实例,设置请求方法(GET、POST等)、URL、请求头、查询参数或请求体,然后发送请求并接收响应。响应对象通常会包含状态码、头部信息和响应体,可以从中提取出需要的...
在本文中,我们将深入探讨HttpClient的主要功能、使用方法以及在网络爬虫中的应用。 一、HttpClient简介 HttpClient是由Apache软件基金会开发的一个开源项目,主要用于处理HTTP协议。它支持HTTP/1.1和HTTP/2,提供...
在“java抓取网页数据”这个主题中,我们将深入探讨如何利用Java来抓取并处理互联网上的信息。 首先,我们要了解什么是网络爬虫。网络爬虫(Web Crawler)是自动遍历互联网的程序,通过抓取网页内容并存储在本地,...