【问题标题】:Web Scraping From .asp URLs从 .asp URL 抓取网页
【发布时间】:2018-02-02 02:01:27
【问题描述】:

我正在尝试从site 中提取不同机场之间航线上的数据。用户打算选择两个机场,然后程序将向他们显示给定日期的所有不同路线。只是,在站点上搜索路由后,无论您查看的是什么路由,URL 都会更改为相同的 .asp 域名。有没有办法在不知道 URL 的情况下从特定路由中抓取数据,或者有没有办法获取真实的 URL?

【问题讨论】:

  • 所以我试图理解。您需要发布原始 GET 请求来检索给定结果吗?

标签: java asp.net url web-scraping


【解决方案1】:

我建议为此使用 JSoup。为此,请在下方添加pom.xml

<dependency>
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.11.2</version>
</dependency>

然后你触发第一个请求以获取 cookie

    Connection.Response initialPage = Jsoup.connect("https://www.flightview.com/flighttracker/")
            .headers(headers)
            .method(Connection.Method.GET)
            .userAgent(userAgent)
            .execute();
    Map<String, String> initialCookies = initialPage.cookies();

然后您使用这些 cookie 触发下一个请求

    Connection.Response flights = Jsoup.connect("https://www.flightview.com/TravelTools/FlightTrackerQueryResults.asp")
            .userAgent(userAgent)
            .headers(headers)
            .data(postData)
            .cookies(initialCookies)
            .method(Connection.Method.POST)
            .execute();

postDataheaders 在这种情况下是

    HashMap<String, String> postData = new HashMap<String, String>();
    HashMap<String, String> headers = new HashMap<String, String>();

    headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
    headers.put("Accept-Encoding", "gzip, deflate, br");
    headers.put("Accept-Language", "en-US,en;q=0.9");
    headers.put("Cache-Control", "no-cache");
    headers.put("DNT", "1");
    headers.put("Pragma", "no-cache");
    headers.put("Upgrade-Insecure-Requests", "1");

    postData.put("qtype", "cpi");
    postData.put("sfw", "/FV/FlightTracker/Main");
    postData.put("namdep", "DFW Dallas, TX (Dallas/Ft Worth) - Dallas Fort Worth International");
    postData.put("depap", "DFW");
    postData.put("namarr", "JFK New York, NY (Kennedy) - John F Kennedy International");
    postData.put("arrap", "JFK");
    postData.put("namal2", "Enter name or code");
    postData.put("al", "");
    postData.put("whenArrDep", "dep");
    postData.put("whenHour", "all");
    postData.put("whenDate", "20180321");
    postData.put("input", "Track Flight");

现在,当您获得数据后,您可以从中解析和打印内容

    String page = flights.body();
    System.out.println(page);
    Document doc = Jsoup.parse(page);
    Elements elems = doc.select("tr.FlightTrackerListRowOdd, tr.FlightTrackerListRowEven");

    for(Element element : elems) {
        Elements childElems = element.select("td");
        String text1 =  childElems.get(0).text();
        String text2 =  childElems.get(1).text();
        System.out.println(text1 + " " + text2);
    }

同样的输出是

Aeroflot Airlines 3453
Aeroflot Airlines 3455
AeroMexico 4966
AeroMexico 4935
Air France 2535
Alitalia 3403
American Airlines 1294
British Airways 1880
China Eastern Airlines 8804
Delta Air Lines 3869
Delta Air Lines 3789
Etihad Airways 3040
Finnair 5726
Gulf Air 4139
Iberia Airlines 4043
Jet Airways 7692
KLM Royal Dutch Airlines 6597
KLM Royal Dutch Airlines 8117
Korean Air 7326
Malaysia Airlines 9442
Qatar Airways 5107
TAM Brazilian Airlines 8379
Virgin Atlantic 4620
Virgin Atlantic 3471

休息,您可以根据需要开始更改相同的内容。这向您展示了如何做到这一点的示例

【讨论】:

  • 我认为你有一个错误的依赖,JsonPath 而不是 Jsoup
【解决方案2】:

在浏览器中打开开发者工具,在搜索框中提交到达目的地信息并提交。

然后,如果您检查浏览器发送到服务器的请求,您会注意到您刚刚提交的带有表单数据的发布请求被发送到https://www.flightview.com/TravelTools/FlightTrackerQueryResults.asp

如果你想抓取这些数据,那么你可以使用 python requests 模块向这个 url 发送一个发布请求。

注意:由于您使用的是 java,因此仍然可以发送简单的 post 请求。您可以查看如何发送帖子请求here

【讨论】:

  • 感谢您的回复,但我应该澄清一下:这需要在 Java 程序中完成。
  • @BobSmith 我已经修改了java请求的答案
  • 我不确定我是否了解如何发送 java 发布请求,即使在检查了您提供给我的链接中的答案之后也是如此。最佳答案使用 Apache,我不想使用它,并且以下所有答案似乎都在站点中输入了用户名和密码以发送发布请求。我最终想要做的就是阅读 .asp 页面上的信息,以便用户可以查看给定日期这些目的地之间的所有航班。感谢您的回答,我只是担心我不知道如何尝试您的解决方案。
  • 如果不是太麻烦,您能否解释一下我如何实际发送一个 java 发布请求,以便从这个 .asp 保护域中读取数据。恐怕我只是不明白您提供的链接给出的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多