本文为原创博客,仅供技术学习使用。未经允许,禁止将其复制下来上传到百度文库等平台。

目录

  • 网络爬虫框架

    • 网络爬虫的逻辑顺序
  • 网络爬虫实例教学
    • model
    • main
    • util
    • parse
    • db
    • 再看main方法
  • 爬虫效果展示

网络爬虫框架

写网络爬虫,一个要有一个逻辑顺序。本文主要讲解我自己经常使用的一个顺序,并且本人经常使用这个框架来写一些简单的爬虫,复杂的爬虫,也是在这个基础上添加其他程序。

首先,我的工程都是使用maven建的,不会使用maven的,请看之前写的网络爬虫基础。使用Spring MVC框架编写过网站的同学,可以看出框架的重要性与逻辑性。在我的网络爬虫框架中,包含的package有db、main、model、parse、util五个文件。

db:主要放的是数据库操作文件,包含MyDataSource【数据库驱动注册、连接数据库的用户名、密码】,MYSQLControl【连接数据库,插入操作、更新操作、建表操作等】。

model:用来封装对象,比如我要获取京东书籍的ID、书名、价格,则需要在model写入对应的属性。说的直白一些,封装的就是我要操作数据对应的属性名。有不明白的看之前写的一个简单的网络爬虫。

util:主要放的是httpclient的内容,主要作用时将main方法,传过来的url,通过httpclient相关方法,获取需要解析的html文件或者json文件等。

parse:这里面存放的是针对util获取的文件,进行解析,一般采用Jsoup解析;若是针对json数据,可采用正则表达式或者fastjson工具进行解析,建议使用fastjson,因其操作简单,快捷。

main:程序起点,也是重点,获取数据,执行数据库语句,存放数据。

网络爬虫的逻辑顺序

针对我的网络爬虫框架,网络爬虫的逻辑顺序,可以描述为:首先,main方法,将url传给util获取响应的html文件,然后util将其获得的html文件,传给parse进行解析,获取最终数据,封装在集合中。解析完毕后,数据返回到main,接着main操作db将数据导入到mysql中。

网络爬虫实例教学

通过上面的框架,我们可以看出写一个网络爬虫,其实很简单(当然有很复杂的网络爬虫哦)。下面,我将带大家写一个基于java爬虫京东图书信息的网络爬虫,只是做讲解使用,供大家学习和参考。

首先,起点是什么?你可能觉得是main方法,其实不然,起点是你要知道你要获取网站中的哪些数据,然后针对要抓取的数据去写model。如下图,我要获取京东上的图书的价格,和图书名,还有图书的id(id是唯一标识,可作为数据表的主键)

model

用来封装对象,我要抓取一本书的数据包括,书籍的id,书名及价格。ecliplse中生成set、get方法的快捷键是shift+alt+s然后选择生成setter、getter

