【问题标题】:Url is not returning the correct html in a webpage (for my Java crawler)网址未在网页中返回正确的 html(对于我的 Java 爬虫)
【发布时间】:2016-08-16 12:22:13
【问题描述】:

我想从网页下载一些图片,因为我正在编写一个爬虫。我为此页面测试了几个爬虫,但没有一个能达到我想要的效果。

第一步,我收集了770+相机型号的链接(parent_url),然后我想在每个链接中收集图像(child_urls)。但是,页面的组织方式是 child_urls 返回与 parent_url 相同的 html。

这是我收集相机链接的代码:

public List<String> html_compiler(String url, String exp, String atr){
    List<String> outs = new ArrayList<String>(); 
    try {
        Document doc = Jsoup.connect(url).get();

        Elements links = doc.select(exp);
        for (Element link : links) {
            outs.add(link.attr(atr));
            System.out.println("\nlink : " + link.attr(atr));
        }
    } catch (IOException | SelectorParseException e) {
        e.printStackTrace();
    }
    return outs;
}

使用此代码,我收集链接

String expCam = "tr[class='gallery cameras'] > td[class='title'] > a[href]";
String url = "https://www.dpreview.com/sample-galleries?category=cameras";
String atr = "href";
List<String> cams = html_compiler(url, exp, atr); // This gives me the links of individual cameras

String exp2 = "some expression";
html_compiler(cams.get(0), exp2, "src"); // --> this should give me image links of the first
                                         //camera but webpage returns same html as above

我该如何解决这个问题?我很想听听根据相机型号对图像进行分类的其他页面。 (Flickr 除外)

编辑: 例如在 java 中,以下两个链接给出了相同的 html。

https://www.dpreview.com/sample-galleries?category=cameras

https://www.dpreview.com/sample-galleries/2653563139/nikon-d1-review-samples-one

【问题讨论】:

  • 您可以尝试使用abs:href attr 吗? Take a look here for an example.
  • @DavidePastore 都返回相同的结果,我认为这与绝对链接无关。
  • 第二个链接似乎在加载图片的浏览器中触发了一些 javascript。尝试在浏览器中使用调试工具打开这两个链接。 (firefox中ctrl+shift+Q)你要找出图片链接是如何在页面源中某处创建的。
  • 听起来网络服务器可能正在做一些奇怪的事情。两个链接返回相同的 HTML 是没有意义的,除非:1) URL 无效并且您看到的是 404 页面响应,2) 该站点是 SPA(单页应用程序),在这种情况下,所有URL 很可能会返回应用程序,或者 3) Web 服务器正在过滤用户代理以防止机器人。对于 1,您需要修复您的 URL。对于 2,不确定您需要做什么,但我怀疑这是问题所在。对于 3,您可以“欺骗”您的用户代理,看看是否有帮助。
  • 对我上一条评论的一点更新:第一页上的链接有三个附加的 javascript 事件处理程序。其中一个创建了一个SampleGalleryV2,它控制图片库的行为。搜索链接到该页面的 javascript 文件以获取详细信息。

标签: java web-crawler jsoup data-collection


【解决方案1】:

要了解如何获取图片链接,了解页面在浏览器中的加载方式非常重要。如果您单击画廊链接,将触发一个 javascript 事件处理程序。创建的图像查看器然后从数据服务器加载图像。图片链接是通过 javascript 请求的,因此仅通过解析 html 是不可见的。图片链接的请求 URL 是 https://www.dpreview.com/sample-galleries/data/get-gallery 要获取画廊中的图片,您必须添加画廊 ID。画廊 ID 由画廊链接的 href 属性提供。链接看起来像https://www.dpreview.com/sample-galleries/2653563139/nikon-d1-review-samples-one。在这种情况下,2653563139 是画廊 ID。获取上面给出的链接,并将带有?galleryId=2653563139 的画廊 ID 添加到 URL 的末尾,以获取包含创建画廊所需的所有数据的 json 对象。在images 数组中查找url 字段以获取您的图像。

总结一下:

您从href 属性获得的链接:https://www.dpreview.com/sample-galleries/2653563139/nikon-d1-review-samples-one

画廊编号:2653563139

请求地址:https://www.dpreview.com/sample-galleries/data/get-gallery

你需要的json对象:https://www.dpreview.com/sample-galleries/data/get-gallery?galleryId=2653563139

您在 json 对象中查找的 url:"url":"https://3.img-dpreview.com/files/p/TS1800x1200~sample_galleries/2653563139/7864344228.jpg"

最后是你的图片链接:https://3.img-dpreview.com/files/p/TS1800x1200~sample_galleries/2653563139/7864344228.jpg

如果您需要进一步解释,请发表评论。

【讨论】:

  • 这是非常好的解释。链接中的图像数量与图库链接中给出的数量相匹配,因此它似乎是非常可靠的解决方案。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
相关资源
最近更新 更多