Java爬虫入门篇(Spider Begin)
说到爬虫,在做这个项目之前我也是一头雾水,不知道到底这是个什么鬼,就是感觉很牛逼的一个东西(听起来很高大上),但是自己上手之后才明白,所有的项目基本上都差不多,只要你投入精力认真的去做了,或多或少都会有一些收获,当然肯定很多人会问的一个问题就是python爬虫不是更好吗,为什么要用java,我想说的是语言本身没什么,主要是思想,就是你处理这件事情或者业务的逻辑和方式只要比别人的好,那就是好的,因为能实现爬虫的语言多了去了,肯定是学不完的。
第一步,你要找打你需要爬取的数据源,也就是说你要爬取数据在网络上所在额度位置,我们这里爬取的数据是足球相关的信息,因为我们这个项目做的是资料库相关的数据,合作方是球探数据,虽然买了球探的接口,可以直接获取数据,但是有些我们需要的数据球探提供的接口中并没有,所以我们需要自己去获取这些数据。当然涉及到版权问题的话,请通知博主修改本博客,本博客完全是从技术和业务角度出发,没有恶意攻击球探数据或从中获取利益,本博客也只是共学习参考,并无商业价值。
首先我们访问一下球探数据的资料库首页,修改该页面的语言为自己需要的简繁或英文等。点击英国,去看英超的资料库,然后看切尔西球队对应的信息,然后打开浏览器的开发者平台的network部分,点击空白处然后刷新当前页面,然后会看到一个名字叫team36.js?version=yyyyMMddHH的js文件,然后获取这个地址,这个地址copy一下去访问,你最多访问一次,不可能查过两次就会爆出50x Server Error !服务器报错了。
数据地址找到了就是http://zq.win007.com/jsData/teamInfo/team36.js?version=yyyyMMddHH ,然后我们就需要开视爬去数据了,我们用的是springBoot(maven工程),主要爬去工具是HttpClient,当然别的Http求情工具也是可以的。
主要maven依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.43</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.2</version>
</dependency>
这里是对应的爬去代码,这只是一个简单的入门,并没有什么思想,主要是先把数据拿下来,就这样拿。
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.junit.Test;
public class SpiderTeamInfo {
@Test
public void spiderTeamInfo() throws URISyntaxException, ClientProtocolException, IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet();
URI uri = new URI("http://zq.win007.com/jsData/teamInfo/team36.js?version=2018041415");
httpGet.setURI(uri);
httpGet.addHeader("Accept-Charset", "GBK,utf-8");
httpGet.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
httpGet.addHeader("Accept-Language", "zh-CN,zh");
httpGet.addHeader("Cookie", "");
//在哪一页访问到的这个js
httpGet.addHeader("referer","http://zq.win007.com/cn/team/Summary/24.html");
httpGet.addHeader("User-Agent",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22");
HttpEntity entity = client.execute(httpGet).getEntity();
String rspStr = getRspStr(entity);
System.out.println(rspStr);
}
private String getRspStr(HttpEntity entity) throws UnsupportedOperationException, IOException {
if(null==entity) {
return null;
}
int leng = 0;
byte[] bytes = new byte[1024];
InputStream in = entity.getContent();
BufferedInputStream bis = new BufferedInputStream(in);
StringBuilder sb = new StringBuilder();
while(-1!=(leng = bis.read(bytes))) {
sb.append(new String(bytes,0,leng,"UTF-8"));
}
return sb.toString();
}
}
这就是爬去到的数据。ok , this is spider fisrt step. 这样的话,java爬虫就算是刚刚入门,本文这是入门,HttpClient可以池化,实际生产中肯定不会像上面这样写代码,第一步不是最重要的,最重要的解析爬虫,而不是爬去数据。
写在最后:本博客出发的角度是技术,而不是盗取信息,如果说损害到相关网站或公司利益,请通知博主修改本文。提醒:爬去到的数据是有限的,我们如果说需要这些数据的话还是建议购买接口,相对来说更加的便于开发,尊重知识产权,从你我做起。