package model;
/*   *  合肥工业大学 管理学院 qianyang 1563178220@qq.com*/
public class JdModel {private String bookID;private String bookName;private String bookPrice;public String getBookID() {return bookID;}public void setBookID(String bookID) {this.bookID = bookID;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getBookPrice() {return bookPrice;}public void setBookPrice(String bookPrice) {this.bookPrice = bookPrice;}
}

main

主方法,尽量要求简单,这里我就这样写了。这里面有注释,很好理解。

package main;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import db.MYSQLControl;
import model.JdModel;
import util.URLFecter;
/*   *  合肥工业大学 管理学院 qianyang 1563178220@qq.com*/
public class JdongMain {//log4j的是使用,不会的请看之前写的文章static final Log logger = LogFactory.getLog(JdongMain.class);public static void main(String[] args) throws Exception {//初始化一个httpclientHttpClient client = new DefaultHttpClient();//我们要爬取的一个地址,这里可以从数据库中抽取数据,然后利用循环,可以爬取一个URL队列String url="http://search.jd.com/Search?keyword=Python&enc=utf-8&book=y&wq=Python&pvid=33xo9lni.p4a1qb";//抓取的数据List<JdModel> bookdatas=URLFecter.URLParser(client, url);//循环输出抓取的数据for (JdModel jd:bookdatas) {logger.info("bookID:"+jd.getBookID()+"\t"+"bookPrice:"+jd.getBookPrice()+"\t"+"bookName:"+jd.getBookName());}//将抓取的数据插入数据库MYSQLControl.executeInsert(bookdatas);}
}

util

util中包含两个文件,URLFecter 与HTTPUtils,其中URLFecter 调用了HTTPUtils类。

package util;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.util.EntityUtils;
import model.JdModel;
import parse.JdParse;
/*   *  合肥工业大学 管理学院 qianyang 1563178220@qq.com*/
public class URLFecter {public static List<JdModel> URLParser (HttpClient client, String url) throws Exception {//用来接收解析的数据List<JdModel> JingdongData = new ArrayList<JdModel>();//获取网站响应的html,这里调用了HTTPUtils类HttpResponse response = HTTPUtils.getRawHtml(client, url);      //获取响应状态码int StatusCode = response.getStatusLine().getStatusCode();//如果状态响应码为200,则获取html实体内容或者json文件if(StatusCode == 200){String entity = EntityUtils.toString (response.getEntity(),"utf-8");    JingdongData = JdParse.getData(entity);EntityUtils.consume(response.getEntity());}else {//否则,消耗掉实体EntityUtils.consume(response.getEntity());}return JingdongData;}
}

上面程序调用的HTTPUtils这个类,以下是HTTPUtils这个类。

package util;import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.message.BasicHttpResponse;
/*   *  合肥工业大学 管理学院 qianyang 1563178220@qq.com*/
public abstract class HTTPUtils {public static HttpResponse getRawHtml(HttpClient client, String personalUrl) {//获取响应文件,即html,采用get方法获取响应数据HttpGet getMethod = new HttpGet(personalUrl);HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus.SC_OK, "OK");try {//执行get方法response = client.execute(getMethod);} catch (IOException e) {e.printStackTrace();} finally {// getMethod.abort();}return response;}}

parse

parse主要是通过Jsoup来解析html文件。并将解析后的数据,封装在List集合中,将数据通过层层返回到main方法中。

package parse;import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import model.JdModel;
/** author qianyang 1563178220@qq.com* 用于将上面传下来的html解析,获取我们需要的内容* 解析方式,采用Jsoup解析,有不明白Jsoup的可以上网搜索API文档* Jsoup是一款很简单的html解析器*/
public class JdParse {public static List<JdModel> getData (String html) throws Exception{//获取的数据,存放在集合中List<JdModel> data = new ArrayList<JdModel>();//采用Jsoup解析Document doc = Jsoup.parse(html);//获取html标签中的内容Elements elements=doc.select("ul[class=gl-warp clearfix]").select("li[class=gl-item]");for (Element ele:elements) {String bookID=ele.attr("data-sku");String bookPrice=ele.select("div[class=p-price]").select("strong").select("i").text();String bookName=ele.select("div[class=p-name]").select("em").text();//创建一个对象,这里可以看出,使用Model的优势,直接进行封装JdModel jdModel=new JdModel();//对象的值jdModel.setBookID(bookID);jdModel.setBookName(bookName);jdModel.setBookPrice(bookPrice);//将每一个对象的值,保存到List集合中data.add(jdModel);}//返回数据return data;}
}

db

db中包含两个java文件,MyDataSource,MYSQLControl。这两个文件的作用已在前面说明了。

package db;import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
/*   *  合肥工业大学 管理学院 qianyang 1563178220@qq.com*/
public class MyDataSource {public static DataSource getDataSource(String connectURI){BasicDataSource ds = new BasicDataSource();//MySQL的jdbc驱动ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUsername("root");              //所要连接的数据库名ds.setPassword("112233");                //MySQL的登陆密码ds.setUrl(connectURI);return ds;}
}

下面是MYSQLControl,主要使用QueryRunner方法操作数据库,使用时是batch方法。

package db;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;import model.JdModel;
/** author qianyang 1563178220@qq.com* Mysql操作的QueryRunner方法* 一个数据库操作类,别的程序直接调用即可*/
public class MYSQLControl {//根据自己的数据库地址修改static DataSource ds = MyDataSource.getDataSource("jdbc:mysql://127.0.0.1:3306/moviedata");static QueryRunner qr = new QueryRunner(ds);//第一类方法public static void executeUpdate(String sql){try {qr.update(sql);} catch (SQLException e) {e.printStackTrace();}}//第二类数据库操作方法public static void executeInsert(List<JdModel> jingdongdata) throws SQLException {/** 定义一个Object数组,行列* 3表示列数,根据自己的数据定义这里面的数字* params[i][0]等是对数组赋值,这里用到集合的get方法* */Object[][] params = new Object[jingdongdata.size()][3];for ( int i=0; i<params.length; i++ ){params[i][0] = jingdongdata.get(i).getBookID();params[i][1] = jingdongdata.get(i).getBookName();params[i][2] = jingdongdata.get(i).getBookPrice();}qr.batch("insert into jingdongbook (bookID, bookName, bookPrice)"+ "values (?,?,?)", params);System.out.println("执行数据库完毕!"+"成功插入数据:"+jingdongdata.size()+"条");}
}

再看main方法

在main方法中有这样一句程序,这便是调用了操作数据库MYSQLControl程序,将抓取的数据插入到数据库中了

MYSQLControl.executeInsert(bookdatas);

爬虫效果展示

到此,便完成了这个简单网络爬虫的编程工作,下面来看看程序运行的结果吧。

数据库中的结果如下:

有什么不明白的,请发邮件至1563178220@qq.com 合肥工业大学管理学院 qianyang

基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)相关推荐

