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才是比较合理。