java爬虫,爬取网站信息,使用redis多服务器,上游操作

爬虫在爬取网页的信息使用redis.上游的主要的操作是:在爬取首页的信息时,将首页的每一篇的文章的id值存在redis中,这就是上游的主要操作,无伦是首页还是分页都是将id值存在redis中.


具体的代码如下:

package com.sprider.provider.main;


import java.io.UnsupportedEncodingException;
import java.util.ArrayList;


import org.apache.http.HttpEntity;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
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;


import com.google.gson.Gson;




import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;


public class ProviderMain {


// 在redis里面创建多台数据库 根据本机的ip地址和redis的端口号来创建redis的连接的对象
private static final Jedis jedis = new JedisPool("192.168.22.87", 6379).getResource();


public static void main(String[] args) throws Exception {
// 得到首页的信息 爬取首页的信息
// 获取首页
String indexHtml = getIndex();
// 得到html 解析html
parseIndexHtml(indexHtml);
// 首页的信息已经加载完毕 开始加载分页的信息了 要想得到分页的信息那么就要得到点击加载分页信息的数据
String last_dateline = getValueAndIndexHtml(indexHtml);// 得到没加载一页数据的数值
for (int page = 2; page < 10; page++) {
last_dateline = doSinglePageing(last_dateline, page);
}
}


private static String doSinglePageing(String last_dateline, int page) throws Exception {
// TODO Auto-generated method stub
// 获得请求的路径
String url = "https://www.huxiu.com/v2_action/article_list";
HttpPost httpPost = new HttpPost(url);
// 请求参数
ArrayList list = new ArrayList();
list.add(new BasicNameValuePair("huxiu_hash_code", "647893ceb60219effa36193702fd89a3"));
list.add(new BasicNameValuePair("page", page + ""));
list.add(new BasicNameValuePair("last_dateline", last_dateline));
// 参数设置
httpPost.setEntity(new UrlEncodedFormEntity(list));
// User-Agent
httpPost.setHeader("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0");
// 发起请求
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse execute = httpClient.execute(httpPost);
// 在发送请求之后 页面没有跳转 因为是在和首页的同一个页面下 所以不用判断 只有页面跳转才有状态码的判定
// 请求发送之后 就有返回值了 主要注意的是返回值是json数据的形式来进行返回的
String jsonDate = EntityUtils.toString(execute.getEntity());
// 得到json数据值 就要水对json的数据进行解析 解析json的数据使用到的是gson
Gson gson = new Gson();
// 将数据进行解析并且映射到实体类中 实体类中是根据返回的参数来进行设置的
// 得到分页数据的所有的信息 也就是分页数据的url
ResponseJson fromJson = gson.fromJson(jsonDate, ResponseJson.class);
// 得到的分页的每一个数据 每一个URL信息
String data = fromJson.getData();// 得到分页的信息
//解析data数据
System.out.println(data);
parsePagingHtml(data);
    last_dateline = fromJson.getLast_dateline();
return last_dateline;
}


//解析某一页的内容,获取文章id,立即放入redis
    private static void parsePagingHtml(String data) {
            if (data != null) {
                // 1.使用jsoup解析data url,file,string,segment
                Document doc = Jsoup.parse(data);
                Elements divs = doc.select(".mod-info-flow div[data-aid]");
                for (Element element : divs) {
                    String aid = element.attr("data-aid");
                    try {
                        jedis.lpush("aid",aid);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }


// 得到加载下一页信息的数据值
public static String getValueAndIndexHtml(String indexHtml) {
if (indexHtml != null) {
Document document = Jsoup.parse(indexHtml);
Elements select = document.select("div[data-last_dateline]");
return select.get(0).attr("data-last_dateline");
}
return null;
}


// 解析html数据 并且将数据id存到redis里面
public static void parseIndexHtml(String indexHtml) {
// TODO Auto-generated method stub
if (indexHtml != null) {
Document document = Jsoup.parse(indexHtml);
Elements elements = document.select(".mod-info-flow div[data-aid]");
for (Element element : elements) {
String aid = element.attr("data-aid");
try {
                     jedis.lpush("aid",aid);
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
}
}
}


// 准备爬取首页信息
public static String getIndex() throws Exception {
String url = "https://www.huxiu.com";
// 创建请求
HttpGet httpGet = new HttpGet(url);
// User-Agent
httpGet.addHeader("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
return getHtml(httpGet);
}


// 获取页面的解析的html的数据
public static String getHtml(HttpGet httpGet) throws Exception {
// TODO Auto-generated method stub
String html = null;
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse execute = httpClient.execute(httpGet);
// 判断响应码是否为200
if (execute.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = execute.getEntity();
html = EntityUtils.toString(entity);
System.out.println(html);
}
return html;
}
}


实体类:

package com.sprider.provider.main;


public class ResponseJson {
private int result;
private String msg;
private String data;
private double total_page;
private String last_dateline;
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public double getTotal_page() {
return total_page;
}
public void setTotal_page(double total_page) {
this.total_page = total_page;
}
public String getLast_dateline() {
return last_dateline;
}
public void setLast_dateline(String last_dateline) {
this.last_dateline = last_dateline;
}
}

你可能感兴趣的:(java爬虫,爬取网站信息,使用redis多服务器,上游操作)