zoukankan      html  css  js  c++  java
  • 爬虫遇到几个奇怪问题

    最近工作需要抓取很多广告推广数据,渠道多账户多,统计比较费劲,就写个爬虫挨着采集入库方便统计。

    1、RedirectException: Maximum redirects (50) exceeded

    这个问题说个类:

    核心代码这个大家一看就懂了,response返回302重定向,结果形成死循环,超过重定向的上限抛异常。

    这个可以通过设置是否允许重定向:

     RequestConfig config = RequestConfig.custom().setProxy(crawlerModel.getProxy()).setCircularRedirectsAllowed(true).build();

    或者显示重定向次数:

    page.getParams().setParameter("http.protocol.max-redirects", "110");

    总之这其实不是结果问题的根本。HttpClient自动处理重定向其实给了很多方便。

    我的问题是怎么解决的呢?

    其实 我也不知道,总是就那么改着改着就报错变成404了。第二个问题

    2、404

      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这一行中的值来确定本次请求的是哪个具体的网站

    这个之前是真没觉的会影响寻址,费这么大劲,得到这么一个小原因。

    3、返回的结果跟预期不一样

      这个其实比较简单了,现在网站都有反爬策略的,如果你模拟的http请求过于简单,会识别问爬虫,返回意料外的结果也不足为奇。

      解决办法就是把头信息设置的全面些。

    总结:所有问题其实都是模拟的http请求跟爬取网站的真是http请求不一致造成了,细心点总没有坏处

  • 相关阅读:
    野指针、NULL指针和void*
    Windows获取其他进程中Edit控件的内容
    error:LNK2005 已经在*.obj中定义
    2018-2019-1 20165226 《信息安全系统设计基础》第6周学习总结
    # 2018-2019-1 20165226 《信息安全系统设计基础》第5周学习总结
    2018-2019-1 20165310 20165315 20165226 实验一 开发环境的熟悉
    2018-2019-1 20165226 《信息安全系统设计基础》第4周学习总结
    2018-2019-1 20165226 《信息安全系统设计基础》第3周学习总结
    缓冲区溢出漏洞实验
    2018-2019-1 20165226 《信息安全系统设计基础》第2周学习总结
  • 原文地址:https://www.cnblogs.com/hughtxp/p/9544054.html
Copyright © 2011-2022 走看看