最近工做須要抓取不少廣告推廣數據,渠道多帳戶多,統計比較費勁,就寫個爬蟲挨着採集入庫方便統計。html
一、RedirectException: Maximum redirects (50) exceeded服務器
這個問題說個類:ide
核心代碼這個你們一看就懂了,response返回302重定向,結果造成死循環,超太重定向的上限拋異常。網站
這個能夠經過設置是否容許重定向:ui
RequestConfig config = RequestConfig.custom().setProxy(crawlerModel.getProxy()).setCircularRedirectsAllowed(true).build();
或者顯示重定向次數:url
page.getParams().setParameter("http.protocol.max-redirects", "110");
總之這其實不是結果問題的根本。HttpClient自動處理重定向其實給了不少方便。idea
個人問題是怎麼解決的呢?spa
其實 我也不知道,老是就那麼改着改着就報錯變成404了。第二個問題代理
二、404code
httpclient發出請求後,返回html顯示404找不到網頁,各類檢查url沒有問題,沒辦法就有fiddler抓抓包看看。
idea跟fiddler配置簡單說下,下面是網上查到的代碼
System.setProperty("http.proxyHost", "127.0.0.1"); System.setProperty("https.proxyHost", "127.0.0.1"); System.setProperty("http.proxyPort", "8888"); System.setProperty("https.proxyPort", "8888"); try { URL u = new URL(encodeUrl(strUrl)); try { try (InputStream in = new BufferedInputStream(u.openStream())) { InputStreamReader theHTML = new InputStreamReader(in); int c; while ((c = theHTML.read()) != -1) { System.out.print((char) c); } } } catch (MalformedURLException ex) { System.err.println(ex); } catch (IOException ex) { System.err.println(ex); } } catch (MalformedURLException e) { e.printStackTrace(); }
而後我就加上了,結果看不到,又各類抓狂。其實把fiddler做爲代理來抓包,httpclient設置代理的方式不是這麼幹的,來個正確的打開方式:
HttpHost proxy = new HttpHost("127.0.0.1",8888); RedirectStrategy redirectStrategy = new SeimiRedirectStrategy(); RequestConfig requestConfig = RequestConfig.custom().setProxy(proxy).setConnectTimeout(timeout).setSocketTimeout(timeout).build();
而後抓取數據就很穩定的入庫了。可是這不是我想要的結果啊,緣由還沒找到呢,不能用個代理就能出數據啊。總不能還要配置個代理吧。
這個不行就用個更底層的抓包看看wireshark。這個就厲害了!!!
對比下竟然是request中設置的headers中Host設置的問題,正確是的三級域名,我設置的是一個二級的域名,而後就404了。
Host頭域
Host頭域指定請求資源的Intenet主機和端口號,必須表示請求url的原始服務器或網關的位置。HTTP/1.1請求必須包含主機頭域,不然系統會以400狀態碼返回。
一個IP地址能夠對應多個域名: 一臺虛擬主機(服務器)只有一個ip,上面能夠放成千上萬個網站。當對這些網站的請求到來時,服務器根據Host這一行中的值來肯定本次請求的是哪一個具體的網站
這個以前是真沒覺的會影響尋址,費這麼大勁,獲得這麼一個小緣由。
三、返回的結果跟預期不同
這個其實比較簡單了,如今網站都有反爬策略的,若是你模擬的http請求過於簡單,會識別問爬蟲,返回意料外的結果也不足爲奇。
解決辦法就是把頭信息設置的全面些。
總結:全部問題其實都是模擬的http請求跟爬取網站的真是http請求不一致形成了,細心點總沒有壞處