java爬取闲鱼商品信息(二) - AaronLin的博客 - CSDN博客

有了需要爬取的起点队列。

接下来就可以细看一下源码中html的规则。

上面这一段就是一个商品在html源码中的结构。

这里面包含了,卖家头像,ID,vip等级,主页,各种图片,商品基本信息,地址等等东西

当然,我们不需要全部的信息,

我们只需要卖家ID,商品标题,内容,价格,发货地,成色,主页链接,图片链接,这样就够了。

我的思路是构造一段正则表达式来遍历整个网页源码,因为结构相似,我们可以抓取到商品的信息。

如果有更好的思路,欢迎指点或者互相交流。

如下

public static void patter_goods_andpage(String text){
        Pattern pattern=Pattern.compile("<div class=\"ks-waterfall\" data-spm=\"2007.1000337.16\">[\\s\\S]+?<div class=\"item-block item-idle sh-roundbox\">[\\s\\S]+?<div class=\"item-seller\">[\\s\\S]+?<div class=\"seller-avatar\">[\\s\\S]+?<a href=\"//s.2.taobao.com/list/list.htm\\?usernick=(.*?)\" target=\"_blank\" title=\"(.*?)\">[\\s\\S]+?(.*?)[\\s\\S]+?</a>[\\s\\S]+?</div>[\\s\\S]+?<div class=\"seller-nick\">(.*?)</div>[\\s\\S]+?<div class=\"seller-icons\">[\\s\\S]+?(.*?)[\\s\\S]+?</div>[\\s\\S]+?</div>[\\s\\S]+?<div class=\"item-info\">[\\s\\S]+?<div class=\"item-pic\">[\\s\\S]+?<a href=\"(.*?)\" (.*)</a>[\\s\\S]+?<span class=\"flag-item-new\">(.*)</span>[\\s\\S]+?</div>[\\s\\S]+?<div class=\"item-attributes\">[\\s\\S]+?<div class=\"item-price price-block\"><span class=\"price\"><b>¥</b><em>(.*?)</em></span></div>[\\s\\S]+?<div class=\"item-location\">(.*?)</div>[\\s\\S]+?</div>[\\s\\S]+?<div class=\"item-brief-desc\">(.*)</div>[\\s\\S]+?<div class=\"item-pub-info\">[\\s\\S]+?<span class=\"item-pub-time\">(.*)</span>[\\s\\S]+?(.*)</div>");
        Matcher matcher=pattern.matcher(text);
        while(matcher.find()){
            //System.out.println(matcher.group(0)+matcher.group(1)+matcher.group(2)+matcher.group(3)+matcher.group(4)+matcher.group(5)+matcher.group(6)+matcher.group(7));
            String goods_title=patter_temp(matcher.group(7));
            String goods_content=matcher.group(11);
            String saler_ID=matcher.group(2);
            String goods_url="https:"+matcher.group(6);
            double price=Double.parseDouble(matcher.group(9));
            String img_url="https:"+patter_img(matcher.group(7));
            String location=matcher.group(10);
            String condition=matcher.group(8);
            
            
            System.out.println("第"+goods_number+"件");
            System.out.println("卖家:"+saler_ID);
            System.out.println("商品标题:"+goods_title);
            System.out.println("内容:"+goods_content);
            System.out.println("价格:"+price);
            System.out.println("地址:"+location);
            System.out.println("链接地址:"+goods_url);
            System.out.println("图片链接:"+img_url);
            System.out.println("成色:"+condition);
            System.out.println("-----------------------------");
            goods_number++;
            
            mysqlCon.insert_xianyu(goods_title, goods_content, saler_ID, price, location, sort, img_url, condition,goods_url);
        }}

可以看到这是一段非常非常非常长的正则表达式,也包括了许多(.)和(.?)之类的。这么长的正则表达式不知道是否会影响效率,但是目前看来它是起了预期的作用的。

顺带一说,值得注意的是,这里使用了

>[\s\S]+?

代替了标签之间的空格和换行符,否则会更加长。

这我们就实现了对页面中商品信息的抓取。

