zoukankan      html  css  js  c++  java
  • Webcollector应用(二)

      先吐槽一句哀家的人品,总在写好代码之后,网站默默的升级,没有一点点防备...

    一、加代理

      爬取一个网站的时候,爬了不到一半,IP被封了,整个内部局域网的所有电脑都不能访问网站了。

     1 public class CrawlTong  extends DeepCrawler{
     2     JdbcTemplate jdbcTemplate = JDBCBase.getInstance().getTemplete2();
     3     protected HttpRequesterImpl requester=(HttpRequesterImpl)this.getHttpRequester();//③
     4     public final static String name = "name";   
     5     public final static String password = "password";
     6     public final static  String headerKey = "Proxy-Authorization";  
     7     public final static String headerValue = "Basic " + Base64.encode((name + ":" + password).getBytes());
     8     public final static int port = 50000;  
     9     public final static String[] proxys = { 
    10             "***.***.***.***",
    11             "***.***.***.***",
    12             "***.***.***.***"};
    13     public CrawlTong(String crawlPath ,int useProxy){       // ①
    14         super(crawlPath);
    15         if(useProxy == 1) {
    16             requester.setHeader(ProxyCollector.headerKey, ProxyCollector.headerValue);//④   
    17             //多代理随机
    18             RandomProxyGenerator proxyGenerator = new RandomProxyGenerator(); // ⑤
    19             for (String proxy : proxys) {
    20                 proxyGenerator.addProxy(proxy,port); // ⑥
    21             }
    22             requester.setProxyGenerator(proxyGenerator); // ⑧
    23         }
    24     }
    25  public static void main(String[] args) throws Exception{
    26         CrawlTong crawler = new CrawlTong("/tong",1); // ②
    27         crawler.addSeed("https://www.tzg.cn/");
    28         crawler.start(1);
    29     }
    30 }

       还是以应用(一)中的代码为例,可以在构造函数中添加代理:

      ① 在原来的基础添加了一个int型的useProxy参数,如果为1则用代理,不想用可以设置其他值

      ② 主函数中调用

      ③ 得到当前的请求requester,HttpRequesterImpl类型

      ④ 设置请求的Header信息,key值是"Proxy-Authorization",value值是以代理服务器的用户名和密码构成的字符串

      ⑤ 创建一个RandomProxyGenerator类型的对象proxyGenerator,这个类是Webcollector提供的,可以随机切换代理

      ⑥  把事先定义好的代理服务器IP和端口依次放入到代理生成器中

      ⑧ 调用requster的setProxyGenerator方法,代理生成器传进去

      为虾米没有圈7呢,因为我打不出来........

      在我写这篇blog的时候,又一件积攒人品的事情发生了,哈哈哈,我这些代理服务器也被封了呢......

      要考虑增加些sleep了...... 

    二、解析json

      很多页面将数据存储到单独的json文件中,所以要拿到数据,就需要对其进行解析。

      解析json本身与Webcollector没什么多大关系,用java自己的方法。  

     1   public Links visitAndGetNextLinks(Page page) {
     2         String jsonStr = page.getHtml();
     3         JSONObject json = null;
     4         json = new JSONObject(jsonStr);
     5         System.out.println(jsonStr);   //①
     6         System.out.println(json);    //②
     7         JSONObject msg=json.getJSONObject("msg"); //③
     8         System.out.println(msg);
     9         int total = msg.getInt("total");
    10         JSONArray projectData = msg.getJSONArray("projectData"); //④
    11         System.out.println(total);
    12         System.out.println(projectData);
    13         for(int i = 0 ;i<projectData.length();i++){  // ⑤
    14             JSONObject object = projectData.getJSONObject(i);
    15             dataModel = new DataModel();
    16             dataModel.setNumber(object.getString("thousandearnings"));
    17             dataModel.setFlag(object.getInt("remain_percent"));
    18             System.out.println(object.getString("thousandearnings"));
    19             System.out.println(object.getInt("remain_percent"));
    20         }
    21         return null;
    22     }

      需要引入需要的包 import org.json.JSONArray; import org.json.JSONObject;....

      ① 和 ② 打印出来看似没有什么区别,但是呢一个是String类型,一个是Json类型,可以调用的方法不一样。

      ③ 通过getJSONObject方法获取JSONObject对象

      JSONObject类型:json串,最外层大括号

      {"A":"aaa","B":"bbb","C":[{"C1":"c1c1c1","C2":"c2c2c2"},{"CC1":"cc1cc1cc1","CC2":"cc2cc2cc2"}]}

      ④ 通过getJSONArray方法获取JSONArray对象

      JSONArray类型: 最外层是[],里面包含json串

      [{"C1":"c1c1c1","C2":"c2c2c2"},{"CC1":"cc1cc1cc1","CC2":"cc2cc2cc2"}]

      ⑤ 遍历JSONArray

      总之:value值是什么类型的,就调用json相对应的方法获取即可

  • 相关阅读:
    使用 mysql_random_data_load 生成随机数据
    TeamViewer 运行 AlterID 时候报错Cloud not create a fake UUID
    1.6 在WHERE子句中引用取别名的列
    本地登录多实例mysql ,默认登录数据库问题
    统计前10位的占用空间较大的目录
    Oracle查看用户权限
    [LeetCode]Binary Tree Preorder Traversal
    [LeetCode]Insertion Sort List
    [LeetCode]Implement strStr()
    [LeetCode]Remove Element
  • 原文地址:https://www.cnblogs.com/naonaoling/p/5320404.html
Copyright © 2011-2022 走看看