作業目的

這份作業希望能夠讓你熟悉 Web Scraping 的流程,這週的重點會著重在 JSON。

A. scrape 104 & compare salary(50分)

接續老師錄製的影片,請到 104 人力銀行,爬取「軟體工程」和「資料科學」兩種職業的搜尋結果,扣除面議的薪資不計,繪製圖表比較這 2 種職業的薪資差異,請自行思考適合的圖表類型與指標。

你的程式碼應該包含 3 個部分:爬資料、清理資料如薪資與年資等欄位、視覺化,有些流程可能需要借助你的主觀判斷,請盡量搭配文字適度解釋你處理資料的過程。另外,建議你爬好資料之後,可以自行創建並存取在 data/AS05/ 資料夾當中,以免每次 knit 都要重爬。

### your code

B. scrape google trend(50分)

(1) scraping(30分)

請到 Google 每日搜尋趨勢,以抓取 JSON 的方式,爬下最近一週的搜尋趨勢結果,這裡的一週沒有規定具體日期,從你做作業當天為基礎即可。這題一樣建議你爬好資料之後,可以自行創建並存取在 data/AS05/ 資料夾當中,以免每次 knit 都要重爬。

結果部分請加入日期欄位,先印出前 10 個列,接著印出各個日期的筆數(參考程式碼:df %>% count(date))。

提示: a. API url 的長相類似這樣 - “https://trends.google.com.tw/trends/api/”,後面還有東西,可以去找一下
b. 可以用迴圈寫,並且在迴圈中更新 API url 的日期
c. 直接用 fromJSON() 會出事,因為 Google 很壞,它故意在結果的前 5 個字塞入不相干的東西阻礙你,建議你可以用 str_sub() 抓取正確的字串再轉換成 JSON

### your code

### result 01
#> # A tibble: 10 × 7
#>    title$query    $exploreLink    formattedTraffic relatedQueries image$newsUrl 
#>    <chr>          <chr>           <chr>            <list>         <chr>         
#>  1 取消實聯制     /trends/explor… 20萬+            <df [17 × 2]>  https://www.e…
#>  2 推特           /trends/explor… 5萬+             <df [5 × 2]>   https://www.c…
#>  3 軟性封城       /trends/explor… 2萬+             <df [3 × 2]>   https://www.e…
#>  4 實聯制         /trends/explor… 2萬+             <df [0 × 0]>   https://udn.c…
#>  5 林襄           /trends/explor… 2萬+             <df [1 × 2]>   https://tw.ne…
#>  6 確診者隔離天數 /trends/explor… 1萬+             <df [1 × 2]>   https://www.e…
#>  7 桂冠出版社     /trends/explor… 1萬+             <df [0 × 0]>   https://tw.ne…
#>  8 台南市衛生局   /trends/explor… 1萬+             <df [1 × 2]>   https://udn.c…
#>  9 籃網           /trends/explor… 5000+            <df [0 × 0]>   https://udn.c…
#> 10 蔡京京         /trends/explor… 5000+            <df [0 × 0]>   https://www.e…
#> # … with 3 more variables: articles <list>, shareUrl <chr>, date <dbl>
#> 

### result 02
#> # A tibble: 7 × 2
#>       date     n
#>      <dbl> <int>
#> 1 20220421    17
#> 2 20220422    20
#> 3 20220423    20
#> 4 20220424    20
#> 5 20220425    20
#> 6 20220426    20
#> 7 20220427    20

(2) cleaning(20分)

這個資料的原始結構有點複雜,請嘗試列出 id, date, query, formattedTraffic, title, source, url, snippet 等欄位。其中,iddate 是自行加入的欄位,其他都是上一小題就能抓到的結果。這題比較難,所以配分低一些。

提示: a. id: 可以利用 mutate(id = row_number())
b. 原始的 dataframe 不是一般常見的 dataframe,有些 column 本身是 list,又被稱為 nested dataframe,處理起來很麻煩,建議可以用 $
c. 會用到 2 次 left_join()

### your code

### result
#> # A tibble: 863 × 8
#>    id        date query  formattedTraffic title     source  url       snippet   
#>    <chr>    <dbl> <chr>  <chr>            <chr>     <chr>   <chr>     <chr>     
#>  1 21    20220427 食藥署 10萬+            快篩實名… ETtoday https://… 指揮中心… 
#>  2 21    20220427 食藥署 10萬+            家用快篩… ELLE …  https://… 在本土Cov…
#>  3 21    20220427 食藥署 10萬+            懶人包/… udn 元… https://… 本土疫情… 
#>  4 21    20220427 食藥署 10萬+            COVID-19… Heho健… https://… 因應確診… 
#>  5 21    20220427 食藥署 10萬+            懶人包/… Yahoo…  https://… 三、販售… 
#>  6 21    20220427 食藥署 10萬+            黑髮漂色… 健康醫… https://… 東方人的… 
#>  7 21    20220427 食藥署 10萬+            快篩實名… 遠見雜… https://… 指揮中心… 
#>  8 22    20220427 陳昱瑋 10萬+            勾惡「陳… 台灣蘋… https://… 網紅連千… 
#>  9 22    20220427 陳昱瑋 10萬+            勾惡幫主… ETtoda… https://… YouTube頻…
#> 10 22    20220427 陳昱瑋 10萬+            遭連千毅… 三立新… https://… 網紅直播… 
#> # … with 853 more rows