Java语言怎么实现爬虫

Java语言怎么实现爬虫

这篇文章给大家分享的是有关Java语言怎么实现爬虫的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

为什么我们要爬取数据

在大数据时代,我们要获取更多数据,就要进行数据的挖掘、分析、筛选,比如当我们做一个项目的时候,需要大量真实的数据的时候,就需要去某些网站进行爬取,有些网站的数据爬取后保存到数据库还不能够直接使用,需要进行清洗、过滤后才能使用,我们知道有些数据是非常真贵的。

分析豆瓣电影网站

我们使用Chrome浏览器去访问豆瓣的网站如

https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

在Chrome浏览器的network中会得到如下的数据

可以看到地址栏上的参数type=movie&tag=热门&sort=recommend&page_limit=20&page_start=0

其中type是电影tag是标签,sort是按照热门进行排序的,page_limit是每页20条数据,page_start是从第几页开始查询。

但是这不是我们想要的,我们需要去找豆瓣电影数据的总入口地址是下面这个

https://movie.douban.com/tag/#/

我们再次的去访问请求终于拿到了豆瓣的电影数据如下图所示

在看下请求头信息

最后我们确认了爬取的入口为:

https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=0

创建Maven项目开始爬取

我们创建一个maven工程,如下图所示

maven工程的依赖,这里只是爬取数据,所以没有必要使用Spring,这里使用的数据持久层框架是mybatis 数据库用的是mysql,下面是maven的依赖

<dependencies><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20160810</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>

创建好之后,结构如下所示

首先我们在model包中建立实体对象,字段和豆瓣电影的字段一样,就是请求豆瓣电影的json对象里面的字段

Movie实体类

publicclassMovie{privateStringid;//电影的idprivateStringdirectors;//导演privateStringtitle;//标题privateStringcover;//封面privateStringrate;//评分privateStringcasts;//演员publicStringgetId(){returnid;}publicvoidsetId(Stringid){this.id=id;}publicStringgetDirectors(){returndirectors;}publicvoidsetDirectors(Stringdirectors){this.directors=directors;}publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringtitle){this.title=title;}publicStringgetCover(){returncover;}publicvoidsetCover(Stringcover){this.cover=cover;}publicStringgetRate(){returnrate;}publicvoidsetRate(Stringrate){this.rate=rate;}publicStringgetCasts(){returncasts;}publicvoidsetCasts(Stringcasts){this.casts=casts;}}

这里注意的是导演和演员是多个人我没有直接处理。这里应该是一个数组对象。

创建mapper接口

publicinterfaceMovieMapper{voidinsert(Moviemovie);List<Movie>findAll();}

在resources下创建数据连接配置文件jdbc.properties

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/huadiusername=rootpassword=root

创建mybatis配置文件 mybatis-config.xml

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><propertiesresource="jdbc.properties"></properties><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname="username"value="${username}"/><propertyname="password"value="${password}"/></dataSource></environment></environments><mappers><mapperresource="MovieMapper.xml"/></mappers></configuration>

创建mapper.xml映射文件

<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.cn.scitc.mapper.MovieMapper"><resultMapid="MovieMapperMap"type="com.cn.scitc.model.Movie"><idcolumn="id"property="id"jdbcType="VARCHAR"/><idcolumn="title"property="title"jdbcType="VARCHAR"/><idcolumn="cover"property="cover"jdbcType="VARCHAR"/><idcolumn="rate"property="rate"jdbcType="VARCHAR"/><idcolumn="casts"property="casts"jdbcType="VARCHAR"/><idcolumn="directors"property="directors"jdbcType="VARCHAR"/></resultMap><insertid="insert"keyProperty="id"parameterType="com.cn.scitc.model.Movie">INSERTINTOmovie(id,title,cover,rate,casts,directors)VALUES(#{id},#{title},#{cover},#{rate},#{casts},#{directors})</insert><selectid="findAll"resultMap="MovieMapperMap">SELECT*FROMmovie</select></mapper>

由于这里没有用任何的第三方爬虫框架,用的是原生Java的Http协议进行爬取的,所以我写了一个工具类

publicclassGetJson{publicJSONObjectgetHttpJson(Stringurl,intcomefrom)throwsException{try{URLrealUrl=newURL(url);HttpURLConnectionconnection=(HttpURLConnection)realUrl.openConnection();connection.setRequestProperty("accept","*/*");connection.setRequestProperty("connection","Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)");//建立实际的连接connection.connect();//请求成功if(connection.getResponseCode()==200){InputStreamis=connection.getInputStream();ByteArrayOutputStreambaos=newByteArrayOutputStream();//10MB的缓存byte[]buffer=newbyte[10485760];intlen=0;while((len=is.read(buffer))!=-1){baos.write(buffer,0,len);}StringjsonString=baos.toString();baos.close();is.close();//转换成json数据处理//getHttpJson函数的后面的参数1,表示返回的是json数据,2表示http接口的数据在一个()中的数据JSONObjectjsonArray=getJsonString(jsonString,comefrom);returnjsonArray;}}catch(MalformedURLExceptione){e.printStackTrace();}catch(IOExceptionex){ex.printStackTrace();}returnnull;}publicJSONObjectgetJsonString(Stringstr,intcomefrom)throwsException{JSONObjectjo=null;if(comefrom==1){returnnewJSONObject(str);}elseif(comefrom==2){intindexStart=0;//字符处理for(inti=0;i<str.length();i++){if(str.charAt(i)=='('){indexStart=i;break;}}StringstrNew="";//分割字符串for(inti=indexStart+1;i<str.length()-1;i++){strNew+=str.charAt(i);}returnnewJSONObject(strNew);}returnjo;}}

爬取豆瓣电影的启动类

publicclassMain{publicstaticvoidmain(String[]args){Stringresource="mybatis-config.xml";定义配置文件路径InputStreaminputStream=null;try{inputStream=Resources.getResourceAsStream(resource);//读取配置文件}catch(IOExceptione){e.printStackTrace();}SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);//注册mybatis工厂SqlSessionsqlSession=sqlSessionFactory.openSession();//得到连接对象MovieMappermovieMapper=sqlSession.getMapper(MovieMapper.class);//从mybatis中得到dao对象intstart;//每页多少条inttotal=0;//记录数intend=9979;//总共9979条数据for(start=0;start<=end;start+=20){try{Stringaddress="https://Movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start="+start;JSONObjectdayLine=newGetJson().getHttpJson(address,1);System.out.println("start:"+start);JSONArrayjson=dayLine.getJSONArray("data");List<Movie>list=JSON.parseArray(json.toString(),Movie.class);if(start<=end){System.out.println("已经爬取到底了");sqlSession.close();}for(Moviemovie:list){movieMapper.insert(movie);sqlSession.commit();}total+=list.size();System.out.println("正在爬取中---共抓取:"+total+"条数据");}catch(Exceptione){e.printStackTrace();}}}}

最后我们运行将所有的数据插入到数据库中。

感谢各位的阅读!关于“Java语言怎么实现爬虫”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

发布于 2022-01-05 23:31:23
收藏
分享
海报
0 条评论
34
上一篇:C语言数组是什么意思 下一篇:php中标量数据类型有哪些
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码