<address id="xpjh9"><listing id="xpjh9"><meter id="xpjh9"></meter></listing></address>

<address id="xpjh9"><address id="xpjh9"><listing id="xpjh9"></listing></address></address>
<noframes id="xpjh9">
<noframes id="xpjh9">

<address id="xpjh9"><address id="xpjh9"><listing id="xpjh9"></listing></address></address>
    <form id="xpjh9"></form><address id="xpjh9"><listing id="xpjh9"><menuitem id="xpjh9"></menuitem></listing></address>

      <noframes id="xpjh9">
      VB.net 2010 視頻教程 VB.net 2010 視頻教程 VB.net 2010 視頻教程
      SQL Server 2008 視頻教程 c#入門經典教程 Visual Basic從門到精通視頻教程
      當前位置:
      首頁 > 數據庫 > Access數據庫 >
      • access數據庫之當爬蟲被拒絕時(Access Denied)

      • 2019-07-03 22:17 來源:未知

           由于要準備測試數據,不得不大量爬取某個網站的內容。為了防止被封,特意將爬蟲設計為單線程同步的爬蟲。結果在爬了大約3萬個頁面的時候,對方發回Access Denied。等一段時間后再啟動爬蟲,結果還是Access Denied。這時才明白這樣的想法太天真了,當初就應該找其它方法來避免才對。而本文則記述了這些其它方法。

      1. 偽裝user agent

            User agent 是HTTP協議的中的一個字段, 其作用是描述發出HTTP請求的終端的一些信息。 服務器通過這個字段就可以知道要訪問網站的是什么人了。每個瀏覽器,每個正規的爬蟲都有其固定的user agent,因此只要將這個字段改為這些知名的user agent,就可以成功偽裝了。不過,不推薦偽裝知名爬蟲,因為這些爬蟲很可能有固定的IP,如百度爬蟲。與此相對的,偽裝瀏覽器的user agent是一個不錯的主意,因為瀏覽器是任何人都可以用的,換名話說,就是沒有固定IP。推薦準備若干個瀏覽器的user agent,然后每次發送請求的時候就從這幾個user agents中隨機選一個填上去。IE的幾個user agent如下:

      Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) 
      Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2) 
      Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

      設置代碼如下(假設使用JAVA + HttpClient 4.1.2)

      HttpGet getMethod = new HttpGet("URL");
      getMethod.setHeader("User-Agent", "user agent內容");

       

      2. log in

            雖然有些網站不登陸就能訪問,但是它一檢測到某IP的訪問量有異常,就會馬上提出登陸要求。如果是不帶驗證碼的,那么果斷登陸吧。不過,在登陸之前要做些準備——查清楚POST登陸請求時要附帶哪些參數。我的做法是先用badboy錄制登陸過程,然后將這一過程導出為jmeter文件,最后用jmeter查看登陸所需的參數。查完后,就可以登陸,具體如下所示

      復制代碼
              DefaultHttpClient httpclient = new DefaultHttpClient();
              HttpPost postMethod = new HttpPost("http://passport.cnblogs.com/login.aspx");    //注意用post
              
              //登陸博客園所需要的參數
              List<NameValuePair> nvps = new ArrayList<NameValuePair>(); 
              nvps.add(new BasicNameValuePair("tbUserName", "風炎"));  
              nvps.add(new BasicNameValuePair("tbPassword", "zero"));
              nvps.add(new BasicNameValuePair("btnLogin", "登  錄"));
              nvps.add(new BasicNameValuePair("__EVENTTARGET", ""));
              nvps.add(new BasicNameValuePair("__EVENTARGUMENT", ""));
              nvps.add(new BasicNameValuePair("__VIEWSTATE", "/wEPDwULLTE1MzYzODg2NzZkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYBBQtjaGtSZW1lbWJlcm1QYDyKKI9af4b67Mzq2xFaL9Bt"));
              nvps.add(new BasicNameValuePair("__EVENTVALIDATION", "/wEWBQLWwpqPDQLyj/OQAgK3jsrkBALR55GJDgKC3IeGDE1m7t2mGlasoP1Hd9hLaFoI2G05"));        
              nvps.add(new BasicNameValuePair("ReturnUrl", "http://www.cnblogs.com/"));
              nvps.add(new BasicNameValuePair("txtReturnUrl", "http://www.cnblogs.com/"));
              
              postMethod.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));  
              HttpResponse response = httpclient.execute(postMethod);    
      復制代碼

               由于httpClient會自動管理cookie,所以接下來直接get或者post就行了。

       

      3. 使用代理

            如果對方用某段時間內某IP的訪問次數來判定爬蟲,然后將這些爬蟲的IP都封掉的話,以上偽裝就失效了。對方的這個思路隱含著一個假設:爬蟲的訪問量必然比正常用戶的大很多,因而只要使這個假設不成立就可以了。這時就該代理上場了。所謂代理就是介于用戶與網站之間的第三者:用戶先將請求發到代理,然后代理再發到服務器,這樣看起來就像是代理在訪問那個網站了。這時,服務器會將這次訪問算到代理頭上。同時用多個代理的話,單個IP的訪問量就降下去了,于是就有可能逃過一劫。不過,這個方法最大的問題就是找到穩定的代理(有錢買代理的,可以無視這句話)。我目前是在無憂代理找,但找到的大部分都不能用,少部分能用的也不穩定。求分享好用的免費代理。

            假設找到/買了N個代理,那么要如何管理這些代理呢?我的想法是做一個類似于內存池的IP池。這樣做的好處是便于管理以及易于擴展。當只有一個代理時,其用法如下所示

      復制代碼
              DefaultHttpClient httpclient = new DefaultHttpClient();
              
              //此代理不保證你看到的時候還存活
              HttpHost proxy = new HttpHost("u120-227.static.grapesc.cz", 8080);
              httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,proxy);
              
              //如果代理要認證,則加上以下語句
      //        httpclient.getCredentialsProvider().setCredentials(new AuthScope("proxy adress", proxy port),   
      //                new UsernamePasswordCredentials("username", "password"));   
              
              //記得將網址拆成以下形式
              HttpHost targetHost = new HttpHost("www.cnblogs.com");    //網站名前面不要加http:// 
              HttpGet httpget = new HttpGet("/FengYan/");
              
              HttpResponse response = httpclient.execute(targetHost, httpget); 
      復制代碼

              補充下,如果是ADSL撥號,那么無需擔心被封IP,因為一般來說,當你重新撥號時,你會得到一個不一樣的IP。

      4. 降低訪問頻率

            如果說找不到又免費又穩定的代理呢?那只好用最后一招了——降低訪問頻率。這樣做可以達到與用代理一樣的效果——防止被對方從訪問量上看出來。當然,在抓取效率上會差很多。此外,降低訪問頻率只是一個指導思想,在這個思想下,可以得到很多具體做法,例如:每抓取一個頁面就休息隨機秒(個人感覺比固定時間的要好);限制每天抓取的頁面數量。

       

      5. 總結

           防止被封的“理”是偽裝成正常用戶,只要按著這個“理”走,總能找到具體的“法”。雖說如此,對于一個接觸爬蟲不久的小白,例如在下,是很難知道正常用戶訪問一個網站時的所有細節的。因此,知道些反爬蟲的“法”,然后有針對地進行拆招還是十分必要的。描述反爬的“法”的文章,推薦“互聯網網站的反爬蟲策略淺析

      相關教程
      江苏快3 乌兰察布 | 巴音郭楞 | 伊犁 | 白山 | 黔东南 | 聊城 | 宿迁 | 山南 | 六安 | 白沙 | 铜陵 | 改则 | 永康 | 湘西 | 湖南长沙 | 靖江 | 吴忠 | 双鸭山 | 郴州 | 淮北 | 连云港 | 丽江 | 那曲 | 和田 | 寿光 | 高雄 | 阿勒泰 | 克拉玛依 | 万宁 | 枣阳 | 怀化 | 伊春 | 澄迈 | 邵阳 | 荣成 | 山南 | 塔城 | 辽宁沈阳 | 张家界 | 乌兰察布 | 河南郑州 | 乐清 | 蚌埠 | 沛县 | 克孜勒苏 | 渭南 | 垦利 | 宜春 | 保定 | 烟台 | 博尔塔拉 | 醴陵 | 通辽 | 泰安 | 福建福州 | 迁安市 | 毕节 | 三沙 | 乳山 | 鸡西 | 甘南 | 吉安 | 石嘴山 | 日土 | 云浮 | 襄阳 | 和县 | 河南郑州 | 仙桃 | 庄河 | 绥化 | 晋城 | 三明 | 德州 | 海南海口 | 安庆 | 辽源 | 百色 | 新泰 | 吉安 | 河南郑州 | 长葛 | 桓台 | 晋中 | 昭通 | 克拉玛依 | 武夷山 | 琼中 | 鸡西 | 宿迁 | 张家界 | 芜湖 | 黔东南 | 衡阳 | 莱芜 | 焦作 | 德清 | 齐齐哈尔 | 兴安盟 | 新余 | 吉林 | 平凉 | 陕西西安 | 清远 | 巴彦淖尔市 | 株洲 | 遵义 | 塔城 | 泰安 | 德州 | 南平 | 吕梁 | 柳州 |