Java用Jsoup解析爬取某房网的翻页的前五页图片--解决src取不到图片导致进入onerror标签的问题--使用data-original标签-图文加代码注释

昨天写了一篇基本爬虫,简单说一下翻页爬取,其实有些网站的翻页很简单,看地址栏变化可以了,有些页码都是在URL地址中体现出来的。文末附上源码,源码有详细注释。

简单说下今晚的实践以及遇到的问题:

今天爬取某房网的网址,先参观一下,地铁居然打成拼音,小同学不认真啊。

这里选定了两个条件筛选房源(只是不想后面下载太多图片),总数为141套,总共5页。可以看到图片放在img标签里面,看上去应该问题不大。

然后,我们通过分别点击1/2/3..页,看地址栏的变化,会发现很简单的规律:

页码的变化对应地址栏中URL的最后一位数字,那写个循环,地址栏的尾数从1变化到5就可以了。嗯,我也是这么做的。分页挺简单的吧,怎么爬取就不说了,结合上一篇文章和文末的源码看,源码都有注释,下面说说遇到的问题:

F12看下标签,按理说取img标签里的src属性就可以得到结果了。然而却是这样:

很显然不对啊,结果看上去像是错误的情况下的填充图片,事实上也是,跟img标签里的onerror属性的地址显示的是同一张图片。问题在哪儿呢,查阅了资料,得到原因:用了src欺骗手段,实际上网页展示的并不是src的地址,虽然src地址的图片是正确的,src欺骗倒是没听过,不过 data-original 是懒加载的必要属性,可以了解一下。所查阅的资料内容:

资料里的是"data-objurl",而我们实践的网站显示的url地址的属性为"data-original";

这样就拿到5页内容正常的图片了:

最后,附上源码:

maven还是只需要引入:

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

代码为一个class类:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;


public class SpiderFromXXXFangWithPage {
    public static void main(String[] args) throws IOException {
        String path = "e:/某房/";//存放文件夹的目录
        File file = new File(path);
        if (!file.exists()) {//如果文件夹不存在
            boolean mkOk = file.mkdir();//创建文件夹
            System.out.println("创建文件夹" + (mkOk ? "成功" : "失败"));
        }
        //存放所有网页的url地址
        List<String> allPics = new ArrayList<String>();
        //目标爬取的页数为5页
        for (int i = 0; i < 5; i++) {
            //地址记得修改
            String sourceUrl = "https://hangzhou.xxxxx.com/sale/b4-p14-f" + (i+1);//字符串拼接动态地址,最后一位代表页码
            List<String> pics = getOnePageUrls(sourceUrl);//获取一页图片url地址
            allPics.addAll(pics);
        }
        downloadPicture(allPics, path);//调用下面下载网站的方法
    }
    //获取一页图片url地址
    private static List<String> getOnePageUrls(String sourceUrl) throws IOException {
        Document doc = Jsoup.connect(sourceUrl).get();//获取整个DOM节点
        Elements links = doc.select("div#cycleListings.house-detail a[href] img[data-original]");//获取所有div#cycleListings.house-detail下面的img[src]标签
        List<String> pics = new ArrayList<String>();//集合存放所有图片链接
        for (Element element : links) {
            String src = element.attr("data-original");//获取这个属性的内容,也就是url了
            pics.add(src);
        }
        return pics;
    }

    //链接url下载图片
    private static void downloadPicture(List<String> urlList, String path) {
        int i = 0;//图片命名用
        for (String oneUrl : urlList) {
            URL url;
            try {
                url = new URL(oneUrl);
                DataInputStream dataInputStream = new DataInputStream(url.openStream());
                FileOutputStream fileOutputStream = new FileOutputStream(new File(path + (i+1) + ".jpg"));
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int length;
                while ((length = dataInputStream.read(buffer)) > 0) {
                    output.write(buffer, 0, length);
                }
                fileOutputStream.write(output.toByteArray());
                dataInputStream.close();
                fileOutputStream.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            i++;
        }
    }
}

本文原创,如需转载,请注明出处,谢谢

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用Javajsoup库从京东爬取商品图片代码示例: ```java import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class JdImageCrawler { public static void main(String[] args) throws IOException { String url = "https://search.jd.com/Search?keyword=手机"; List<String> imageUrls = getJdImageUrls(url); downloadImages(imageUrls); } /** * 从京东搜索结果页面获商品图片链接 * @param url 京东搜索结果页面的URL * @return 商品图片链接列表 * @throws IOException */ public static List<String> getJdImageUrls(String url) throws IOException { List<String> imageUrls = new ArrayList<>(); Document doc = Jsoup.connect(url).get(); Elements elements = doc.select(".gl-item .p-img img"); for (Element element : elements) { String imageUrl = element.attr("data-lazy-img"); if (imageUrl == null || imageUrl.isEmpty()) { imageUrl = element.attr("src"); } imageUrls.add(imageUrl.replace("/n9/", "/n1/")); } return imageUrls; } /** * 下载图片到本地 * @param imageUrls 商品图片链接列表 * @throws IOException */ public static void downloadImages(List<String> imageUrls) throws IOException { for (String imageUrl : imageUrls) { URL url = new URL(imageUrl); InputStream is = url.openStream(); String fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1); byte[] bytes = new byte[1024]; int len; try (FileOutputStream fos = new FileOutputStream(fileName)) { while ((len = is.read(bytes)) != -1) { fos.write(bytes, 0, len); } } } } } ``` 这个代码示例使用jsoup库从京东搜索结果页面获商品图片链接,并使用Java标准库下载这些图片到本地。注意,这个示例代码并没有处理异常情况,实际应用中需要入更多的错误处理和异常处理代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值