  1. Java网络爬虫--一步步使用Java网络爬虫技术实现豆瓣读书Top250数据的爬取,并插入数据库

    一步步使用Java网络爬虫技术实现豆瓣读书Top250数据的爬取,并插入数据库 目录 一步步使用Java网络爬虫技术实现豆瓣读书Top250数据的爬取,并插入数据库 第一步:创建项目,搭建项目结构 p ...

  2. 基于Java的网络爬虫实现抓取网络小说(一)

    基于Java的网络爬虫实现抓取网络小说(一) 今天开始写点东西,一方面加深印象一方面再学习. 网络爬虫(Web crawler),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,它们被广泛用 ...

  3. java网络爬虫论文_毕业设计(论文)-基于JAVA的网络爬虫的设计与实现.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava 毕业设计(论文)-基于JAVA的网络爬虫的设计与实现. ...

  4. 使用代理爬去微信公众号_Python3网络爬虫开发实战之使用代理爬取微信公众号文章...

    本节目标 我们的主要目标是利用代理爬取微信公众号的文章,提取正文.发表日期.公众号等内容,爬取来源是搜狗微信,其链接为 http://weixin.sogou.com/,然后把爬取结果保存到 MySQ ...

  5. Hadoop笔记之十七——爬虫框架scrapy实际案例(爬取安卓版QQ阅读)

    话不多说,我们的目的: 使用scrapy爬取安卓版QQ阅读所有的小说(只是小说的基本信息,小说内容是不要想的.千万不要想--) 环境准备 安卓收集模拟器:夜神模拟器 安卓手机抓包工具:fiddler ...

  6. Python网络爬虫实例——“中国最好大学排名爬取”(嵩天:北理工大学)学习笔记

    这个例子比较简单也容易理解,我将细致的解析这个例子中算法流程.写一个博客算是给自己一个激励吧.一起加油.(_ZHJ三月和九月) 完整版代码 import requests from bs4 impor ...

  7. scrapy框架之全站数据的爬取

    全站数据的爬取有俩种方式: 1.基于spider的全站数据爬取:需要自己进行分页操作,并进行手动发送请求 2.基于CrawlSpider ,今天主要讲解基于CrawlSpider 的爬取方式 Craw ...

  8. 基于java的网络爬虫_基于java实现网络爬虫

    [实例简介] 基于java实现的java爬虫,是我学习java来练练手的,java基础入门的学生可以考虑参考一下 [实例截图] [核心代码] 爬虫 ├── 暑假任务-爬虫系统 │   ├── bin ...

  9. 【Java网络爬虫实战篇】使用Jsoup爬取和解析王者荣耀全英雄全皮肤(思路/代码/问题分析)

    由于博主前两天刚入门Java爬虫,并且自学了Jsoup的爬取和解析方式以及输入输出流的相关知识,因此打算检验一下目前的学习成果.在一番深思熟虑(x)后,毅然打算爬取王者荣耀官网全英雄全皮肤的壁纸. 爬 ...

最新文章

  1. 矩阵连乘算法代码JAVA_矩阵连乘问题的动态规划算法(java)
  2. Xamarin.Android模拟器提示HAX kernel module is not Installed
  3. android — JNI注册方法说明
  4. Google ARCore SDK
  5. ubuntu设置代理 的三种方式
  6. 他山之石 | 腾讯 多模态内容理解技术及应用
  7. java加密 js解密_前后端API交互加密解密(js、Java)
  8. VB2010中的MediaPlayer控件在哪?
  9. 春节后第一周个人新闻两则
  10. 优酷土豆联姻 视频网站格局的几大猜想
  11. home brew php71安装,php,_mac home-brew 安装 php 失败,php - phpStudy
  12. 2.Java Excel操作读取合并单元格
  13. 【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D
  14. 微信小程序 如何等待onLaunch拿到后端数据后,再执行onLoad
  15. 哈哈哈,真香!妹子图终于可以多图预览了
  16. pro6 surface 黑苹果_GitHub - molie34/Surface-Pro-6-macOS: Surface Pro 6 黑苹果全球首发
  17. Ubuntu安装sysstat
  18. 写代码应该用什么字体?
  19. islide 安装 PPT崩溃问题
  20. 基于http的cookie和JSON储存

热门文章

  1. 你们公司还没使用HTTP3?赶紧来补一补,学习一下如何在Nginx上配置HTTP3。
  2. 在Spring中使用JDBC访问关系数据
  3. 痞子衡嵌入式:单片机AI的春天已来,ARM Cortex-M55发布了
  4. C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
  5. vue遍历data所有变量并赋值
  6. git重命名远程仓库名字 同步fork代码
  7. chrome下载地址
  8. 【HTML】简单实现网页加载动画
  9. 【C语言】scanf()输入浮点型数据
  10. fermat数推素数无穷_如何在3分钟内对Fermat测试进行素数测试