Java中支持的爬虫框架有很多,比如WebMagic、Spider、Jsoup等。今天我们使用Jsoup来实现一个简单的爬虫程序。
?Jsoup拥有十分方便的api来处理html文档,比如参考了DOM对象的文档遍历方法,参考了CSS选择器的用法等等,因此我们可以使用Jsoup快速地掌握爬取页面数据的技巧。
1)编写HTML页面
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<table>
<thead>
<tr>
<td>商品名字</td>
<td>商品图片</td>
</tr>
</thead>
<tbody>
<tr>
<td class="pname">product1</td>
<td class="pimg"><img src="img/1.bmp"/></td>
</tr>
<tr>
<td class="pname">product2</td>
<td class="pimg"><img src="img/2.bmp"/></td>
</tr>
</tbody>
</table>
</body>
</html>
页面中表格的商品信息是我们要爬取的数据。其中属性pname类的商品名称,以及属于pimg类的商品图片。
2)使用HttpClient读取HTML页面
HttpClient是一个处理Http协议数据的工具,使用它可以将HTML页面作为输入流读进java程序中。可以从http://hc.apache.org/下载HttpClient的jar包。
//获得HttpClient对象
HttpClient httpClient=new DefaultHttpClient();
//定义要爬取数据的目标页面url
String url="http://localhost:8080/MyShop/shop.jsp";
//使用HttpGet对象绑定url
HttpGet httpGet=new HttpGet(url);
//访问url获得响应消息封装在HttpResponse对象中
HttpResponse httpResponse=httpClient.execute(httpGet);
//entity中是响应消息的实体
HttpEntity entity=httpResponse.getEntity();
//使用EntityUtils的toString获得url指定页面的字符串内容,即html本身
String html=EntityUtils.toString(entity);
System.out.println(html);
3)使用Jsoup解析html字符串
通过引入Jsoup工具,直接调用parse方法来解析一个描述html页面内容的字符串来获得一个Document对象。该Document对象以操作DOM树的方式来获得html页面上指定的内容。相关API可以参考Jsoup官方文档:https://jsoup.org/cookbook/
下面我们使用Jsoup来获取上述html中指定的商品名称和价格的信息。
//JSOUP解析页面数据,获得Document对象
Document doc=Jsoup.parse(html);
//在Document对象的select方法中使用选择器来获得指定的元素,该选择器与CSS及Jquery的选择器相同。
Elements eles=doc.select("table tbody tr .pname");
Element ele=eles.get(0);
//获得指定元素的文本内容
System.out.println(ele.text());
Elements ele_imgs=doc.select("table tbody img");
//获得指定元素的src属性的值
String img_src=ele_imgs.get(0).attr("src");
System.out.println(img_src);
至此,我们已经实现使用HttpClient+Jsoup爬取HTML页面数据的功能。接下来,我们让效果更直观一些,比如将爬取的数据存到数据库中,将图片存到服务器上。
1)保存普通数据到数据库中
将爬取的数据封装进实体Bean中,并存到数据库内。
//将数据封装到Javabean中
Product p=new Product();
p.setPid(UUID.randomUUID().toString());
p.setPname(ele.text());
p.setPimg(img_src);
//将存入数据库中
ProductDao dao=new ProductDao();
try {
dao.addProduct(p);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//dao的操作
public void addProduct(Product p) throws SQLException {
QueryRunner qr=new QueryRunner(JDBCUtil.getDataSource());
String sql="insert into product values(?,?,?)";
qr.update(sql,p.getPid(),p.getPname(),p.getPimg());
}
2)保存图片到服务器上
直接通过下载图片的方式将图片保存到服务器本地。
private void downloadImg(HttpServletRequest request,Product p) throws ClientProtocolException, IOException {
//获得图片的原url
String url="http://localhost:8080"+p.getPimg();
//使用HttpClient获得图片资源
HttpClient httpClient=new DefaultHttpClient();
HttpGet httpGet=new HttpGet(url);
HttpResponse httpResponse=httpClient.execute(httpGet);
//获得请求的图片资源的输入流
InputStream is=httpResponse.getEntity().getContent();
//在服务器本地创建文件,用于接收图片
String img_name=p.getPimg().substring(p.getPimg().lastIndexOf("/")+1);
String realPath=request.getRealPath("/Download/"+img_name);
File dir=new File(request.getRealPath("/Download"));
if(!dir.exists()){
//如果文件夹不存在,则创建
dir.mkdirs();
}
//读写数据,保存图片
File file=new File(realPath);
FileOutputStream fos=new FileOutputStream(file);
int b=0;
while((b=is.read())!=-1){
fos.write(b);
}
fos.close();
}
本案简单实现了使用HttpClient+Jsoup爬取网络数据,对于爬虫技术本身,还有很多值得深挖的地方,以后再为大家讲解。
何配置一个从网页爬去数据的java项目
用工具如myeclipse,可以新建项目,然后把java代码放在src目录下,把 html或者jsp页面放到webroot目录下,当然可以自己新建目录,js放的位置要看你html中自己引用的相对目录是什么,jat包需要放在lib目录下,如果开发环境没有部署tomcat,还得自己部署。
如果只是一个单纯的java项目,只想让java程序运行,那就只需要安装好jdk,就可以执行java程序了。否则那就需要安装tomcat或者其他的网络应用服务器,也就是jsp页面。
枷锁
如果不想借助myeclipse等集成环境,那可以在tomcat中自己建立项目目录,一定放在root文件夹下,然后是web-inf,实在不会的话可以把你要部署的项目代码什么的都粘贴上来,会有人手把手教你如何部署。
sql文件是以字符串形式存在的,一般是用于生成初始化数据库。如果是扩展性好的程序,一般都有一个配置文件,说明sql文件的路径。然后在java代码中,根据配置文件找到sql文件,以字符串形式打开,然后读取字符串,作为sql语句执行。这个过程不需要考虑会不会出错,因为完整的项目都已经做好了处理。
所以,sql文件应该放到最初的位置不要动它,或者安装说明把它挪到应该在的地方。
科技
爬取指定网站的数据de的java代码
Package zy.crawl.hupu;
Import java.io.IOException;
Import zy.crawl.common.*;
Import java.util.ArrayList;
Import java.util.List;
Import org.apache.http.HttpEntity;
Import org.apache.http.HttpHost;
Import org.apache.http.HttpResponse;
Import org.apache.http.HttpStatus;
Import org.apache.http.client.HttpClient;
Import org.apache.http.client.methods.HttpGet;
Import org.apache.http.conn.params.ConnRoutePNames;
Import org.apache.http.impl.client.DefaultHttpClient;
Import org.apache.http.params.CoreConnectionPNames;
Import org.apache.http.util.EntityUtils;
Import org.jsoup.Jsoup;
Import org.jsoup.nodes.Document;
Import org.jsoup.nodes.Element;
Import org.jsoup.select.Elements;
Publicclass rawlHupu
{
Private List<NewsInfo>newsList=newArrayList<>();//用来存储爬取的信息对象
Public StringGetHtml(Stringurl)//还方法是设置网络链接,是固定的用法
{
Stringhtml=null;
HttpClient httpClient=new DefaultHttpClient();
术栈定义
一般来说是指将N种技术互相组合在一起(N>1),作为一个有机的整体来实现某种目的或功能。也可以指掌握这些技术以及配合使用的经验。
举个例子:
开发一个普通OA(办公自动化)系统,我们使用了html+css+javascript+vue+ Spring Boot+Spring cloud+hibernate + Spring+rocket Mq+Redis+Es+linux+ mysql等等,这些技术加起来就可以称为技术栈。
互联网公司的技术栈整体分为5大块:前端、后端、中间件、运维和工具。
下面就分别给大家解释一下最重要的前端、后端运用了哪些技术,这些技术又能解决什么问题。
前端技术栈
01
使用css3作为页面的样式控制
解决页面渲染问题。
02
使用Html5作为页面结构的标签语言
解决移动端的页面兼容性问题。
03
使用seajs框架
解决项目中模块开发和加载的问题。
04
使用使用Jquery前端js框架
解决方便操作页面元素的问题。
05
引用流行的前端插件实现业务需求
使用bootstrapValidator作为表单的验证插件
使用bootstrap进行页面的布局;
使用layer作为弹窗插件;
使用jQuery cxSelect 实现下拉列表的多级联动;
使用bootstrap fileinput完成多文件的上传;
使用icheck完成对多选框的美化;
使用百度ueditor解决复杂内容编辑场景。
06
自定义业务插件抽取
主要解决系统导出使用的功能代码重复性问题。收藏功能;点赞功能;评论功能;留言功能;关注功能;页面多处个人信息的设置;页面多处商品页面调起支付的功能;题库的组卷系统中的试题栏。
后端技术栈
01
项目分层思想实现分布式架构
Core层(中心、核心):与业务无关,提供基础的能力,比如:数据库持久,redis缓存,http封装,通用工具。统一的core项目,提供基础的能力we-core-Db项目:mybatis的mapper的基础上做了二次封装;we-core-redis项目:基于jedis的基础上做了二次封装;we-core-web:存放一些与web环境下使用的工具类和处理器;自定义web环境;使用的aop注解;统一的异常处理器;自定义分页标签的。 base层(根基、基础):该层中的项目有且只能代表一个真实存在而且能独立存在的核心实体对应的业务。 business层(业务逻辑层):业务层,解决多端,多项目公用的业务流程。 web层:为互联网用户提供对外服务,在这层的每一个项目都有自己不被共享的业务。
02
抽取独立服务实现服务共享
好多项目都会使用到很多相同的服务,我们会把它抽取成独立的项目,先以jar包的方式提供公用。 比如:短信服务,邮件服务,字典服务,收藏服务,关注服务,订单服务,支付服务3. 基于jedis的基础上做了二次封装,实现java对redis的读写。应用场景: 整个项目使用统一的id生成策略。 使用缓存进行存放freemark代码片段的内容,解决高频查询数据给服务器带来的压力。
03
使用maven进行项目的管理
使用maven自定义骨架可以实现公司内部创建项目模板化,减少大家创建项目时的时间,创建完就能使用;使用maven的聚合的特性实现多项目统一进行构建;使用maven继承的特性实现同一项目的不同maven工程的相同配置问题;使用maven的属性我们可以使用自定义变量以及访问其他配置项值解决我们配置重复的问题;使用maven帮助我们规范工程资源的的存放;使用maven的依赖特性可以解决我们,jar包之间的依赖,排出依赖。;使用maven仓库的http代理可以实现让maven帮助我们查找,下载所需的jar包,我们只需要指定依赖的gav;使用maven我们把公司自己的开发的项目发布到nexus上供其他的项目使用。
04
使用nexus进行内网私服搭建
解决jar包重复下载的问题; 解决公司内部项目共享的问题; maven仓库以外的jar包管理。
05
使用gitlab进行项目的版本管理
解决团队多人协同开发项目的问题,我们团队制定了使用git开发的规范流程。
06
使用jenkins/hudson实现项目的自动化部署
解决项目自动化构建,发布,回滚等问题;定时构建及时发现项目中的问题;实现一键发布缩短发布的时间;自动构建和发布的大致流程;从gitlab上拉取最新的代码;使用maven进行构建项目;将构建完成的项目使用scp复制到指定服务器中;并通过远程调用指定服务器的脚本进行项目的发布。
07
使用mysql进行数据存储
这个不用多解释。
08
使用Spring+SpringMvc+Mybitas
使用经典的ssm作为平台的MVC框架, 处理http请求,处理业务逻辑,访问数据库。
09
使用hibernateValidator
实现后端接收到的参数进行参数的合法性验证,像非空,最小,最大,范围等。
10
使用spring mvc的拦截器
实现项目内的权限控制,比如:sso权限验证,角色的验证,支付的验证等。
11
使用spring mvc的AOP
实现多处相同代码抽取出来使用AOP的方式进行公用,比如:json视图的固定格式返回。
12
使用logback
作为架构的日志框架。
13
使用flying-saucer+itext+freemark
解决项目中pdf的应用场景,比如:学生下载的准考证,测试报告等。
14
使用JavaMail技术
实现邮件的发送服务。
15
使用TestNg+H2
实现进行单元化测试,保证代码质量。
16
使用Cookie+Redis
实现平台单点登录。
17
实现SpringMvc提供
的HandlerExceptionResolver接口
使用spring提供HandlerExceptionResolver实现全站统一异常处理。 包括:业务异常,登录超时异常,其他异常。
18
实现SpringMvc提供
的ServletContextAware接口
可以实现项目启动时添加一些操作。 初始化freemarker的配置; 初始化项目全局共享的静态变量(域名,文件存储目录等)。
19
使用Quartz
实现定时任务处理。
20
使用网络爬虫技术Jsoup
解决爬取其他网站的数据信息问题。
21
使用Qdcode
解决生成二维码的功能。
22
使用jsp的自定义标签
解决全站分页的实现。
23
使用阿里的Druid
作为连接数据库的连接池。
24
使用spring的Ioc容器解决对象的依赖注入
使用Ioc实现指定特定接口的实现类以应对业务实现的变化;使用ioc实现业务中需要的配置注入,防止参数值写死。
25
使用CXF或者Axis
实现通过WebService和第三方进行对接。
26
结合自定义注解+反射
实现对方法访问的控制以及添加额外业务逻辑。
比如:个人信息在多个请求Controller中都需要填充。
27
使用Mybatis框架
解决数据持久化的问题;引入开源的:Mybatis的Mapper接口的方式实现支持单表的curd,避免写更多的重复代码;引入pagehelper解决mybatis的分页问题;使用Mybatis的Interceptor实现sql的打印功能。
28
使用Jsp,Freemark
作为视图层的处理技术。
29
使用Freemark+字符串替换实现自定义vt标签
自定义视图标签主要为了解决像字典那种字段不断需要跨表查询的问题。
30
自定义json视图
自定义json视图是为了实现规定json返回的统一格式。
31
使用El表达式和jstl标签库
解决访问model中的数据以及页面上显示的逻辑处理。
32
使用自定义注解实现某些功能的标注
在处理json返回值的时候可以在标注一下@Void就表示不需要包裹; 在sso拦截权限的时候可以标注一下方法是否需要拦截; 在多个Controller里都需要设置用户信息到页面的时候,我们可以利用Aop+Annotation的方式实现。
会用一种是入门,全部会用是大神!
*请认真填写需求信息,我们会在24小时内与您取得联系。