闲来无事写一写拿网站做App数据数据的

一直有人问我是怎么拿网页的数据的,于是有了本文,其实很简单的,并没有用jsoup等框架

最近被一段改编的歌词迷住了,送给大家笑笑:三年滴等待,等待你老母个嗨 让我顶你个肺 铺你个街 在丢你老母嗨!

一起来看看需要些什么操作吧

1.首先拿到你要取数据的网址的url,通过访问获取当前网页的html。
2.把你或者到的html放到你喜欢的编码工具里格式一个,分析你所需要的数据在哪,并写正则提取
3.数据已经取到了,但是童鞋们这时候又会说了,我这只是取到了当前页啊,那我也要下一页等等啊,辣我么可以在分析下 取到下一页的url,然后就是重复之前的了,这样数据到手 ,你想咋展示就咋展示,

在这里我拿百度来举个栗子吧

让我们来看看百度的url

这里写图片描述

这是直接在浏览器搜索android产生的链接(你们可以多试试几个关键词,以便分析,我在这就不多做解释了),我们再点击下一页,看看下一页的uir


这里写图片描述

画风一变,我们发现url和之前的大不一样啊,咋办呢?

这里写图片描述

不急 看看我划线的位置 是不是似曾相识啊,其实我们只要抓住关键词,都能访问,要不咋叫百度呢。

然后我们知道了

1. 编码格式 ie=utf-8
2. 页码pn=
3. 关键词wd=

顺利拿到了当前页以及下一页,当然 有些小伙伴表示质疑,那么我们也可以查看html来看看下一页的url。看看所谓的pn是不是我们所需要的页码的字段

这里写图片描述

可以看到当我们定位第三页的位置时的html源码 pn=20的,我们再看看4的位置的html源码

这里写图片描述

由此我们可以得到,每次是以pn的数字没开始 往后取一页,也就是10条的,到这 我们url差不多搞完了,接下来就是分析html拿到你想要的了。


这里写图片描述

这里写图片描述

这是我之前业务需要做的百度提取的(关键词需要以UTF-8编码才行),这里我就偷个小小的懒,就用这个来说吧,下面是实现的核心代码

**(请自动忽略我那自带混淆的变量名)**

   Adapter_SearchCompany data;
    String aa = "<div class=\"opr-recommends-merge-content.*?</script></div></div>";//取相关1
    String aabb = "<span title=\".*?\">(.*?)</span>";//取相关1,有 其他 则跳出,无则显示
    String bb = "<div class=\"c-span4.*?'rsv_re_ename':'(.*?)','rsv_re_uri";//取相关2,括号就是要的
    String cc = "<div class=\"result c-container.*?</a></div></div>";//取整段
    String dd = "<h3 class=\"t.*?href.*?\"(.*?)\".*?target=.*?</a>.*?</h3>";//网址加标题,去除<.*?>即可
    String ee = "<div class=\"c-abstract.*?</div>";//取内容
    String ff = "<div class=\"f13.*?&nbsp;</a>";//取网址,去<.*?>,&nbsp.

    private void InitData(String html) {//html,就是我们拿到的源码
        html = html.replaceAll("\n", "").replaceAll("\r", "");
        if (jilv != 2) {// =1 表示下拉刷新,=2 表示上拉加载
            String straa = (String) StringCrypto.Getgroup(aa, html, -1);
            String bof=null;
            if (straa!=null){
             bof = (String) StringCrypto.Getgroup(aabb, straa, 1);}
            if (bof.contains("相关")) {
                //拿到相关的公司名
                listbb.addAll((List<String>) StringCrypto.GetString(bb, straa, -1));
            }
        }
        listcc.clear();
        listcc.addAll((List<String>) StringCrypto.GetListBd(cc, html));
        for (int i = 0; i < listcc.size(); i++) {
            String targetUrl = StringCrypto.Getgroup(dd, listcc.get(i), 1);
            String target = StringCrypto.Getgroup(dd, listcc.get(i), -1);
            target = target.replaceAll("<.*?>", "");
            String mContent = StringCrypto.Getgroup(ee, listcc.get(i), -1);
            mContent = mContent.replaceAll("<.*?>", "");
            String mUrl = StringCrypto.Getgroup(ff, listcc.get(i), -1);
            mUrl = mUrl.replaceAll("<.*?>", "").replaceAll("&nbsp", "");
            BeanSearchCompany bean = new BeanSearchCompany(target, mContent, mUrl, targetUrl);
            listbean.add(bean);
        }
        if (listbean.size() > 0) {
            lin_baidu.setVisibility(View.GONE);
        } else {
            lin_baidu.setVisibility(View.VISIBLE);
        }
        if (data == null) {
            data = new Adapter_SearchCompany(this, listbean, listbb);
            ListBaidu.setAdapter(data);
        } else {
            data.notifyDataSetInvalidated();
        }
        hideCustomProgressDialog();
        Response();
        btn_search.setClickable(true);

    }

