【问题标题】:JSOUP - Crawling Images & Text from URLs Found on a Previously Crawled PageJSOUP - 从先前抓取的页面上找到的 URL 抓取图像和文本
【发布时间】:2017-10-04 09:44:45
【问题描述】:

我正在尝试使用 Jsoup 创建一个爬虫,它将...

  1. 转到一个网页(具体来说,一个像 https://docs.google.com/spreadsheets/d/1CE9HTe2rdgPsxMHj-PxoKRGX_YEOCRjBTIOVtLa_2iI/pubhtml 这样的 google 表格公开发布的页面)并收集在每个单元格中找到的所有 href url 链接。
  2. 接下来,我希望它转到找到该页面的每个单独的 url,并抓取该 url 的标题和主图像。
  3. 理想情况下,例如,如果 google 表格页面上的 url 是特定的 Wikipedia 页面和 Huffington Post 文章,它会打印出如下内容:
  1. 链接:https://en.wikipedia.org/wiki/Wolfenstein_3D
    标题:德军总部 3D
    图片:https://en.wikipedia.org/wiki/Wolfenstein_3D#/media/File:Wolfenstein-3d.jpg

  2. 链接:http://www.huffingtonpost.com/2012/01/02/ron-pippin_n_1180149.html
    标题:Ron Pippin 的神话档案包含一切的历史(照片)
    图片:http://i.huffpost.com/gen/453302/PIPPIN.jpg

    (请原谅网址中的空格。显然我不希望爬虫添加空格并分解网址......堆栈溢出只是不允许我在这个问题中发布更多链接)

到目前为止,我已经使用以下代码让 jsoup 为第一步工作(从初始 url 中提取链接):

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class mycrawler {
   public static void main(String[] args) {
     Document doc;
        try {
            doc = Jsoup.connect("https://docs.google.com/spreadsheets/d/1CE9HTe2rdgPsxMHj-PxoKRGX_YEOCRjBTIOVtLa_2iI/pubhtml").get();
            Elements links = doc.select("a[href]");
            for (Element link : links) {          
                    System.out.println(link.text());
            }
       } catch (IOException e) {
            e.printStackTrace();
    }
  }
}

我现在无法弄清楚如何创建爬虫的第二个方面,它循环遍历每个链接(可能是可变数量的链接)并从中找到标题和主图像。

【问题讨论】:

    标签: java jsoup


    【解决方案1】:
    public static void main(String[] args) {
        Document doc;
        String url = "https://docs.google.com/spreadsheets/d/1CE9HTe2rdgPsxMHj-PxoKRGX_YEOCRjBTIOVtLa_2iI/pubhtml";
        try {
            doc = Jsoup.connect(url).get();
            Elements links = doc.select("a[href]");
            for (Element link : links) {
                String innerurl = link.text();
    
                if (!innerurl.contains("://")) {
                    continue;
                }
                System.out.println("*******");
                System.out.println(innerurl);
    
                Document innerDoc = Jsoup.connect(innerurl).get();
                Elements headerLinks = innerDoc.select("h1");
                for (Element innerLink : headerLinks) {
                    System.out.println("Headline : " + innerLink.text());
                }
    
                Elements imgLinks = innerDoc.select("img[src]");
                for (Element innerLink : imgLinks) {
                    String innerImgSrc = innerLink.attr("src");
    
                    if(innerurl.contains("huffingtonpost") && innerImgSrc.contains("i.huffpost.com/gen")){                      
                        System.out.println("Image : " + innerImgSrc);
                    }
                    if(innerurl.contains("wikipedia")) {
    
                        Pattern pattern =   Pattern.compile("(jpg)$", Pattern.CASE_INSENSITIVE);
                        Matcher matcher =   pattern.matcher(innerImgSrc);
                        if(matcher.find()){
                            System.out.println("Image : " + innerImgSrc);
                            break;
                        }
    
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    Output

    *******
    https://en.wikipedia.org/wiki/Wolfenstein_3D
    Headline : Wolfenstein 3D
    Image : //upload.wikimedia.org/wikipedia/en/0/05/Wolfenstein-3d.jpg
    *******
    http://www.huffingtonpost.com/2012/01/02/ron-pippin_n_1180149.html
    Headline : Ron Pippin's Mythical Archives Contain History Of Everything (PHOTOS)
    Image : http://i.huffpost.com/gen/453302/PIPPIN.jpg
    Image : http://i.huffpost.com/gen/453304/PIPSHIP.jpg
    

    【讨论】:

    • 嘿德文德拉!感谢这一点,它在一些调整后效果很好!显然,我不能为所有事情制定一般规则,并且必须为可能出现在电子表格中的赫芬顿邮报和维基百科之外的其他网站制定额外的规则(对吗?)。您如何指定“对于来自____网站的所有文章,选择符合条件的第二张图片”之类的内容?如果来自特定网站的图片 URL 隐藏在 div 类而不是 img src 中,你会怎么做?
    • @TylerSobel-Mason,你可能想做Element img = doc.select("div.picture img").first();之类的事情。参考这个SO ans
    • 嘿 Devendra - 如果你不介意最后一个问题 - 我一直在尝试你上面所说的关于 .first(). 的内容,它并没有真正起作用,因为它会提取找到的第一张图像,然后检查if 语句中的模式只有该图像。有没有办法返回它在运行 if 语句之后 找到的第一个响应?
    【解决方案2】:

    我认为您应该使用link.attr("href") 而不是link.text() 获取链接的href 属性。 (在页面中显示的文本和基础href不同)跟踪列表的所有链接并在第二步中迭代该列表以获得相应的Document,您可以从中提取标题和图像URL。

    对于 wiki 页面,我们可以提取带有 Jsoup 的标题,如下所示

    Element heading = document.select("#firstHeading").first();
    System.out.println("Heading : " + heading.text()); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 2017-02-12
      相关资源
      最近更新 更多