004-綜合應用-《美食趨勢》

綜合應用-《美食趨勢》

前言

最近事情比較多,一直沒找出時間繼續寫東西,抱歉。
後面準備綜合前面的東西寫一個小應用。經過圖片抓取獲取美食資源,而後美食信息進行展現和數據分析。html

需求功能整理

小呂最近胃口很差,吃啥啥不香,日益消瘦。小貂看在眼裏,疼在內心,甚至懷疑是否是本身的飯已經被吃夠了,甚是傷心。一天她把本身的擔心跟小諸葛說了,小諸葛輕輕搖扇說,這個好辦,咱們蜀氏集團出個菜譜,只要按照這個菜譜高的作,保準你家小呂吃的開心。
小諸葛回到公司後,把狀況給你們說,理出一個大概的思路:小呂不愛吃飯-->小貂作的很差吃-->小貂不知道作啥好吃-->蜀氏集團可否提供美食參考?美食參考須要怎麼作才能達到目的?你們討論後,一致贊成先出一個雛形,討論雛形結果以下
git

數據設計

數據結構
github

功能實現

1. 定時抓取數據

小趙接手定時任務計劃,他決定採用spring-task,就像把大象放到冰箱同樣簡單。引用依賴-->配置spring task--> 定時註解。
a. 引用依賴spring-webmvc已經把task的依賴包含了。只引用下一下個便可web

...
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
...

b. 配置spring,注意xml必定要聲明taskajax

<beans xmlns="http://www.springframework.org/schema/beans"
    ...
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                       ...
                           http://www.springframework.org/schema/task
                           http://www.springframework.org/schema/task/spring-task-4.0.xsd">
    ... 
    <context:component-scan base-package="org.sl.food">
        <context:exclude-filter type="annotation"
            expression="org.springframework.stereotype.Controller" />
    </context:component-scan>                   
    ...
    <task:annotation-driven executor="executor" scheduler="scheduler" proxy-target-class="true" />
     <task:executor id="executor" pool-size="5" />
     <task:scheduler id="scheduler" pool-size="10" />
    ...
</beans>

c. 定時註解,定時表達式採用cron表達式spring

package org.sl.food.task;
...
@Component
public class FoodCrawlTask {
@Scheduled(cron = "0/5 * *  * * ?")
    public void foodCrawl() {
        ...
    }
    ...
}

如今乍聽特別高大上的定時任務功能就這麼完成了,只要定時去獲取數據就行啦,剩下的交給別人吧。express

2. 解析數據入庫

小張表面看着滿臉橫肉,鬍子比頭髮還長。怎麼看都感受是個大大咧咧,易燃易爆品。正是這人,非想作須要細心,耐心的活;想改變人們對他的見解。怎麼作呢,怎麼把瀏覽器看到的數據轉換成固定結構的數據呢?首先須要有數據,這個小趙已經完成;其次須要解析數據,jsoup,專門解析html數據,這個算是解決;剩下的對應數據了,id,name,菜譜地址,圖片……這麼多,關鍵小趙給的數據,還不能徹底知足,須要額外的數據,這可咋整,可是小張不能急!!!怎麼能快速的取到我想要的值呢?瀏覽器能夠用jQuery,什麼?jsoup支持jQuery語法?!。瀏覽器

...
        Elements el = doc.select("#listtyle1_list .listtyle1 a.big");
        logger.debug("{}", el);
        List<FoodEntity> foodList = new LinkedList<>();
        for (Element e : el) {
            FoodEntity food = new FoodEntity();
            food.setUpdateTime(new Date());
            food.setName(e.attr("title"));
            food.setDetailsSite(e.attr("href"));
            food.setPicture(e.select("img").attr("src"));
            String tmp = e.select(".c2 .li2").text();
            String[] strArr = tmp.split("/");
            food.setTasteType(strArr[1].trim());

            Matcher m = idPattern.matcher(food.getDetailsSite());
            if (m.find()) {
                tmp = m.group();
                food.setId(tmp.substring(1, tmp.length() - 5));
            } else {
                food.setId(new Date().toString());
            }

            getMore(food);

            foodList.add(food);
        }
...

so easy,想要啥,就拿啥。嗯,還有個點贊數無法拿,不怕,仍是一樣的套路,照着小趙拿數據的方法來一遍。嘿!看我要變形了!呔!嗯?沒有值!!明明瀏覽器裏有,憑啥我就沒有?這可咋整,可是小張不能急!!!咦,瀏覽器頁面訪問後,又走了一個ajax拿數據,好傢伙,被我逮着了,我請求下數據不就好了唄。啊?請求回覆403!!又沒有數據!!這可咋整,可是小張不能急!!!瀏覽器能整的,我也能!照着瀏覽器的請求寫唄,少header,我加header。數據結構

HttpGet get = new HttpGet(s);
        get.setHeader("Accept-Encoding", "gzip, deflate, br");
        get.setHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
        get.setHeader("Cache-Control", "no-cache");
        get.setHeader("Connection", "keep-alive");
        get.setHeader("Host", "xxxxxxx");
        get.setHeader("Pragma", "no-cache");
        get.setHeader("Referer", "xxxxxxxxxx");
        get.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36");

嘿,來了。小樣,還有我小張搞不了的?這麼費神的事我也能搞!之後這樣的事,就不要找我了!!mvc

3. 比對分析功能

to be continue!!!
github地址

相關文章
相關標籤/搜索