JSoup 未使用登录密码连接网站



>我正在尝试将网站与JSoup连接,但无法正常工作。

这是我的代码:

Connection.Response res = Jsoup.connect("http://www.metalbulletin.com/Login.html?ReturnURL=%2fdefault.aspx&")
.data("username", "94mkr@mail4gmail.com", "password", "jakdjique&THFI#")
.method(Method.POST)
.execute();
Map<String, String> loginCookies = res.cookies();
Document doc = Jsoup.connect("https://www.metalbulletin.com/Article/3838710/Home/CHINA-REBAR-Domestic-prices-recover-after-trading-pick-up.html")
.cookies(loginCookies)
.get();
Element article             = doc.getElementById("article-body");   
Elements heading            = article.getElementsByTag("h1");
Elements lead               = article.getElementsByClass("lead");
Elements lead1              = article.getElementsByClass("articleContainer");
System.out.println(lead);   
System.out.println(lead1);          

我刚刚制作了一个临时登录名/密码,以便您可以检查它 我注意到,http://www.metalbulletin.com/Login.html?ReturnURL=%2fdefault.aspx&这会生成一个新链接,例如:
https://account.metalbulletin.com/identity/login?signin=fab48076d8a4f74f52565dd6a9f47e65

我尝试了很多,但仍然无法访问这个网站

更新
我改进了我的代码如下:

Connection.Response response = Jsoup.connect("http://www.metalbulletin.com/Login.html?ReturnURL=%2fdefault.aspx&")
.method(Connection.Method.GET)
.execute();
response = Jsoup.connect("http://www.metalbulletin.com/Login.html?ReturnURL=%2fdefault.aspx&")
.data("username", "94mkr@mail4gmail.com", "password", "jakdjique&THFI#")
.cookies(response.cookies())
.method(Connection.Method.POST)
.execute();
Map<String, String> cookies = new HashMap<String, String>();
Document doc = Jsoup.connect("https://www.metalbulletin.com/Article/3838710/Home/CHINA-REBAR-Domestic-prices-recover-after-trading-pick-up.html")
.cookies(response.cookies())
.get();
System.out.println(response.statusMessage()+"n"+response.statusCode());  

当我编译时,输出是:OK 200

但是当我继续下一部分数据获取时,例如:

Element article             = doc.getElementById("article-body");   
Elements lead               = article.getElementsByClass("lead");
Elements lead1              = article.getElementsByClass("articleContainer");
System.out.println(lead);   
System.out.println(lead1);          

然后它放弃并显示显示给非登录用户的数据

假设您想使用给定的凭据浏览网站,我建议您从普通浏览器登录。复制网站生成的 Cookie 并将它们添加到 CookieStore 的实例中。

BasicCookieStore cookieStore = new BasicCookieStore();
BasicClientCookie cookie1 = new BasicClientCookie("__gads", "ID=958b183c83ede6e8:T=1539776783:S=ALNI_MbFRRpTafZvTiJAjKmTB9oBQelWWw");
cookie1 .setDomain(".metalbulletin.com");
cookie1 .setPath("/");
BasicClientCookie cookie2 = new BasicClientCookie("__utma", "167598498.350699797.1539776871.1539776871.1539776871.1");
cookie2 .setDomain(".metalbulletin.com");
cookie2 .setPath("/");
....
cookieStore.addCookie(cookie1);
cookieStore.addCookie(cookie2);
....

然后在创建连接池时使用 cookiestore。

PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
connManager.setMaxTotal(256);
connManager.setDefaultMaxPerRoute(64);
ConnectionKeepAliveStrategy myStrategy = new DefaultConnectionKeepAliveStrategy();
CloseableHttpClient closeableHttpClient = HttpClientBuilder.create()
.setDefaultCookieStore(getCookieStore())
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build())
.setConnectionManager(connManager).setKeepAliveStrategy(myStrategy).build();

因为无论如何,如果您想登录该网站。然后,您需要一种方法来处理cookie和令牌。这样,cookiestore 将处理 cookie。你只需要用http客户端调用网站,然后用jsoup解析返回的html。

编辑: 这些是您需要遵循的步骤:

  1. 使用浏览器登录。
  2. 创建一个包含浏览器保存的所有 Cookie 的 BasicCookieStore。您可以使用开发人员控制台并监控每次浏览网站时哪些 cookie 正在更改,从而找出最重要的 cookie。但为了安全起见,请将它们全部添加。
  3. 创建 HttpClientManager 并将 cookieStore 添加到其中。
  4. 现在考虑自己已登录并开始调用您需要抓取的页面。只需使用生成的客户端池发出 get 请求即可。例如:到页面"https://www.metalbulletin.com/Article/3838710/Home/CHINA-REBAR-Domestic-prices-recover-after-trading-pick-up.html">
  5. 如果一切都正确完成,则请求应返回 HTML 页面源代码。
  6. 使用 Jsoup.parse(stringHtml( 将字符串响应转换为 Document 对象。
  7. 解析响应并提取所需的元素。
  8. 发出另一个请求.. 以字符串形式获取响应.. 使用 jsoup 解析 html.. 重复.

祝你好运。

最新更新