1. <rp id="c4hsd"></rp>
          1. <button id="c4hsd"><acronym id="c4hsd"><input id="c4hsd"></input></acronym></button>
          2. <tbody id="c4hsd"></tbody>

            <dd id="c4hsd"><pre id="c4hsd"></pre></dd>

              1. <th id="c4hsd"></th>
              2. <s id="c4hsd"><object id="c4hsd"></object></s>

                    [ 登錄 ] - [ 注冊 ] | 代碼示例DEMO | IP測試視頻 |

                    使用Jsoup和代理IP做數據抓取

                    作者:數據無憂   時間:2020-09-18 13:24:53
                    現在爬數據越來越難,各種反爬,簡單的網站沒做什么反爬,就隨便介紹下:

                    隨便找點網站弄點免費的http代理ip,去爬一下,太簡單就不介紹了,目前最好用的代理ip是無憂HTTP代理

                    具體說下,稍微有點爬蟲技術含量的吧,怎么樣偽裝自己的爬蟲程序,盡量避免反爬:

                    1.請求頭的user-agent參數必不可少,而且?。。?!要隨機,這里是大坑,我之前就是沒有隨機,然后爬了幾天就被人反爬了,醉了,我當時還以為代理的問題,一直跟客服比比比比比,說他們代理被封了,后來才發現是我的請求頭里面的user-agent被封了,然后心里愧疚的跟客服小姐姐抱歉了下。。。僵硬。 user-agent是瀏覽器的標識,所以越多越好,大量的隨機,跟代理ip一樣重要!

                    來源!來源! 說實話之前一直沒發現,后來是訪問某網站的時候發現的,反爬做這么多干嘛,累啊,互聯網,數據大家一起用嘛??! 請求頭的referer這個參數就是記錄的來源。為什么要偽裝這個參數。我詳細的說明下,你來源不偽裝,就直接請求別人的接口,憑什么,他這個接口可能只是給頁面調用的。。瀏覽器請求的時候都有來源,你不偽裝,不就暴露了,具體傳什么參數,不同的網站都不一樣,可以F12看下瀏覽器請求的時候傳的什么。

                    代理ip必不可少,這里用免費的就不太好了,因為既然要爬數據,肯定要快,ip的要求就比較高,而且要有效的數量比較多,不然別人網站升級什么的,你沒爬完,爬蟲程序就蹦了。所以讓老板花錢省心省力提高效率 。代理Ip的網站現在很多,我就不隨便推薦了,免得查水表。

                    源碼我就隨便貼一下,應該是可以跑的,就是獲取代理ip的url記得換下。


                    import java.io.IOException;
                    import java.util.*;
                    import java.util.concurrent.ExecutorService;
                    import java.util.concurrent.Executors;
                    import org.jsoup.Jsoup;
                    import org.jsoup.nodes.Document;
                    import org.slf4j.Logger;
                    import org.slf4j.LoggerFactory;
                     
                    import net.sf.json.JSONObject;
                     
                    public class Test {
                        //獲取代理ip,記得更換,我用的是無憂代理的,可以換成其他的網站的
                        private final static String GET_IP_URL = "http://api.ip.data5u.com/dynamic/get.html?order=xxxx&sep=3&json=1";
                        public static void main(String[] args) throws InterruptedException {
                            List<String> addrs = new LinkedList<String>();
                            Map<String,Integer> addr_map = new HashMap<String,Integer>();
                            Map<String,String> ipmap = new HashMap<String,String>();
                            ExecutorService exe = Executors.newFixedThreadPool(10);
                            for (int i=0 ;i<1;i++) {
                                Document doc = null;
                                try {
                                    doc = Jsoup.connect(GET_IP_URL).get();
                                } catch (IOException e) {
                                    continue;
                                }
                                System.out.println(doc.text());
                                JSONObject jsonObject = JSONObject.fromObject(doc.text());
                                List<Map<String,Object>> list = (List<Map<String,Object>>) jsonObject.get("data");
                                int count = list.size();
                     
                                for (Map<String,Object> map : list ) {
                                    String ip = (String)map.get("ip");
                                    String port = (String)map.get("port") ;
                                    ipmap.put(ip,"1");
                                    checkIp a = new checkIp(ip, new Integer(port),count);
                                    exe.execute(a);
                                }
                                exe.shutdown();
                                Thread.sleep(1000);
                            }
                        }
                    }
                     
                     
                    class checkIp implements Runnable {
                        private static Logger logger = LoggerFactory.getLogger(aaa.class);
                        private static int suc=0;
                        private static int total=0;
                        private static int fail=0;
                     
                        private String ip ;
                        private int port;
                        private int count;
                        public checkIp(String ip, int port,int count) {
                            super();
                            this.ip = ip;
                            this.port = port;
                            this.count = count;
                        }
                     
                        @Override
                        public void run() {
                            Random r = new Random();
                            String[] ua = {"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0",
                                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36 OPR/37.0.2178.32",
                                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
                                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
                                    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586",
                                    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
                                    "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
                                    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",
                                    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)",
                                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 BIDUBrowser/8.3 Safari/537.36",
                                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Core/1.47.277.400 QQBrowser/9.4.7658.400",
                                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 UBrowser/5.6.12150.8 Safari/537.36",
                                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0",
                                    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 TheWorld 7",
                                    "Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/60.0"};
                            int i = r.nextInt(14);
                            logger.info("檢測中------ {}:{}",ip,port );
                            Map<String,String> map = new HashMap<String,String>();
                            map.put("waybillNo","DD1838768852");
                            try {
                                total ++ ;
                                long a = System.currentTimeMillis();
                                //爬取的目標網站,url記得換下。。。?。?!
                                Document doc = Jsoup.connect("http://trace.yto.net.cn:8022/TraceSimple.aspx")
                                        .timeout(5000)
                                        .proxy(ip, port, null)
                                        .data(map)
                                        .ignoreContentType(true)
                                        .userAgent(ua[i])
                                        .header("referer","http://trace.yto.net.cn:8022/gw/index/index.html")//這個來源記得換..
                                        .post();
                                System.out.println(ip+":"+port+"訪問時間:"+(System.currentTimeMillis() -a) + "   訪問結果: "+doc.text());
                                suc ++ ;
                            } catch (IOException e) {
                                e.printStackTrace();
                                fail ++ ;
                            }finally {
                                if (total == count ) {
                                    System.out.println("總次數:"+total);
                                    System.out.println("成功次數:"+suc);
                                    System.out.println("失敗次數:"+fail);
                                }
                            }
                        }
                     
                    }


                    無憂代理IP(www.aooseo.com)原創文章,轉載請注明出處。

                    電話:4007-745-096
                    QQ:
                    周一至周日8:30-18:00 技術部電話熱線
                    久久夜色精品国产噜噜亚洲AV_老妇女性较大毛片_888亚洲欧美国产va在线播放_超碰人人透人人爽人人看