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类时发现了问题
- -!这边写死了。使用标准模式解析其实和合理,然而并不是所有网站都是遵循标准来实现的。
if (site != null) {
requestConfigBuilder.setConnectionRequestTimeout(site.getTimeOut())
.setSocketTimeout(site.getTimeOut())
.setConnectTimeout(site.getTimeOut())
//爬虫Cookie不能识别
.setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY);
}
稍作修改,问题消失了。
然而这种将代码写死的做法并不推荐,应该做成可配置的,默认使用标准的CookieSpec才是比较合理。