数据抓取总结(请求篇)

发布于:2021-11-27 21:13:08



数据抓取总结
HTTP协议实例如何import到postmanokhttpget请求post请求
cookie的获取

AMF协议实例flex-messaging方法调用


webservice接口(.asmx)实例用到的包方法调用





HTTP协议

http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。


实例

简单的http请求可以直接通过浏览器提供的开发者工具进行分析,也可以import到postman进行分析。
一般我们只需要了解下图中红框框对应的内容,有时候下图中reques会多一个content-type,是post请求中body的类型说明。因为该请求body为空,所以这里没有。


如何import到postman

先在开发者工具中进行复制

其次import到postman


okhttp


com.squareup.okhttp3
okhttp
4.0.1


get请求

public static String getResponse(String url) {
log.info(url);
String result = null;

Request request = new Request.Builder()
.url(url)
.get()
.build();
Response response;
try {
response = OkHttpUtils.execute(request);
result = Objects.requireNonNull(response.body()).string();
response.close();
} catch (IOException e) {
log.info("访问url失败"+url);
}
return result;
}

post请求

public static String postResponse(String url, String body) {
String headerContext = "application/x-www-form-urlencoded; charset=UTF-8"; //根据具体的content-type进行修改
MediaType mediaType = MediaType.parse(headerContext);
RequestBody requestBody = RequestBody.create(body, mediaType);
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.addHeader("Content-Type", headerContext)
.build();
String datalist = null;
try {
Response response = OkHttpUtils.execute(request);
datalist = Objects.requireNonNull(response.body()).string();
response.close();
} catch (IOException e) {
log.info(url+" 获取error");
}
return datalist;
}

cookie的获取

有些网站需要一定的权限才能获取数据,这就涉及的cookie的获取。
cookie获取方法的汇总可以看我的另一篇文章: 未写.


AMF协议

AMF(Action Message Format)是Flash与服务端通信的一种常见的二进制编码模式,其传输效率高,可以在HTTP层面上传输。有时候要抓取网页中flash里的数据,可以发现不能简单的通过之前的方法抓取,可以参考以下例子。


实例

通过charles工具抓取就可以看到请求的数据 :


图一

图二


flex-messaging


org.apache.flex.blazeds
flex-messaging-core
4.7.3


org.apache.flex.blazeds
flex-messaging-common
4.7.3


方法调用

public void get() {
ArrayCollection resultList = getAMF("GisCommonDataUtil.getOneAndTwoLevelDivision", "realTime", "divisions");
}
public ArrayCollection getAMF(String url, String body, String getPart) {
AMFConnection connection = new AMFConnection();
ASObject asObject ;
ArrayCollection array = null;
try {
connection.connect(AMF_URL);//这里的AMF_URL为图一中的url

if (body != null) {
asObject = (ASObject) connection.call(url, body);

} else {
asObject = (ASObject) connection.call(url);

}
array = (ArrayCollection) asObject.get(getPart);
} catch (Exception e) {
log.error(url + "获取失败", e);
}
return array;
}

webservice接口(.asmx)

有时候要抓取的接口的后缀名是.asmx,可以参考以下例子。


实例

这里采用的例子是:
http://mobile.bjmemc.com.cn/NewPubService/Service.asmx.


首先用浏览器访问该链接



选一个点击进入

可以看到已经告诉我们请求的协议了,有时候页面上除了SOAP协议,还支持HTTP协议,如果有的话,可以直接用上面讲过的方法进行请求。


可以看到上图中usernamepassword取值还不清楚。同样使用charles抓取,得到:

上图的内容里的部分就是下面请求时用到的body


用到的包

同样采用okhttp,当然也可以用其他类似的



com.squareup.okhttp3
okhttp
4.0.1


方法调用

public String getData(String body) {
String url = STATION_URL;
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("text/xml");
//设置soap请求头,并设置方法名和参数

RequestBody body = RequestBody.create(body, mediaType);
Request request = new Request.Builder()
.url(url)
.post(body)
.addHeader("SOAPAction", "http://tempuri.org/GetData")
.addHeader("Content-Type", "text/xml; charset=utf-8")
.build();
try {
Response response = client.newCall(request).execute();
int code = response.code();
if (200 == code) {
return response.body().string();
}
} catch (Exception e) {
log.error("数据获取失败");
}
return null;
}

相关推荐

最新更新

猜你喜欢