Java爬虫--利用HttpClient和Jsoup爬取博客数据并存入数据库
程序员文章站
2022-07-14 16:59:55
...
由于今日头条等头条类产品的出现,以今日头条为代表所使用的爬虫技术正在逐渐火热,在爬虫领域具有良好性能和较好效果的Python在最近一年的时间里逐渐火热起来,同时因为Python良好的数据分析和机器学习的能力,Python的应用越来越广泛。不过,今天我们要提到的是基于java 的简单爬虫,为使用java作为开发语言的人做一个参考。
爬虫实现
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
httpClient操作代码,值得注意的是,我们将html存入数据库的时候,最好将数据库对应的字段设置为text类型或者是longtext类型。存入的时候使用setString即可。否则可能 出现。Data too long for row错误。
public class pachongMain {
public static void main(String[] args) throws Exception {
for (int j = 2000; j >0; j = j - 1) {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet("http://www.bysocket.com/?p=" + j);
HttpResponse response = client.execute(get);
// System.out.println(response.getStatusLine().getStatusCode());
if (response.getStatusLine().getStatusCode() !=200 ) {
continue ;
}
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity, "utf-8");
// 使用Jsoup解析网页
Document doc = Jsoup.parse(content);
Elements element3 = doc.select("h1[class=entry-title]");
String title = element3.text();
Elements element2 = doc.select("div[class=entry-content]");
String article =element2.html();
new StoreData().store(j,article,title);
}
}
}
数据存储类
public class StoreData {
public void store(Integer id, String content, String title) throws Exception {
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
String username = "root";
String password = "123456";
// 加载驱动类
Class.forName(driverClassName);
Connection con = (Connection) DriverManager.getConnection(url, username, password);
// 创建sql语句模板
String sql = "INSERT blog VALUES(?,?,?)";
// 创建一个声明对象
PreparedStatement pst = (PreparedStatement) con.prepareStatement(sql);
// 用循环将数据添加到sql模板中
pst.setInt(1, id);
pst.setString(2, content);
//pst.set
pst.setString(3, title);
pst.addBatch();
// 将sql语句发送到mysql上
int[] res = pst.executeBatch();
System.out.println(res);
pst.close();
}
}
爬取的效果:
但是只是这种普通的爬取会出现请求超时的情况,
出现这种请求头设置有误,使用浏览器,分析请求信息,对于url请求,将请求头信息添加到java的程序中即可。
爬取博客: 泥瓦匠BYSocket