java爬虫抓取动态网页(爬虫科普一下对爬虫的误区、原理以及实现(组图))
优采云 发布时间: 2021-09-19 15:11java爬虫抓取动态网页(爬虫科普一下对爬虫的误区、原理以及实现(组图))
爬行动物?我相信很多人都熟悉这个词。简而言之,就是使用工具来抓取网页上的数据,并对其进行分类和分析。像往常一样,向小白询问爬行动物的误解、原理和实施情况
爬虫的常见误解:python=crawler
许多白人把蟒蛇等同于爬虫。实际上,Python是一种计算机编程语言。它不仅可以是一个爬虫程序,还可以构建web应用程序。最近火灾的人工智能也可以通过使用python语言来实现
爬虫的本质是抓取服务器响应浏览器的数据(下面将详细介绍其原理)。不同的计算机编程语言,如Java和c#可以实现爬虫程序
概要:Python≠ 爬虫。Python的功能远比我们想象的强大。爬虫程序不能仅由python实现
爬行动物原理
让我们回忆一下我们对百度的访问:
1.在地址栏中输入URL:
有些人会说我以前从来没有这样做过。我使用浏览器导航到百度
其实,这样进入百度,只需在浏览器中为你输入访问百度的链接即可
2.浏览器刷新,百度的搜索框出现在我们面前
当然,不考虑网络速度无法刷新的情况
在此期间,浏览器和服务器之间发生了什么
1.浏览器向服务器发送URL,即请求地址
2.服务器接收来自浏览器的网络请求,并开始响应浏览器的数据
3.browser接收服务器发送的数据,对其进行分析并显示
如果您感兴趣,可以清除浏览器缓存,使用FN+F12打开浏览器控制台,选择网络菜单,在刷新页面时可以看到具体的响应过程
爬虫的实现机制
1.由于浏览器可以向服务器发送请求地址,我们也可以使用程序向服务器发送请求
2.由于浏览器可以接收服务器发送的数据,我们可以模拟浏览器解析过程,通过筛选得到我们想要的数据
小结:通过我们自己的程序,我们不需要重复整理我们想要的数据。所有这些都留给我们的爬虫程序
Java爬虫的具体案例
目标:抓取动态模块显示的最新新闻,并将新闻内容以文件形式本地保存
爬网资源1
爬网资源2
(一)需求分析)
1.分析新闻网主页,捕捉部门动态模块内容
2.simulate jump,进入每个新闻页面并抓取新闻的具体内容
3.将新闻的详细信息保存在文件中
(二)代码实现)
1.使用Maven工具在pom.xml中导入我们的爬虫程序所依赖的jar包
org.apache.httpcomponents
httpclient
4.5.3
org.jsoup
jsoup
1.8.3
log4j
log4j
1.2.16
junit
junit
4.10
2.make一个用于发送请求的简单类
package com.sxau.example;
import java.io.IOException;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;
public class MyClient {
public String getContent(String url) throws ClientProtocolException, IOException {
// 创建httpclient对象
HttpClient hClient = new DefaultHttpClient();
// 设置连接超时时间,响应超时时间,以及代理服务器
hClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000)
.setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
.setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("117.191.11.71", 8080));
// 创建get请求对象
HttpGet hGet = new HttpGet(url);
// 模拟请求,获得服务器响应的源码
HttpResponse response = hClient.execute(hGet);
// 将源码转换为字符串
String content = EntityUtils.toString(response.getEntity(), "UTF-8");
// 返回转化后的字符串
return content;
}
}
3.make一个用于解析服务器数据的类
package com.sxau.example;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public class MyJsoup {
public Elements getTarget(
String htmlResource,String selectCondition) {
//解析服务器发来的数据
Document doc = Jsoup.parse(htmlResource);
//对解析后的数据通过条件筛选
Elements elements = doc.select(selectCondition);
return elements;
}
}
4.make一个本地存储文件的类
package com.sxau.example;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class MyFileIO {
public void makeFile(String title,String txtContent) throws IOException {
//将标题左右多余的空格去掉
title = title.trim();
//拿到当前应用所在路径
String property = System.getProperty("user.dir");
//设置生成文件的路径与名称
String filePath = property + "\\src\\main\\webapp\\spidertxt\\" + title + ".txt";
//生成新文件
File txt = new File(filePath);
//将文件输入器定位到刚刚生成的新文件
FileWriter writer = new FileWriter(txt);
//将已经匹配的字符串写入文件中
writer.write(txtContent);
//刷新并关闭流
writer.flush();
writer.close();
}
}
5.为了提高效率,制作了一个线程进行并发处理
package com.sxau.example;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.jsoup.select.Elements;
/**
* 实现Runable接口
* @author Administrator
*
*/
public class MyThread implements Runnable{
private String mainUrl;
private String singleUrl;
//提供有参数的构造方法,确保进入页面时url不为空
public MyThread(String mainUrl, String singleUrl) {
this.mainUrl = mainUrl;
this.singleUrl = singleUrl;
}
/**
* 实现接口未实现的run()方法
* 通过httpclient发送请求并接收数据
* 观察html页面,使用jsoup中便捷的仿css/js选择器语法得到我们需要的内容
* 对匹配好的字符串进行优化,并进行本地存储
*/
@Override
public void run() {
// TODO 自动生成的方法存根
MyClient myClient = new MyClient();
String url=mainUrl+singleUrl;
String content;
try {
content = myClient.getContent(url);
String selectCondition1=".arti_title";
String selectCondition2=".wp_articlecontent";
MyJsoup jsoup = new MyJsoup();
Elements elements1 = jsoup.getTarget(content, selectCondition1);
Elements elements2 = jsoup.getTarget(content, selectCondition2);
String html1 = elements1.get(0).html();
String title = html1.replaceAll("", "");
String html2 = elements2.get(0).html();
html2 = html2.replaceAll("<p>", "");
String word = html2.replaceAll("", "");
MyFileIO fileIO=new MyFileIO();
fileIO.makeFile(title, word);
} catch (ClientProtocolException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
</p>
6.making主程序
package com.sxau.example;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class MySpider {
public static void main(String[] args) throws ClientProtocolException, IOException {
MyClient myClient = new MyClient();
String url="http://news.sxau.edu.cn/";
String content = myClient.getContent(url);
String selectCondition="a[href][title~=(|)]";
MyJsoup jsoup = new MyJsoup();
Elements elements = jsoup.getTarget(content, selectCondition);
for (Element element : elements) {
String attr = element.attr("href");
new Thread(new MyThread(url, attr)).start();
}
System.out.println("文件爬虫成功!");
}
}
6.运行main方法并等待片刻。刚烤好的文件一直静静地放在文件夹里
log4j:WARN No appenders could be found for logger (org.apache.http.impl.conn.BasicClientConnectionManager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
文件爬虫成功!
最终效果
到目前为止,一个简单的爬虫功能已经实现。新手正在路上。如果您有任何问题,请毫不犹豫地提出建议,相互讨论,共同进步