如何在Android中将CookieManager保存的cookie传递给Jsoup?

3

我有几个应用程序,从网页视图中接收cookie,并直接在jsoup中重复使用它以如下方式抓取内容:

final String url = "https://need.authentication.com";


// -- Android Cookie part here --
CookieSyncManager.getInstance().sync();
CookieManager cm = CookieManager.getInstance();

String cookie = cm.getCookie(url); // returns cookie for url

// ...

// -- JSoup part here --
// Jsoup uses cookies as "name/value pairs"
doc = Jsoup.connect("https://need.authentication.com").cookie(url, cookie).get();

这并不适用于所有的url。接收cookie从来不是问题,但jsoup有时无法使用cookie。

现在我想做的就是将这个现有的cookie添加到httpclient或另一个非废弃的选项中下载页面,然后将其交给jsoup进一步爬取数据,因为我感觉jsoup处理cookie的方式不正确。

Jsoup调试只显示:

03-19 03:06:16.394 1317-3369/mysource.internationsexpress W/System.err:     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:512)
03-19 03:06:16.394 1317-3369/mysource.internationsexpress W/System.err:     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:493)
03-19 03:06:16.394 1317-3369/mysource.internationsexpress W/System.err:     at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:205)
03-19 03:06:16.394 1317-3369/mysource.internationsexpress W/System.err:     at org.jsoup.helper.HttpConnection.get(HttpConnection.java:194)

更多信息如下,cookie的格式如下:

__indbg=481084b1-3d71-461a-b6e1-93d; 
__gads=ID=0058c3ccb75f72f2:T=1458162316:S=ALN; 
INSESSION=ct8njokkc4uadlmjjg8a3gvp1ng4m0acvvveea66bkpmn32fvc; 
INEP=%5B%22nw01_101_B_0%22%2C%22mp04_103_B_0%22%2C%22in01_244; 
WASLOGGEDIN=1; 
INREMEMBERME=cHlMQlRVbzVOUkhJTU5kU25tMlplZ2RvNWxvbkN4TmdsR0RBVWp6Qkp6dkpONW1Tb2o3MH; 
INBP=mobile; 
__utmt=1; 
__utma=68558281.1607821733.1458162272.1458240416.1; 
__utmb=68558281.1.10.1458327475; 
__utmc=68558281; 
__utmz=68558281.1458162272.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); 
__utmv=68558281.|2=community=sanj=1^3=loggedIn=1=1^5=experiment=%7Cst01_267_B_2%7Cmt01
1个回答

2

cookie(name, value)函数需要传入cookie的名称而不是它所属的url。

请改为以下方式:

doc = Jsoup //
       .connect("https://need.authentication.com") //
       .header("Cookie", cookie) //
       .get();

谢谢你的回答,Stephan。但不幸的是,它仍然不起作用。和之前一样。我对我的问题进行了编辑,并展示了更多的调试信息以及cookie的外观。我读到jsoup并不一定很好地处理会话等内容,所以我的想法是创建一个URLConnection,并将其结果传递给jsoup进行解析。但是在这里,我也不知道如何使用cookie。 - SunnySonic
@SunnySonic 尝试使用浏览器登录 need.authentication.com,同时窥探站点和浏览器之间的交换。分析交换的标头并在您的代码中复制它们。问题乍一看可能来自于 cookie、另一个标头、一些要运行的 JavaScript 代码或站点本身的巧妙足迹检测。在任何情况下,URLConnection 都无法帮助解决问题。最后,在 Android 平台上,建议使用 Volley。 - Stephan
谢谢Stephan。我现在找到了问题所在。你的建议很有用,但是网页正在使用JavaScript动态添加我想要抓取的标签。由于Jsoup只能抓取HTML,它无法工作。我现在正在阅读关于Selenium等解决我的问题的资料,或者你有更好的建议吗? - SunnySonic
@SunnySonic 你可以尝试使用ui4j作为替代方案。 - Stephan
谢谢@Stephan。我会研究一下。虽然它并不是最终问题,但由于解决了我第一个问题,所以我接受了你的答案。 - SunnySonic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接