使用JSoup获取错误。为什么?

时间:2015-07-24 18:51:30

标签: java jsoup

我试图从fantasyfootball网站登录并提取数据。

我收到以下错误,

  

2015年7月24日下午8:01:12 StatsCollector主要   严重:空   org.jsoup.HttpStatusException:HTTP错误提取URL。状态= 403,网址= {{3}}       at org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:537)       at org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:493)       在org.jsoup.helper.HttpConnection.execute(HttpConnection.java:205)       在StatsCollector.main(StatsCollector.java:26)

每当我尝试这段代码时我哪里错了?

    public class StatsCollector {

    public static void main (String [] args){

        try {
            String url = "http://fantasy.premierleague.com/";
            Connection.Response response = Jsoup.connect(url).method(Connection.Method.GET).execute();

            Response res= Jsoup
                    .connect(url)
                    .data("ismEmail", "example@googlemail.com", "id_password", "examplepassword")
                    .method(Method.POST)
                    .execute();


            Map<String, String> loginCookies = res.cookies();

            Document doc = Jsoup.connect("http://fantasy.premierleague.com/transfers")
                    .cookies(loginCookies)
                    .get();

            String title = doc.title();
            System.out.println(title);
        }  

        catch (IOException ex) {
            Logger.getLogger(StatsCollector.class.getName()).log(Level.SEVERE,null,ex);
        }
    }

}

1 个答案:

答案 0 :(得分:1)

Response res= Jsoup
                .connect(url)
                .data("ismEmail", "example@googlemail.com", "id_password", "examplepassword")
                .method(Method.POST)
                .execute();

您是否尝试执行此实际代码?这似乎是一个带占位符而不是登录凭据的示例代码。这可以解释您收到的错误HTTP 403

编辑1

我的坏。我看了一下该网站上的登录表单,在我看来,你混淆了输入元素的id(“ismEmail”和“id_password”与name混淆了表格(“电子邮件”,“密码”)。这适合你吗?

Response res= Jsoup
                .connect(url)
                .data("email", "example@googlemail.com", "password", "examplepassword")
                .method(Method.POST)
                .execute();

编辑2

好吧,这是困在我的脑海中,因为使用JSoup登录网站不应该那么难。我在那里创建了一个帐户并为自己尝试过。代码优先:

 String url = "https://users.premierleague.com/PremierUser/j_spring_security_check";

        Response res = Jsoup
                .connect(url)
                .followRedirects(false)
                .timeout(2_000)
                .data("j_username", "<USER>")
                .data("j_password", "<PASSWORD>")
                .method(Method.POST)
                .execute();

        Map<String, String> loginCookies = res.cookies();

        Document doc = Jsoup.connect("http://fantasy.premierleague.com/squad-selection/")
                .cookies(loginCookies)
                .get();

那么这里发生了什么?首先我意识到,登录表单的目标是错误的。该页面似乎是在spring上构建的,因此表单属性和目标使用spring默认为j_spring_security_checkj_usernamej_password。然后我发生了读取超时,直到我设置了标志followRedirects(false)。我只能猜到为什么这有帮助,但也许这是对爬虫的保护?

最后,我尝试连接到小队选择页面,解析后的响应包含我的个人视图和数据。这段代码似乎对我有用,你会尝试一下吗?