爬虫介绍
简介
自动化、半自动化从互联网上采集数据的程序。
爬虫框架
一个简单的爬虫框架:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ifdLU0V-1625273924704)(http://m.qpic.cn/psb?/V142fVv21EKO4b/ehGhiSFPmw1GPPzU1LdWwTeX4v5JdcLe9d6KUIg.upE!/b/dL4AAAAAAAAA&bo=SQLDAQAAAAADB6s!&rf=viewer_4)]
如上图,通常爬虫会有一份种子URL,放在待抓取队列,通过scheduler调度这些url,交由downloader去下载网页数据,
进行数据的清洗解析,获取到所需要的信息进行存储,并将新解析出的有用URL放入待抓取队列。
爬虫的各个阶段
调度阶段
下图是调度系统通常需要考虑的一些事情。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ANVlp8b-1625273924706)(http://m.qpic.cn/psb?/V142fVv21EKO4b/Kb8Ov*GsHX5olgwSDQOiTKaXUc8Fk1DvgB4WaFecaQw!/b/dL8AAAAAAAAA&bo=MgKRAAAAAAADB4M!&rf=viewer_4)]
下图是一个简单的调度模块,由一个Crane定时任务+queue队列来实现一个基本的调度。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GkQudYxZ-1625273924707)(http://m.qpic.cn/psb?/V142fVv21EKO4b/N5QsvBPNK6*43qv8XNvhwkUQULxtCrgPBGXw6ISjdSY!/b/dFIBAAAAAAAA&bo=pwGmAQAAAAADByM!&rf=viewer_4)]
下载阶段
通常通过封装HttpClient、HttpUrlConnection来实现下载器。
HttpClient的应用举例
//HttpClient的使用样例,下面是一个GET请求,PostMethod可以发送post请求,同理也可发送delete、put、head请求。
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.ListUtils;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;
import java.io.IOException;
public static void main(String[] args) {
HttpClient httpClient = new HttpClient();
HttpMethod httpMethod = new GetMethod("http://www.sina.com.cn");
httpMethod.addRequestHeader("Content-Type", "text/html;charset=utf-8"); //这里设置字符编码,避免乱码
int statusCode = -1;
byte[] result = null;
try {
statusCode = httpClient.executeMethod(httpMethod);
if (statusCode != HttpStatus.SC_OK) {//判断返回
System.out.println("get failure!");
return;
}
if (httpMethod.getResponseBody() != null) {//获取页面数据
result = httpMethod.getResponseBody();//hm.getStatusLine()――http状态和请求结果
}
} catch (HttpException e1) {
e1.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
} finally {
httpMethod.releaseConnection();
}
if (result != null) {
try {
String data = new String(result, "UTF-8");//字符编码设置
System.out.println(data);//测试输出
} catch (Exception e) {
LOGGER.info("an exception! e = {}", e);
}
}
}
//jar包依赖
/*
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
*/
-
post请求可以用于模拟登录网页等操作,是常用到的一种请求方式,post请求一般需要携带header、cookie等信息。
-
此类方式抓到的数据都是未经过JS渲染的。
-
todo增加一篇详细的httpclient等下载方式的介绍。以及模拟登录的实现样例。
解析阶段
此阶段主要是将下载阶段获取的html文本或者其他格式的数据进行格式化,