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