前言
該實現(xiàn)異常簡單,甚至都不能叫做爬蟲,并不需要任何的技術(shù),但是可以方便自己的生活,那就是有用的。
鑒于前面剛剛學(xué)習(xí)了JSoup來實現(xiàn)簡單的爬蟲,這次爬取了豆瓣同城的來為自己圖個方便。
事情是這樣的,每個周末我都習(xí)慣去豆瓣同城上去找一下有什么好看的攝影展或者畫展,但是呢,這樣的展覽相對較少,在豆瓣同城上去查找需要翻很多頁才能找到一個,還未必感興趣,于是尋思寫一個簡單的爬蟲為自己爬一下豆瓣同城的攝影和畫展的相關(guān)內(nèi)容,就方便多了。
實現(xiàn)
網(wǎng)頁分析
在簡單的爬蟲實現(xiàn)中,該步驟是最好費時間的,把每一個想要獲取的信息,找到他多對應(yīng)的元素,不多說。
因為我們是以找到同城的攝影展為主要目的的,因此我們可以直接從豆瓣同城-北京-展覽這個首頁開始爬取信息,這樣減少了爬取信息的數(shù)量,減小了難度。
F12查看豆瓣網(wǎng)頁源碼的時候,控制臺上打出這樣一句話:

對程序員的招聘,無孔不入啊。
爬取內(nèi)容
利用Jsoup獲取每一頁面的document然后在選擇出相應(yīng)的元素,得到想要的內(nèi)容,然后呈現(xiàn)在屏幕上就好了。
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);
}
篩選信息
我們目的主要是攝影,其次是畫展,而且信息嚴謹性不是很強,可能存在漏選的情況。
所以我做的很簡單,只是將標題和描述中的文字進行過濾,其中包含包含攝影相關(guān)的關(guān)鍵字的篩選出來。
應(yīng)對反爬
實際的爬蟲實現(xiàn)中,應(yīng)對反爬策略是很重要的一個環(huán)節(jié),例如我們不間斷的爬取豆瓣同城的話,連續(xù)幾次之后就會被封IP, 然后我們就看到了403錯誤,這個時候我們就需要用代理IP進行訪問了。
但因為本應(yīng)用并沒有頻繁爬取數(shù)據(jù)的需求,數(shù)據(jù)量也是較小,因此沒必要使用代理IP池的方式,打一槍換一炮,我們正常的每天只需要爬取一遍,我們只需要降低一下爬取的速度,每爬取一頁的內(nèi)容讓線程休眠一會,然后繼續(xù)爬取下一頁,這樣就降低了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


這個簡單的小應(yīng)用只是方便我個人的生活,花點小時間,倒是為自己節(jié)省了不少的時間。
DEMO地址:Github傳送門