最近工做须要抓取不少广告推广数据,渠道多帐户多,统计比较费劲,就写个爬虫挨着采集入库方便统计。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请求不一致形成了,细心点总没有坏处