java爬虫采集某保险公司产品数据

1、主方法

package com.sprider.pingan;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
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 java.io.IOException;
import java.nio.charset.Charset;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static com.sprider.utils.SetGetHead.setPinanHead;

/***  财产险
 *
 */
public class Caichan {

    private final static ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(100);
    private final static ExecutorService threadPool = Executors.newFixedThreadPool(10);
    //抓取首页
    private final static  String indexUrl = "http://baoxian.pingan.com/product/allbaoxianlist.shtml";

    public static void main(String[] args) throws Exception {

        // 使用线程技术消费队列的数据。
        threadPool.execute(new Runnable() {
            public void run() {
                while (true) {
                    System.out.println("等待~~~,还有商品抓取::" + arrayBlockingQueue.size());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }
        });

        for (int i = 0; i <= 9; i++) {
            // 使用线程技术消费队列的数据-----------------专门用来消费数据
            threadPool.execute(new Runnable() {
                public void run() {
                    while (true) {
                        try {
                            String pid = arrayBlockingQueue.take();
                            parserProductDetail(pid);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }

                }
            });
        }

        // 生产者
        // 第一个事情:解析首页的信息,得到产品列表
        parserIndex();
        // 第二个事情:解析分页的信息,得到产品列表
        //dopaging();
        System.out.println("------------------------------------`");

    }

    //解析首页
    private static void parserIndex() throws Exception {
        // 1.指定url
        //http://baoxian.pingan.com/product/allbaoxianlist.shtml?WT.mc_id=property-home
        //拿到首页html
        String indexHtml = getHtml();
        getSearchResultInfo(indexHtml);
    }

    //根据stringHtml 拿到产品信息
    private static void getSearchResultInfo(String indexHtml) {
        if (indexHtml != null) {
            Document indexDoc = Jsoup.parse(indexHtml);
            // 6.定位到产品列表
            Elements liLists = indexDoc.getElementsByClass("list_product_nr por");
            //解析a标签
            Elements lists = liLists.select("a[href]");

            for (Element li : lists) {
                // 7.依次每个商品的详情页,并解析出数据
                try {
                    System.out.println("---------------start----------------");
                    System.out.println(li);
                    System.out.println("---------------a[href]----------------");
                    System.out.println(li.attr("href"));
                    System.out.println("---------------end----------------");
                    arrayBlockingQueue.put(li.attr("href"));
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    //get请求  访问拿到统一格式的字符集string   UTF-8
    private static String getHtml() throws IOException, ClientProtocolException {
        // 2.将url对象封装成httpget对象
        HttpGet indexHttpGet = new HttpGet(indexUrl);
        //设置请求头
        setPinanHead(indexHttpGet);
        // 3.使用httpclient发起一个请求
        CloseableHttpClient indexHttpClient = HttpClients.createDefault();
        CloseableHttpResponse indexRes = indexHttpClient.execute(indexHttpGet);
        // 4.从响应结果中,获得首页的html文档
        if (200 == indexRes.getStatusLine().getStatusCode()) {
            // 5.获得首页的信息,从首页中找出商品的列表
            return EntityUtils.toString(indexRes.getEntity(), Charset.forName("utf-8"));
        }
        return null;
    }

    //根据页面解析
    private static void parserProductDetail(String pId) throws Exception {
        // 1.指定url
        //http://baoxian.pingan.com/product/eshengpinganyiliaoxian.shtml?WT.mc_id=property-home
        String pUrl = "http://baoxian.pingan.com" + pId ;
        // 2.封装成一个get请求
        HttpGet httpGet = new HttpGet(pUrl);
        //设置请求头
        setPinanHead(httpGet);
        // 3.使用httpclient发起请求
        CloseableHttpClient detailHttpClient = HttpClients.createDefault();
        CloseableHttpResponse detailRes = detailHttpClient.execute(httpGet);
        // 4.得到响应结果
        if (200 == detailRes.getStatusLine().getStatusCode()) {
            String detailHtml = EntityUtils.toString(detailRes.getEntity(), Charset.forName("utf-8"));
            // 5.解析文档
            Document detailDoc = Jsoup.parse(detailHtml);
			//后续一样的解析
            //System.out.println(detailDoc);

        }

    }

}

2、设置请求头

package com.sprider.utils;

import org.apache.http.client.methods.HttpGet;
import java.util.ArrayList;
import java.util.Random;

public class SetGetHead {

    /**
     * 设置http的HEAD
     *
     * @param httpGet  请求
     */
    public static void setPinanHead(HttpGet httpGet) {
        // 设置默认的请求参数
        httpGet.setHeader("User-Agent",getUserAgent());
        // 伪装成浏览器
        httpGet.setHeader("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
        httpGet.setHeader("GET", "/product/allbaoxianlist.shtml?WT.mc_id=property-home HTTP/1.1");
        httpGet.setHeader("Host", "baoxian.pingan.com");

        httpGet.setHeader("Proxy-Connection", "keep-alive");
        httpGet.setHeader("Cache-Control", "max-age=0");
        httpGet.setHeader("Upgrade-Insecure-Requests", "1");
        httpGet.setHeader("Accept-Encoding", "gzip, deflate");
        httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
        httpGet.setHeader("Cookie",
                "USER_TRACKING_COOKIE=0; Hm_lvt_2f53c35010dbe120000b9a32bd028225=1592893596; BIGipServerpa18-padweb_http_DMZ_PrdPool_20191218=622763735.60533.0000; routeopr=820dc71fbbc95c3f907bf22c598618b9; BIGipServerpa18-shop-nst_Prd_cloud_Pool=639475415.60533.0000; _ga=GA1.2.1026077564.1592893616; _gid=GA1.2.83529289.1592893616; USER_TRACKING_COOKIE=0; paid_test=09d54ee0-6223-6973-75b7-d1897b80c0f0; USER_TRACKING_COOKIE=172.25.100.204-1592893733346.346000000; MEDIA_SOURCE_NAME=property-home; adms_location=%E5%85%B6%E4%BB%96|0000000000000000$ALL$ALL$ALL; PA_Client_Source=direct; PA_GXH_PD=-1; PA_GXH_NSS=; PA_GXH_WSS=; WT-FPC=id=4.0.4.93-3678702496.30820674:lv=1592905458970:ss=1592905458970:fs=1592905458970:pn=1:vn=1; WEBTRENDS_ID=4.0.4.93-3678702496.30820674; inner_media=http://baoxian.pingan.com/product/jiankangbaoxian.shtml-%E9%A6%96%E9%A1%B5; Hm_lpvt_2f53c35010dbe120000b9a32bd028225=1592906141; DT_C_ID=a4fb223ec3e5ff11-318372c65c18c021-1592966461200-1592966805142");
        httpGet.setHeader("referer", "http://baoxian.pingan.com/product/allbaoxianlist.shtml");
        //httpGet.setHeader("pragma", "no-cache");

    }

    //随机返回一个agent
    private static String getUserAgent(){
        ArrayList<String> list = new ArrayList<String>(){{
            add("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/41.0.2228.0 Safari/537.36");
            add("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/41.0.2227.1 Safari/537.36");
            add("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/41.0.2227.0 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/41.0.2227.0 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/41.0.2226.0 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/41.0.2225.0 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/41.0.2225.0 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/41.0.2224.3 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/40.0.2214.93 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/40.0.2214.93 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/37.0.2049.0 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/37.0.2049.0 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/36.0.1985.67 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/36.0.1985.67 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/35.0.3319.102 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/35.0.2309.372 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/35.0.2117.157 Safari/537.36");
            add("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/35.0.1916.47 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML); like Gecko) Chrome/34.0.1866.237 Safari/537.36");
            add("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36");
        }};
        int index = new Random().nextInt( list.size() );
        return list.get(index);
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您下载了本程序,但是该程序无法运行,或者您不会部署,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的) 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值