安卓Andriod使用入门(二十四)【爬取网络小说】
来源:互联网 发布:数据运营支持面试 编辑:程序博客网 时间:2024/05/16 07:45
人法地,地法天,天法道,道法自然。——老子
ConActivity.java
package siso.novelreader.activity;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.Window;import android.widget.Button;import android.widget.TextView;import siso.novelreader.R;import siso.novelreader.Utils.ParserWeb;import siso.novelreader.bean.NovalContentBean;/** * ============================================================================= * Describe : 文章内容 * ============================================================================== */public class ConActivity extends Activity { private NovalContentBean novalContentBean; private TextView tv_title; private TextView tv_name; private TextView tv_author; private TextView tv_time; private TextView tv_wd; private TextView tv_con; private Button bt_pre; private Button bt_next; //更新文章内容 private Handler mhandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 111) { tv_title.setText(novalContentBean.getTitle()); tv_name.setText(novalContentBean.getNovel_name()); tv_author.setText(novalContentBean.getAuthor()); tv_time.setText(novalContentBean.getTime()); tv_wd.setText(novalContentBean.getWdnumber()); tv_con.setText(novalContentBean.getNv_content().toString()); //如果上一章不存在 if (novalContentBean.getPre_link() == "" || novalContentBean.getPre_link() == null) { bt_pre.setVisibility(View.INVISIBLE); bt_pre.setClickable(false); } //如果下一章不存在 if (novalContentBean.getNext_link() == "" || novalContentBean.getNext_link() == null) { bt_next.setVisibility(View.INVISIBLE); bt_next.setClickable(false); } //上一章的点击事件 bt_pre.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(ConActivity.this,ConActivity.class); intent.putExtra("path",novalContentBean.getPre_link()); startActivity(intent); finish(); } }); //下一章的点击事件 bt_next.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(ConActivity.this,ConActivity.class); intent.putExtra("path",novalContentBean.getNext_link()); startActivity(intent); finish(); } }); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_content); tv_title = (TextView) findViewById(R.id.tv_title); tv_name = (TextView) findViewById(R.id.tv_name); tv_author = (TextView) findViewById(R.id.tv_author); tv_time = (TextView) findViewById(R.id.tv_time); tv_wd = (TextView) findViewById(R.id.tv_wd); tv_con = (TextView) findViewById(R.id.tv_con); bt_pre = (Button) findViewById(R.id.bt_pre); bt_next = (Button) findViewById(R.id.bt_next); final String path = getIntent().getStringExtra("path"); new Thread() { @Override public void run() { novalContentBean = ParserWeb.parser_nol(path); if (novalContentBean != null) { mhandler.sendEmptyMessage(111); } } }.start(); }}
MainActivity.java代码:
package siso.novelreader.activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.AdapterView;import android.widget.Button;import android.widget.ListView;import siso.novelreader.R;import siso.novelreader.Utils.ParserWeb;import siso.novelreader.adapter.NovelAdapter;import siso.novelreader.bean.NovelBean;import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.assist.ImageScaleType;import com.nostra13.universalimageloader.core.assist.QueueProcessingType;import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;import org.jsoup.Connection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.util.ArrayList;import java.util.List;import static android.util.Log.e;/** * ============================================================================= * Describe :主界面,通过Jsoup爬虫来获取网络小说 * ============================================================================== */public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); private ListView listView; private List<NovelBean> novels; private Handler mhandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 123) { //获取文章列表成功,更新listview listView.setAdapter(new NovelAdapter(MainActivity.this, novels, options)); } } }; private Button get_; private DisplayImageOptions options; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化ImageLoader这用的是universalimageloader库 ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(this) .diskCacheFileCount(100) .diskCacheFileNameGenerator(new Md5FileNameGenerator()) .diskCacheSize(30 * 1024 * 1024) .tasksProcessingOrder(QueueProcessingType.LIFO) .build(); //初始化Options options = new DisplayImageOptions.Builder() .cacheInMemory(true) .cacheOnDisk(true) .imageScaleType(ImageScaleType.EXACTLY) .displayer(new RoundedBitmapDisplayer(10)) .build(); ImageLoader.getInstance().init(configuration); listView = (ListView) findViewById(R.id.lv_content); } @Override protected void onResume() { super.onResume(); //从网页爬取数据 http_getnovel(); //listview的item点击事件 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { e(TAG, "onItemClick" + position); new Thread() { @Override public void run() { super.run(); NovelBean novelBean = novels.get(position); String url = novelBean.getNovel_path(); String path = ParserWeb.parser_web(url); Intent intent = new Intent(MainActivity.this, ConActivity.class); intent.putExtra("path", path); startActivity(intent); } }.start(); } }); } private void http_getnovel() {// <div class="detail" style="display: block;">// <em class="add jrsj_plus" bookId="609737"></em>// <a class="mark63" href="http://book.zongheng.com/book/609737.html" target="_blank"><img src="http://static.zongheng.com/upload/cover/2016/10/1476063094434.jpg" alt="不死龙帝" style="width: 63px; height: 84px;"><span></span></a>// <h3><a style="" href="http://book.zongheng.com/book/609737.html" title="奇幻玄幻: 不死龙帝" target="_blank">不死龙帝</a></h3>// <p>作者:<a href="http://t.zongheng.com/25467902" title="从小不爱吃香菜" target="_blank">从小不爱…</a></p>// <p>类型:<a href="http://book.zongheng.com/category/1.html" title="奇幻玄幻" target="_blank">奇幻玄幻</a></p>// <p class="tr"><a href="http://book.zongheng.com/book/609737.html" target="_blank">【阅读】</a></p>// <div class="cl0"></div>// </div> new Thread() { @Override public void run() { super.run(); try { //获取连接 Connection connect = Jsoup.connect("http://www.zongheng.com/category/3.html"); //设置超时 connect.timeout(10000); Document document = connect.get(); Elements detail = document.select("div.detail"); novels = new ArrayList<>(); for (Element element : detail) { String novel_image = element.getElementsByTag("img").first().attr("src"); String novel_name = element.getElementsByTag("h3").first().text(); Elements p_element = element.getElementsByTag("p"); String novel_autor = p_element.get(0).text(); String novel_type = p_element.get(1).text(); String novel_path = p_element.get(2).getElementsByTag("a").attr("href"); NovelBean novel = new NovelBean(novel_name, novel_type, novel_autor, novel_path, novel_image); novels.add(novel); } mhandler.sendEmptyMessage(123); } catch (Exception e) { e.printStackTrace(); } } }.start(); }}
NovelAdapter.java代码:
package siso.novelreader.adapter;import android.content.Context;import android.media.Image;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import siso.novelreader.R;import siso.novelreader.bean.NovelBean;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import java.util.List;/** * ============================================================================= * Describe : listview的列表 * ============================================================================== */public class NovelAdapter extends BaseAdapter { private Context context; private List<NovelBean> novels; private LayoutInflater inflater; private DisplayImageOptions options; public NovelAdapter(Context context, List<NovelBean> novels, DisplayImageOptions options) { this.context = context; this.novels = novels; this.options = options; inflater = LayoutInflater.from(context); } @Override public int getCount() { return novels.size(); } @Override public Object getItem(int position) { return novels.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { viewHolder = new ViewHolder(); convertView = inflater.inflate(R.layout.novel_item, null); viewHolder.imageView = (ImageView) convertView.findViewById(R.id.novel_image); viewHolder.name = (TextView) convertView.findViewById(R.id.name); viewHolder.type = (TextView) convertView.findViewById(R.id.type); viewHolder.author = (TextView) convertView.findViewById(R.id.author); viewHolder.path = (TextView) convertView.findViewById(R.id.path); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } //通过库加载图片 ImageLoader.getInstance().displayImage( novels.get(position).getNovel_image(), viewHolder.imageView, options); viewHolder.name.setText(novels.get(position).getNovel_name()); viewHolder.author.setText(novels.get(position).getNovel_autor()); viewHolder.type.setText(novels.get(position).getNovel_type()); viewHolder.path.setText("【阅读】"); return convertView; } class ViewHolder { ImageView imageView; TextView name; TextView author; TextView type; TextView path; }}
NovalContentBean.java代码:
package siso.novelreader.bean;import java.util.List;/** * ============================================================================= * Describe :文章对象 * ============================================================================== */public class NovalContentBean { private String title; private String novel_name; private String author; private String time; private String wdnumber; private List<String> nv_content; private String pre_link; private String next_link; public NovalContentBean() { } public NovalContentBean(String author, String next_link, String novel_name, List<String> nv_content, String pre_link, String title, String time, String wdnumber) { this.author = author; this.next_link = next_link; this.novel_name = novel_name; this.nv_content = nv_content; this.pre_link = pre_link; this.title = title; this.time = time; this.wdnumber = wdnumber; } public String getNovel_name() { return novel_name; } public void setNovel_name(String novel_name) { this.novel_name = novel_name; } public List<String> getNv_content() { return nv_content; } public void setNv_content(List<String> nv_content) { this.nv_content = nv_content; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getWdnumber() { return wdnumber; } public void setWdnumber(String wdnumber) { this.wdnumber = wdnumber; } public String getPre_link() { return pre_link; } public void setPre_link(String pre_link) { this.pre_link = pre_link; } public String getNext_link() { return next_link; } public void setNext_link(String next_link) { this.next_link = next_link; } @Override public String toString() { return "NovalContentBean{" + "author='" + author + '\'' + ", title='" + title + '\'' + ", novel_name='" + novel_name + '\'' + ", time='" + time + '\'' + ", wdnumber='" + wdnumber + '\'' + ", nv_content=" + nv_content + ", pre_link='" + pre_link + '\'' + ", next_link='" + next_link + '\'' + '}'; }}
NovelBean.java代码:
package siso.novelreader.bean;/** * ============================================================================= * Describe : 列表Item bean * ============================================================================== */public class NovelBean { private String novel_name; private String novel_image; private String novel_autor; private String novel_type; private String novel_path; public String getNovel_autor() { return novel_autor; } public void setNovel_autor(String novel_autor) { this.novel_autor = novel_autor; } public String getNovel_image() { return novel_image; } public void setNovel_image(String novel_image) { this.novel_image = novel_image; } public String getNovel_name() { return novel_name; } public void setNovel_name(String novel_name) { this.novel_name = novel_name; } public String getNovel_path() { return novel_path; } public void setNovel_path(String novel_path) { this.novel_path = novel_path; } public String getNovel_type() { return novel_type; } public void setNovel_type(String novel_type) { this.novel_type = novel_type; } public NovelBean() { } public NovelBean(String novel_name, String novel_type, String novel_autor, String novel_path, String novel_image) { this.novel_name = novel_name; this.novel_type = novel_type; this.novel_autor = novel_autor; this.novel_path = novel_path; this.novel_image = novel_image; } @Override public String toString() { return "NovelBean{" + "novel_autor='" + novel_autor + '\'' + ", novel_name='" + novel_name + '\'' + ", novel_image='" + novel_image + '\'' + ", novel_type='" + novel_type + '\'' + ", novel_path='" + novel_path + '\'' + '}'; }}
ParserWeb.java代码:
package siso.novelreader.Utils;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;import siso.novelreader.bean.NovalContentBean;import siso.novelreader.bean.NovelBean;import org.jsoup.Connection;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.IOException;import java.util.ArrayList;import java.util.List;import static android.util.Log.e;public class ParserWeb { private static final String TAG = ParserWeb.class.getSimpleName(); private static NovalContentBean novalContentBean; //解析书籍开始阅读地址 public static String parser_web(String url) { String attr = ""; try { e(TAG, "parser_web" + url); Document document = Jsoup.connect(url).get(); Elements book_btn = document.select("div.book_btn"); attr = book_btn.first().getElementsByTag("a").attr("href"); } catch (IOException e) { e.printStackTrace(); } return attr; } //解析文章内容,返回完整的文章对象 public static NovalContentBean parser_nol(String url) { NovalContentBean novalcon = new NovalContentBean(); List<String> con = new ArrayList<>(); try { Document novel = Jsoup.connect(url).get(); Elements read_con = novel.select("div.pane"); //<div class="tc txt"> //<h1><em itemprop="headline">序章 尸山之下</em></h1> //</div> String title = read_con.first().getElementsByTag("h1").text(); novalcon.setTitle(title); // e(TAG, "parser_nol" + title); Elements select = read_con.select("div.bread_crumb"); String novel_name = select.first().getElementsByTag("a").get(3).text(); novalcon.setNovel_name(novel_name); // e(TAG, "parser_nol:novel_name" + novel_name); String author = read_con.select("span.author").text(); novalcon.setAuthor(author); //e(TAG, "parser_nol!!!" + author); String time = read_con.select("span.number").text(); String[] strs = time.split("字"); novalcon.setTime(strs[0]); novalcon.setWdnumber("字" + strs[1]); // e(TAG, "parser_nol" + strs[0]); //e(TAG, "parser_nol::" + "字" + strs[1]); Elements select1 = read_con.select("div.content"); for (Element ele : select1) { String p = ele.getElementsByTag("p").text(); con.add(p); } novalcon.setNv_content(con); // e(TAG, "parser_nol" + con.toString() + "\n"); Elements select2 = read_con.select("div.tc"); Elements elements = select2.get(3).getElementsByTag("a"); Elements select3 = elements.select("a.marr"); String pre = ""; String next = ""; //判断是否存在上一章 if (select3.size() == 2) { pre = select3.first().attr("href"); } //判断是否存在下一章 Elements select4 = elements.select("a.next"); if (select4 != null) { next = select4.first().attr("href"); } // e(TAG, "parser_nol" + "pre"+pre+"next"+next); novalcon.setPre_link(pre); novalcon.setNext_link(next); } catch (IOException e) { e.printStackTrace(); } return novalcon; }}
项目运行结果如图:
0 0
- 安卓Andriod使用入门(二十四)【爬取网络小说】
- 安卓Andriod使用入门(十四)【滑动布局】
- 安卓Andriod使用入门(二十五)【爬新闻】
- 安卓Andriod使用入门(二)【高仿安卓微信6.0】
- 安卓Andriod使用入门(二十)【颜色对话框】
- 安卓Andriod使用入门(二十三)【百度地图API】
- 安卓Andriod使用入门(二十六)【记事本】
- 安卓Andriod使用入门(二十七)【点赞动画】
- 安卓Andriod使用入门(二十一)【视差效果引导页】
- 安卓Andriod使用入门(二十二)【漂亮酷炫的引导页】
- python爬虫爬取网络小说
- 安卓Andriod使用入门(一)【圆形Menu菜单】
- 安卓Andriod使用入门(三)【2048游戏】
- 安卓Andriod使用入门(四)【图片毛玻璃效果】
- 安卓Andriod使用入门(五)【分类侧滑菜单】
- 安卓Andriod使用入门(六)【动态GridView控件】
- 安卓Andriod使用入门(七)【Android日历控件】
- 安卓Andriod使用入门(八)【联动ListView】
- BZOJ2143——飞飞侠
- 新站如何快速获得关键词排名
- Lumen5.3.2无法使用composer的make:model命令
- 细胞分割相关参考资料
- 指针
- 安卓Andriod使用入门(二十四)【爬取网络小说】
- Caffe Model Zoo
- 【LeetCode】344. Reverse String
- (7)CSS动画-页面特效
- 解释为什么基于“推”的Gossip传播⽐基于“拉”的 Gossip传播要慢?
- http状态码--详解
- markdown学习
- c++用指针遍历一维数组和二维数组
- Linux笔记