以上就是核心代码了,就这么点 就可以拿到你想要的了,当然对于正则不太懂得小童鞋那就自行脑补一下吧,下面再贴下我用的几个方法和Bean类吧


    /**
     * @param mRegular 正则表达式
     * @param mContent 原字符串
     * @param qq       当qq等于0时,则是遇到相同就提取,不为零则是提取部分
     * @return 提取出来的内容
     */
    public static Object GetString(String mRegular, String mContent, int qq) {
        Pattern patternhref = Pattern.compile(mRegular,
                Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher matcher = patternhref.matcher(mContent);
        List<String> str = new ArrayList<>();
        while (matcher.find()) {
            if (qq == 1) {
                return matcher.group(qq).toString();
            } else if (qq == -1) {
                str.add(matcher.group(1));

            } else if (qq == 2) {
                str.add(matcher.group());
            } else {//>-1
                return matcher.group().toString();
            }
        }
        return str;
    }

    /**
     * 单个提取的子方法
     *
     * @param mRegular
     * @param qq       第几个
     * @return 所在的string
     */
    public static String Getgroup(String mRegular, String mContent, int qq) {
        Pattern patternhref = Pattern.compile(mRegular,
                Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher matcher = patternhref.matcher(mContent);
        String str=null;
        while (matcher.find()) {
            if (qq != -1) {
                str= matcher.group(qq);
            } else {
                str=matcher.group();
            }
        }
        return str;
    }

    /**
     * 单独去公司名的
     *
     * @param mRegular
     * @param mContent
     * @return
     */
    public static Object GetList(String mRegular, String mContent) {
        Pattern patternhref = Pattern.compile(mRegular,
                Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher matcher = patternhref.matcher(mContent);
        List<String> str = new ArrayList<>();
        while (matcher.find()) {
            str.add(matcher.group().toString().replaceAll("<.*?>", "").replaceAll("公司.*?", "公司"));
        }
        return str;
    }

    /**
     * 取百度相关的
     *
     * @param mRegular
     * @param mContent
     * @return
     */
    public static Object GetListBd(String mRegular, String mContent) {
        Pattern patternhref = Pattern.compile(mRegular,
                Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Matcher matcher = patternhref.matcher(mContent);
        List<String> str = new ArrayList<>();
        while (matcher.find()) {
            str.add(matcher.group().toString());
        }
        return str;
    }

Bean类,也就是我要取的数据

/**
 * TP0826 百度爬的
 * Created by 搬砖小能手 on 2017/4/11.
 * E-mail:[email protected].
 * Signature:当你的才华满足不了你的野心的时候,那么你应该静下心来学习.
 * Alert:语言的巨人,行动的矮子!
 */
public class BeanSearchCompany {
    private String target;
    private String mContent;
    private String mUrl;
    private String targetUrl;

以上就是所有的了,是不是很简单啊 小伙伴们,

还有就是你们分析html源码时候,可以在工具里看格式化的html,也可以在浏览器快速定位html位置分析,截张图表示下

这里写图片描述
这里是想分析蓝灯下面的东西 而定位html查看的


上面用的几个提前的方法,我之后抽空搞了个工具类以方便实用,也在这里上传下

Matcher正则处理工具类

这里写图片描述

发布了11 篇原创文章 · 获赞 24 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/feng40492459/article/details/76175876
今日推荐