为什么我们要爬取数据
在大数据年代,我们要获取更多数据,就要进行数据的发掘、剖析、挑选,比方当咱们做一个项目的时分,需求很多实在的数据的时分,就需求去某些网站进行爬取,有些网站的数据爬取后保存到数据库还不能够直接运用,需求进行清洗、过滤后才干运用,咱们知道有些数据是十分真贵的。A8站源码交易平台
剖析豆瓣电影网站
我们运用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是从第几页开端查询。
可是这不是咱们想要的,咱们需求去找豆瓣电影数据的总进口地址是下面这个 A8站源码交易平台
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的依靠 A8站源码交易平台
org.json
json
20160810
com.alibaba
fastjson
1.2.47
mysql
mysql-connector-java
5.1.47
org.mybatis
mybatis
3.5.1
junit
junit
4.12
--------------
创立好之后,结构如下所示
首要咱们在model包中树立实体目标,字段和豆瓣电影的字段相同,便是恳求豆瓣电影的json目标里边的字段
Movie实体类
public class Movie {
private String id; //电影的id
private String directors;//导演
private String title;//标题
private String cover;//封面
private String rate;//评分
private String casts;//艺人
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDirectors() {
return directors;
}
public void setDirectors(String directors) {
this.directors = directors;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCover() {
return cover;
}
public void setCover(String cover) {
this.cover = cover;
}
public String getRate() {
return rate;
}
public void setRate(String rate) {
this.rate = rate;
}
public String getCasts() {
return casts;
}
public void setCasts(String casts) {
this.casts = casts;
}
}
-----------
这儿留意的是导演和艺人是多个人我没有直接处理,这儿应该是一个数组目标。
创立mapper接口
public interface MovieMapper {
void insert(Movie movie);
ListfindAll();
}
-----------
在resources下创立数据衔接配置文件jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/huadi
username=root
password=root
1
2
3
4
创立mybatis配置文件 mybatis-config.xml
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
-------------
创立mapper.xml映射文件
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
INSERT INTO movie(id,title,cover,rate,casts,directors)
VALUES
(#{id},#{title},#{cover},#{rate},#{casts},#{directors})
SELECT * FROM movie
-----------
因为这儿没有用任何的第三方爬虫结构,用的是原生Java的Http协议进行爬取的,所以我写了一个东西类
public class GetJson {
public JSONObject getHttpJson(String url, int comefrom) throws Exception {
try {
URL realUrl = new URL(url);
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 树立实践的衔接
connection.connect();
//恳求成功
if (connection.getResponseCode() == 200) {
InputStream is = connection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//10MB的缓存
byte[] buffer = new byte[10485760];
int len = 0;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
String jsonString = baos.toString();
baos.close();
is.close();
//转换成json数据处理
// getHttpJson函数的后边的参数1,表明回来的是json数据,2表明http接口的数据在一个()中的数据
JSONObject jsonArray = getJsonString(jsonString, comefrom);
return jsonArray;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
return null;
}
public JSONObject getJsonString(String str, int comefrom) throws Exception{
JSONObject jo = null;
if(comefrom==1){
return new JSONObject(str);
}else if(comefrom==2){
int indexStart = 0;
//字符处理
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='('){
indexStart = i;
break;
}
}
String strNew = "";
//切割字符串
for(int i=indexStart+1;i<str.length()-1;i++){
strNew += str.charAt(i);
}
return new JSONObject(strNew);
}
return jo;
}
}
------------
爬取豆瓣电影的发动类
public class Main {
public static void main(String [] args) {
String resource = "mybatis-config.xml"; 界说配置文件途径
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);//读取配置文件
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//注册mybatis 工厂
SqlSession sqlSession = sqlSessionFactory.openSession();//得到衔接目标
MovieMapper movieMapper = sqlSession.getMapper(MovieMapper.class);//从mybatis中得到dao目标
int start;//每页多少条
int total = 0;//记载数
int end = 9979;//一共9979条数据
for (start = 0; start <= end; start += 20) {
try {
String address = "https://Movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=" + start;
JSONObject dayLine = new GetJson().getHttpJson(address, 1);
System.out.println("start:" + start);
JSONArray json = dayLine.getJSONArray("data");
Listlist = JSON.parseArray(json.toString(), Movie.class);
if (start <= end){
System.out.println("现已爬取究竟了");
sqlSession.close();
}
for (Movie movie : list) {
movieMapper.insert(movie);
sqlSession.commit();
}
total += list.size();
System.out.println("正在爬取中---共抓取:" + total + "条数据");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
--------------
最终咱们运即将一切的数据刺进到数据库中。A8站源码交易平台

项目地址
github
总结
爬取豆瓣网站十分的轻松,每页任何的难度,需求留意的是便是start是每页多少条咱们发现规矩当start=0的时分是20条数据是从0到19条,就这样每次加20条直到爬取完。