最近我正在努力让应用关注特定网站。我需要访问记录后具有可见内容的页面。如果我明白,下面的代码显示,首先我需要连接到url1以避免默认主页,所以在这里我无法发送数据(登录,密码)。我需要从url3看到一个内容,但在这里我也无法发送数据,因为没有登录和密码字段。他们在url2。我尝试过本网站的其他解决方案,但我只收到每个人都可以看到的内容。有人可以帮忙吗?
private class Parser extends AsyncTask<Void, Void, Void> {
String h;
String url1 = "http://www.klt.net.pl/";
String url2 = "http://www.klt.net.pl/index.php?a=logowanie";
String url3 = "http://www.klt.net.pl/index.php?a=przedmecz1&b=2&d=2038";
@Override
protected void onPreExecute() {
super.onPreExecute();
pd = new ProgressDialog(MainActivity.this);
pd.setTitle("Parser");
pd.setMessage("Loading...");
pd.setIndeterminate(false);
pd.show();
}
@Override
protected Void doInBackground(Void... params) {
try {
Connection.Response response = Jsoup.connect(url1)
.method(Connection.Method.GET)
.timeout(50000)
.followRedirects(true)
.execute();
Document document = Jsoup.connect(url2)
.cookies(response.cookies())
.get();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
pd.dismiss();
}
}
编辑:
@Override
protected Void doInBackground(Void... params) {
try {
Connection.Response response = Jsoup.connect(url1)
.method(Connection.Method.GET)
.timeout(50000)
.followRedirects(true)
.execute();
Connection.Response loginRes = Jsoup.connect(url2)
.userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36")
.data("login", getlog2,
"haslo", getpass2)
.cookies(response.cookies())
.method(Method.POST)
.execute();
Map<String, String> cookies = new Map<String, String>();
cookies.addAll(loginRes.cookies());
Connection.Response otherRes = Jsoup.connect(url3)
.cookies(cookies)
.method(Method.POST)
.execute();
d3 = Jsoup.connect(url3)
.cookies(otherRes.cookies())
.get();
我的更新代码。这可以吗?我在Map中有错误(无法实例化类型,无法解析类型)。
答案 0 :(得分:0)
要登录,您需要知道数据到 POST (ID,密码,会话Cookie等等)以及网址 strong>你需要 POST 来。
此信息通常都包含在登录表单中,我将在下面解释执行此操作所需的步骤:
第1步:您需要输入登录的 ID 和密码应该是表单的输入。只需右键点击您在 ID 中输入的区域,然后选择Inspect Element
(假设您在Chrome上)。在那里,您将能够检查输入和表格的属性。
第2步:密切调查表单并记录所有输入字段(包括隐藏字段)。您需要知道所有字段的name
和value
。您还需要知道表单请求是在GET
还是POST
以及表单的action
值。
第3步:现在让我们来看看有趣的部分。使用以下代码段向服务器发出请求并检索所需内容。
Connection.Response loginRes = Jsoup.connect(loginUrl)
.userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"
.data("login", yourID
"haslo", yourPassword)
.cookies(response.cookies()) //this is the same cookie you used for url2!
.method(Method.POST)
.execute();
loginUrl
是请求地址,在您的情况下为"http://www.klt.net.pl/index.php?a=logowanie"
。 userAgent
告诉服务器您的浏览器详细信息。data
是您在表单中输入所有输入字段的名称和值对的位置。 cookies
是您放置cookie的地方,您需要检查您的请求是否需要服务器接受cookie,这可以在“cookies”部分的网络选项卡中查看。在您的情况下,它与用于url2的cookie相同。method
指定您的请求方式。检索到的loginRes
对象将包含您需要的所有信息,HTML,Cookie和所有内容。
成功登录后,请确保将Cookie值存储在Map对象中,如下所示:
Map<String, String> cookies;
cookies.putAll(loginRes.cookies());
然后确保在以后的所有请求中将此cookies
传递给cookies参数,如下所示:
Connection.Response otherRes = Jsoup.connect(otherUrl).cookies(cookies)....
这将确保维护您的登录会话,并确保服务器知道您是经过身份验证的用户。
----------------更新------------
从doInBackground任务的开头声明Map cookie。然后在您提出每个请求后存储所有COOKIES 。所以:
cookies = response.cookies();
cookies.putAll(loginRes.cookies();
cookies.putAll(otherRes.cookies();