Android笔记之JSoup爬取豆瓣同城

前言

该实现异常简单,甚至都不能叫做爬虫,并不需要任何的技术,但是可以方便自己的生活,那就是有用的。

鉴于前面刚刚学习了JSoup来实现简单的爬虫,这次爬取了豆瓣同城的来为自己图个方便。
事情是这样的,每个周末我都习惯去豆瓣同城上去找一下有什么好看的摄影展或者画展,但是呢,这样的展览相对较少,在豆瓣同城上去查找需要翻很多页才能找到一个,还未必感兴趣,于是寻思写一个简单的爬虫为自己爬一下豆瓣同城的摄影和画展的相关内容,就方便多了。

实现

网页分析

在简单的爬虫实现中,该步骤是最好费时间的,把每一个想要获取的信息,找到他多对应的元素,不多说。
因为我们是以找到同城的摄影展为主要目的的,因此我们可以直接从豆瓣同城-北京-展览这个首页开始爬取信息,这样减少了爬取信息的数量,减小了难度。

F12查看豆瓣网页源码的时候,控制台上打出这样一句话:

Paste_Image.png

对程序员的招聘,无孔不入啊。

爬取内容

利用Jsoup获取每一页面的document然后在选择出相应的元素,得到想要的内容,然后呈现在屏幕上就好了。

 document = Jsoup.connect("https://beijing.douban.com/events/week-exhibition?start=" + index + "0")
//                                .proxy("222.74.225.231",3128)
//                                .proxy("118.144.149.200",3128)
                                .timeout(10000)
                                .get();
                        Elements li = document.select("li.list-entry");
                        if (li.size() == 0) {
                            break;
                        }

                        for (Element element : li) {
                            Elements meta = element.select("ul.event-meta");
                            if (meta.toString().equals("")) {
                                continue;
                            }
                            LocalBean bean = new LocalBean();
                            bean.setImgURL(element.select("img").attr("data-lazy")); // 图片链接
                            bean.setTitle(element.select("div.title").select("a").attr("title"));//标题
                            bean.setURL(element.select("div.title").select("a").attr("href"));//链接

                            Elements tagElements = element.select("p.event-cate-tag hidden-xs").select("a");
                            if (!tagElements.toString().equals("")) {
                                for (int i = 0; i<tagElements.size() ; i++){
                                    bean.setTag(tagElements.get(i).text());
                                }
                            }
                            bean.setTime(meta.select("li.event-time").text());
                            bean.setLocation(meta.select("li").get(1).text());
                            bean.setCost(meta.select("li.fee").select("strong").text());

                            if (!bean.isWanted()) {
                                continue;
                            }

                            System.out.println("***************************");
                            System.out.println(bean.getTitle());
                            System.out.println(bean.getTime());
                            System.out.println(bean.getImgURL());
                            System.out.println(bean.getURL());
                            System.out.println(bean.getLocation());
                            System.out.println(bean.getCost());
                            System.out.println(bean.getTag());

                            mBeans.add(bean);
                        }
筛选信息

我们目的主要是摄影,其次是画展,而且信息严谨性不是很强,可能存在漏选的情况。

所以我做的很简单,只是将标题和描述中的文字进行过滤,其中包含包含摄影相关的关键字的筛选出来。

应对反爬

实际的爬虫实现中,应对反爬策略是很重要的一个环节,例如我们不间断的爬取豆瓣同城的话,连续几次之后就会被封IP, 然后我们就看到了403错误,这个时候我们就需要用代理IP进行访问了。
但因为本应用并没有频繁爬取数据的需求,数据量也是较小,因此没必要使用代理IP池的方式,打一枪换一炮,我们正常的每天只需要爬取一遍,我们只需要降低一下爬取的速度,每爬取一页的内容让线程休眠一会,然后继续爬取下一页,这样就降低了IP被封的几率。

05-09 18:52:03.669 20699-25842/com.jiesean.exhibitionspider W/System.err: org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=https://beijing.douban.com/events/week-exhibition?start=1890
05-09 18:52:03.670 20699-25842/com.jiesean.exhibitionspider W/System.err:     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:590)
05-09 18:52:03.671 20699-25842/com.jiesean.exhibitionspider W/System.err:     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:540)
05-09 18:52:03.671 20699-25842/com.jiesean.exhibitionspider W/System.err:     at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:227)
05-09 18:52:03.671 20699-25842/com.jiesean.exhibitionspider W/System.err:     at org.jsoup.helper.HttpConnection.get(HttpConnection.java:216)
05-09 18:52:03.671 20699-25842/com.jiesean.exhibitionspider W/System.err:     at com.jiesean.exhibitionspider.MainActivity$3.run(MainActivity.java:104)
05-09 18:52:03.671 20699-25842/com.jiesean.exhibitionspider W/System.err:     at java.lang.Thread.run(Thread.java:761)

Demo


这个简单的小应用只是方便我个人的生活,花点小时间,倒是为自己节省了不少的时间。

DEMO地址:Github传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容