webMagic解析淘宝cookie 提示Invalid cookie header

  webMagic解析淘宝cookie 提示Invalid cookie header

 在使用webMagic框架做爬虫爬取淘宝极又家页面时候一直提醒cookie设置不可用如下图

 

  淘宝的验证特别严重,cookie没有正常设置进去后面会频繁弹出验证页面,这是我们不想看到的。为了解决这个问题,debug进入源码。

    /**
* 摘选自
org.apache.http.impl.cookie.RFC2965Spec
   */
    @Override
    public List<Cookie> parse(
            final Header header,
            final CookieOrigin origin) throws MalformedCookieException {
        Args.notNull(header, "Header");
        Args.notNull(origin, "Cookie origin");
        if (!header.getName().equalsIgnoreCase(SM.SET_COOKIE2)) {
            throw new MalformedCookieException("Unrecognized cookie header '"
                    + header.toString() + "'");
        }
        final HeaderElement[] elems = header.getElements();
        return createCookies(elems, adjustEffectiveHost(origin));
    }
    /**
     *  摘选自org.apache.http.impl.cookie.RFC2965Spec
   *
     */
  public interface SM {
      public static final String COOKIE            = "Cookie";
      public static final String COOKIE2           = "Cookie2";
      public static final String SET_COOKIE        = "Set-Cookie";
      public static final String SET_COOKIE2       = "Set-Cookie2";
}

 

  走到这边就大概明白了,这边cookie的解析规则用的RFC2965Spec,而淘宝的cookie不是遵循此规则。

  期间去网上找了一下资料,大概了解了一下CookieSpec到底是个什么玩意。了解完了问题,接下来就是解决问题。


 

   

  解决的过程中,使用了各种骚操作,没有任何卵用,就不赘述。最后还是debug进入webMagic的源码,查找原因,看到HttpUriRequestConverter类时发现了问题

  - -!这边写死了。使用标准模式解析其实和合理,然而并不是所有网站都是遵循标准来实现的。

 

1  if (site != null) {
2             requestConfigBuilder.setConnectionRequestTimeout(site.getTimeOut())
3                     .setSocketTimeout(site.getTimeOut())
4                     .setConnectTimeout(site.getTimeOut())
5                     //爬虫Cookie不能识别
6                     .setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY);
7         }

   稍作修改,问题消失了。

   然而这种将代码写死的做法并不推荐,应该做成可配置的,默认使用标准的CookieSpec才是比较合理。

 

posted on 2017-12-04 20:04  阿姆斯特朗回旋炮  阅读(2760)  评论(0编辑  收藏  举报

导航