一直有人问我是怎么拿网页的数据的,于是有了本文,其实很简单的,并没有用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.*? </a>";//取网址,去<.*?>, .
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(" ", "");
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查看的
上面用的几个提前的方法,我之后抽空搞了个工具类以方便实用,也在这里上传下