JSOUP - Crawling Images&来自先前已爬网页面上的URL的文本

时间:2017-05-05 20:00:21

标签: java jsoup

我尝试使用Jsoup来创建一个爬虫程序......

  1. 转到网页(特别是像这样的公开发布的网页https://docs.google.com/spreadsheets/d/1CE9HTe2rdgPsxMHj-PxoKRGX_YEOCRjBTIOVtLa_2iI/pubhtml)并收集每个单元格中找到的所有href网址链接。
  2. 接下来,我希望它找到每个网页找到的网页,并抓取网址的标题和主要图片。
  3. 理想情况下,如果谷歌页面上的网址是例如特定的维基百科页面和赫芬顿邮报的文章,它会打印出如下内容:
  4.   
        
    1. 链接:https://en.wikipedia.org/wiki/Wolfenstein_3D
        标题:Wolfenstein 3D
        图片:https://en.wikipedia.org/wiki/Wolfenstein_3D#/media/File:Wolfenstein-3d.jpg

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

           
          

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

        
    4.   

    到目前为止,我已经使用此代码让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();
        }
      }
    }
    

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

对于维基页面,我们可以使用Jsoup提取标题,如下所示

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