还有一个就是关于翻页的问题,很容易发现,闲鱼的翻页和url有密切联系,并不是复杂的js动态翻页什么的。

我们直接拉到源码最下面

可以看到需要的链接,然后

没错,又是一个正则表达式。

我们修改一下上一个函数,让他可以运行后返回下一页url

public static String patter_goods_andpage(String text){
        Pattern pattern=Pattern.compile("<div class=\"ks-waterfall\" data-spm=\"2007.1000337.16\">[\\s\\S]+?<div class=\"item-block item-idle sh-roundbox\">[\\s\\S]+?<div class=\"item-seller\">[\\s\\S]+?<div class=\"seller-avatar\">[\\s\\S]+?<a href=\"//s.2.taobao.com/list/list.htm\\?usernick=(.*?)\" target=\"_blank\" title=\"(.*?)\">[\\s\\S]+?(.*?)[\\s\\S]+?</a>[\\s\\S]+?</div>[\\s\\S]+?<div class=\"seller-nick\">(.*?)</div>[\\s\\S]+?<div class=\"seller-icons\">[\\s\\S]+?(.*?)[\\s\\S]+?</div>[\\s\\S]+?</div>[\\s\\S]+?<div class=\"item-info\">[\\s\\S]+?<div class=\"item-pic\">[\\s\\S]+?<a href=\"(.*?)\" (.*)</a>[\\s\\S]+?<span class=\"flag-item-new\">(.*)</span>[\\s\\S]+?</div>[\\s\\S]+?<div class=\"item-attributes\">[\\s\\S]+?<div class=\"item-price price-block\"><span class=\"price\"><b>¥</b><em>(.*?)</em></span></div>[\\s\\S]+?<div class=\"item-location\">(.*?)</div>[\\s\\S]+?</div>[\\s\\S]+?<div class=\"item-brief-desc\">(.*)</div>[\\s\\S]+?<div class=\"item-pub-info\">[\\s\\S]+?<span class=\"item-pub-time\">(.*)</span>[\\s\\S]+?(.*)</div>");
        Matcher matcher=pattern.matcher(text);
        while(matcher.find()){
            //System.out.println(matcher.group(0)+matcher.group(1)+matcher.group(2)+matcher.group(3)+matcher.group(4)+matcher.group(5)+matcher.group(6)+matcher.group(7));
            String goods_title=patter_temp(matcher.group(7));
            String goods_content=matcher.group(11);
            String saler_ID=matcher.group(2);
            String goods_url="https:"+matcher.group(6);
            double price=Double.parseDouble(matcher.group(9));
            String img_url="https:"+patter_img(matcher.group(7));
            String location=matcher.group(10);
            String condition=matcher.group(8);
            
            
            System.out.println("第"+goods_number+"件");
            System.out.println("卖家:"+saler_ID);
            System.out.println("商品标题:"+goods_title);
            System.out.println("内容:"+goods_content);
            System.out.println("价格:"+price);
            System.out.println("地址:"+location);
            System.out.println("链接地址:"+goods_url);
            System.out.println("图片链接:"+img_url);
            System.out.println("成色:"+condition);
            System.out.println("-----------------------------");
            goods_number++;
            
            mysqlCon.insert_xianyu(goods_title, goods_content, saler_ID, price, location, sort, img_url, condition,goods_url);
        }
        
        //-----pagenumber
        Pattern pattern_page=Pattern.compile("<a class=\"paginator-next\" href=\"(.*?)\" hidefocus=\"true\">下一页<span class=\"paginator-arrow-right\"></span>");
        Matcher matcher_page=pattern_page.matcher(text);
        String nextpage_url;
        if (matcher_page.find()) {
            nextpage_url="https:"+matcher_page.group(1).replace("amp;", "");
            System.out.println(nextpage_url);
        } else {
            nextpage_url="nothing";
        }
        return nextpage_url;
    }

写到这我发现了个问题,一个页面只能抓20条,显然一个页面不止20个商品

在这里,加载下面的商品使用了js动态加载,所以我们的获取源码方式要修改一下。

接下篇


Original url: Access
Created at: 2019-06-24 16:24:04
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论