专栏首页FunTesterhttpclient 爬虫实例——爬取三级中学名

httpclient 爬虫实例——爬取三级中学名

本人在使用 httpclient 的过程中,突然想起来可以爬取一些数据,比如全国的中学名。当然不是空穴来风,之前也做过这方面的爬虫,不过基于selenium 做的 UI 脚本,效率非常慢,而且很不稳定,所以这次采取了接口的形式,果然效率提升了几个档次。一共6万+数据,用了16分钟左右,期间包括数据库的存储。现在分享代码供大家参考。关键信息隐去,大家看一下思路就好了。

  1package practise;
  2
  3import java.util.ArrayList;
  4import java.util.HashMap;
  5import java.util.List;
  6import java.util.Map;
  7import java.util.Set;
  8import java.util.regex.Matcher;
  9import java.util.regex.Pattern;
 10import org.apache.http.client.methods.HttpGet;
 11import net.sf.json.JSONObject;
 12import source.ApiLibrary;
 13import source.Concurrent;
 14
 15public class Crawler extends ApiLibrary {
 16    public static String host = "";
 17    public static Map<String, Integer> countrys = new HashMap<>();
 18    public static Map<String, Integer> citys = new HashMap<>();
 19    public static Map<String, Integer> address = new HashMap<>();
 20    public static Map<String, Integer> school = new HashMap<>();
 21    public static List<String> total = new ArrayList<>();
 22
 23    public static void main(String[] args) {
 24        Crawler crawler = new Crawler();
 25        crawler.getCountry1();// 省份
 26        Set<String> countryId = countrys.keySet();
 27        for (String name : countryId) {
 28            int id = countrys.get(name);
 29            crawler.getCountry2(id);// 市
 30            Set<String> cityId = citys.keySet();
 31            for (String city : cityId) {
 32                int cid = citys.get(city);
 33                crawler.getCountry3(cid);// 县
 34                Set<String> adresss = address.keySet();
 35                for (String adres : adresss) {
 36                    int aid = address.get(adres);
 37                    crawler.getCountry4(aid);// 名
 38                    Set<String> schol = school.keySet();
 39                    for (String sch : schol) {
 40                        String line = name + PART + city + PART + adres + PART + sch;
 41                        total.add(line);
 42                    }
 43                }
 44            }
 45        }
 46        Concurrent.saveRequestTimes(total);
 47        testOver();
 48    }
 49
 50    /**
 51     * 查询省份
 52     */
 53    public void getCountry1() {
 54        String url = host + "/user/editinfo/getSchollCountryList";
 55        HttpGet httpGet = getHttpGet(url);
 56        // httpGet.addHeader("Cookie", cookies);
 57        // httpGet.addHeader("User-Agent", userangent);
 58        JSONObject response = getHttpResponseEntityByJson(httpGet);
 59        String[] country = response.getString("content").split("</a>");
 60        int size = country.length;
 61        for (int i = 0; i < size; i++) {
 62            String msg = country[i];
 63            int code = getCode(msg);
 64            String name = getName(msg);
 65            countrys.put(name, code);
 66        }
 67    }
 68
 69    /**
 70     * 查询市
 71     * 
 72     * @param id
 73     */
 74    public void getCountry2(int id) {
 75        String url = host + "/user/editinfo/getSchollCityList?region_id=" + id;
 76        HttpGet httpGet = getHttpGet(url);
 77        JSONObject response = getHttpResponseEntityByJson(httpGet);
 78        String[] ssString = response.getString("content").split("</a>");
 79        int size = ssString.length;
 80        citys.clear();
 81        for (int i = 0; i < size; i++) {
 82            String msg = ssString[i];
 83            int code = getCode(msg);
 84            String name = getName(msg);
 85            citys.put(name, code);
 86        }
 87
 88    }
 89
 90    /**
 91     * 查询县
 92     * 
 93     * @param id
 94     */
 95    public void getCountry3(int id) {
 96        String url = host + "/user/editinfo/getSchollAddressList?region_id=" + id;
 97        HttpGet httpGet = getHttpGet(url);
 98        JSONObject response = getHttpResponseEntityByJson(httpGet);
 99        String[] ssString = response.getString("content").split("</a>");
100        int size = ssString.length;
101        address.clear();
102        for (int i = 0; i < size; i++) {
103            String msg = ssString[i];
104            int code = getCode(msg);
105            String name = getName(msg);
106            address.put(name, code);
107        }
108    }
109
110    /**
111     * 查询学校
112     * 
113     * @param id
114     */
115    public void getCountry4(int id) {
116        String url = host + "/user/editinfo/getSchoolNameList?region_id=" + id;
117        HttpGet httpGet = getHttpGet(url);
118        JSONObject response = getHttpResponseEntityByJson(httpGet);
119        String[] ssString = response.getString("content").split("</a>");
120        int size = ssString.length;
121        school.clear();
122        for (int i = 0; i < size; i++) {
123            String msg = ssString[i];
124            int code = getCode(msg);
125            String name = getName(msg);
126            school.put(name, code);
127        }
128    }
129
130    /**
131     * 获取 code
132     * 
133     * @param text
134     * @return
135     */
136    public int getCode(String text) {
137        int code = 0;
138        Pattern pattern = Pattern.compile("\"\\d+\"");
139        Matcher matcher = pattern.matcher(text);
140        if (matcher.find()) {
141            code = changeStringToInt(matcher.group(0).replace("\"", ""));
142        }
143        return code;
144    }
145
146    /**
147     * 获取名称
148     * 
149     * @param text
150     * @return
151     */
152    public String getName(String text) {
153        String name = text.substring(text.lastIndexOf(">") + 1, text.length());
154        return name;
155    }
156
157}

