我正在尝试提取网站的来源,我已经研究了一下,许多解决方案指向使用HTTPClient和HTTPContext,但问题是我无法使用URL来获取此源。我使用的网站基于登录,无论您登录的是谁,它都会显示相同的URL(但当然,要提取的信息因用户而异)。因此,我想知道是否有办法直接从webview或类似的东西获取源代码。总之,我不能使用URL中间,因为它是统一的,基本上重定向到一般的登录页面。
抱歉,如果我遗失了什么;我是新来的。感谢您的帮助。
编辑:
我找到了一个与用户不同的差异化网址 ,但有一个(其他)相关问题: 使用jsoup,我可以做Jsoup.connect(“http://www.stackoverflow.com/”)。get()。html(); (将URL替换为我正在尝试访问的内容)这确实得到了HTML源代码,但问题再次出现时,当我尝试访问受用户/密码保护的网站时,它会要求登录信息。我需要能够输入一次用户名和密码,并且基本上将其存储在某种临时的东西(cookies / cache?)中并保留jsoup的信息,以便每当我根据某个请求源时停止查询登录凭据URL。我仍然无法找到解决这个问题的方法......
答案 0 :(得分:1)
如果我理解正确(如果我没有,请告诉我):
如果用户/密码受到保护,您是否应该发出Http Post(例如您从浏览器中执行的操作)并从该帖子获取响应?像这样:
http://www.informit.com/guides/content.aspx?g=java&seqNum=44
编辑:这是一个示例
我有一个看起来像这样的页面(它过于简单了,但不过就是这样):
<form action="../../j_spring_security_check" method="post" >
<input id="j_username" name="j_username" type="text" />
<input id="j_password" name="j_password" type="password"/>
<input type="image" class="submit" id="login" name="login" />
</form>
如果它是一个网页,您必须提供用户名/密码才能在此登录页面之后“获取”实际内容。你真正发出的是这里的HTTP POST(我打赌你的情况也一样)。
现在以编程方式获得相同的功能......
你需要apache http客户端库(你可能没有它,但这是一种简单的方法)。这是它的maven依赖。你是为Android而去,对吗? apache http client是我读过的Android中的默认设置。
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
public class HttpPost {
public static void main(String[] args) {
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod("http://localhost:20000/moika/moika/j_spring_security_check");
postMethod.addParameter("j_username", "ACTUAL_USER");
postMethod.addParameter("j_password", "ACTUAL_PASSWORD");
try {
int status = httpClient.executeMethod(postMethod);
System.out.println("STATUS-->" + status);
if(status == 302){
Header header = postMethod.getResponseHeader("location");
String location = header.getValue();
System.out.println("HEADER_VALUE-->" + location);
GetMethod getMethod = new GetMethod(location);
httpClient.executeMethod(getMethod);
String content = getMethod.getResponseBodyAsString();
System.out.println("CONTENT-->" + content);
}
String contentInCaseOfNoRedirect = postMethod.getResponseBodyAsString();
} catch (Exception exception){
exception.printStackTrace();
}
}
}
这可能看起来很奇怪,但是我执行了重定向(302),在RCF中似乎存在问题,因此这是一个小问题。
如果您没有在服务器端执行任何重定向,那么您可以忽略我检查302的部分。
看看什么对你有用。
干杯, 尤金。
答案 1 :(得分:0)
请参阅http://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html
或查看示例代码
如何阅读网址内容
try{
URL oracle = new URL("http://www.w3schools.com/html/html_tables.asp");
URLConnection yc = oracle.openConnection();
InputStream is = yc.getInputStream();
String inputLine;
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}catch(Exception ex){
ex.printStackTrace();
}