下面是爬取到数据截图

技术类文章精选

非技术文章精选

大咖风采

点击查看公众号地图

本文分享自微信公众号 - FunTester(NuclearTester),作者:八音弦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java使用poi读取excel文档的一种解决方案

    本人在学习使用java的过程中,需要验证一下excel表格里面的数据是否与数据库中的数据相等。由于数据太多,故想着用java读取excel数据再去数据库验证。上...

    FunTester
  • httpclient爬虫爬取汉字拼音等信息

    下面是使用httpclient爬虫爬取某个网站的汉字相关信息的实践代码,中间遇到了一些字符格式的问题。之前被同事见过用html解析类来抓取页面信息,而不是像我现...

    FunTester
  • 拼接GET请求的参数

    本人在做接口测试的过程中,之前写了一个用字符串替换的方法来处理get接口的参数拼接,后来优化了这个方法,兼容了中文字符提示非法字符的情况,使用了java自带的u...

    FunTester
  • Java 中 String 类为什么要设计成不可变的?

    String 是 Java 中不可变的类,所以一旦被实例化就无法修改。不可变类的实例一旦创建,其成员变量的值就不能被修改。本文总结下 String 类设计成不可...

    用户3596197
  • Java重写compare方法实现数组降序排列

    深浅无解
  • Java基础系列2:深入理解String类

    String是Java中最为常用的数据类型之一,也是面试中比较常被问到的基础知识点,本篇就聊聊Java中的String。主要包括如下的五个内容:

    王金龙
  • JVM 《四 JVM 中的String》

    String 这样的量,在我们的认知中是比较特别的。 其中String 是个对象,然后String也可以是个普通的字面量。在每代JDK中对String 的处理...

    邹志全
  • (四)Java读写文件,合并成新的文件

    AppCrashed participate__recharge_activity participate_activity

    wolf
  • Spark Tips3: 在Spark Streaming job中读取Kafka messages及其offsetRange

    在Spark Streaming job中读取Kafka topic(s)中的messages时,有时我们会需要同步记录下每次读取的messages的offse...

    叶锦鲤
  • Pinyin4j简单使用教程

    本文链接:https://blog.csdn.net/u014427391/article/details/97518614

    SmileNicky

扫码关注云+社区

领取腾讯云代金券