iT邦幫忙

1

如何提取人力銀行最新職缺數字?

請教大神,
https://www.1111.com.tw/corp/8325616/
網頁中的最新職缺數字(113)要如何取得?
用get抓下網頁, 找不到113這個值.
感謝.

甲土豆 iT邦新手 5 級 ‧ 2019-09-02 09:18:37 檢舉
wget
蟹老闆 iT邦大師 1 級 ‧ 2019-09-02 09:23:06 檢舉
回錯了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
ccutmis
iT邦高手 2 級 ‧ 2019-09-02 08:50:14
最佳解答

若不是太複雜的非同步網頁爬虫也可以試試 requests_html
註:需先安裝 requests_html套件(指令: pip install requests-html )

利用 render(sleep=N)
可以想像是點了網頁之後等幾秒讓非同步的內容載進來
接下來再用requests_html本身有提供的selector來抓取span#eCount的內容
因為抓到的值是(112),所以用replace去除左右小括號

以下是範例:

from requests_html import HTMLSession
session = HTMLSession()
r=session.get("https://www.1111.com.tw/corp/8325616/")
r.html.render(sleep=5)
print(r.html.find('span#eCount', first=True).text.replace('(','').replace(')',''))

Result:

112

如果想要了解更多 requests-html 能做的事,請自行google "requests-html 教學" 資源蠻多的。

看更多先前的回應...收起先前的回應...
mirause iT邦新手 5 級 ‧ 2019-09-03 09:17:40 檢舉

感謝大師!
看來要學python了,
perl找不到類似模組.

ccutmis iT邦高手 2 級 ‧ 2019-09-03 09:48:51 檢舉

我只是菸酒生不是大師
/images/emoticon/emoticon73.gif
一起學習Python啊~加油~

mirause iT邦新手 5 級 ‧ 2019-09-04 03:15:02 檢舉

您太客氣了, 謝謝你們.
我在台北市,如果有機會,大家找一天聚聚聊天, 我作東.

ccutmis iT邦高手 2 級 ‧ 2019-09-04 09:29:13 檢舉

/images/emoticon/emoticon82.gif

1
小魚
iT邦大師 1 級 ‧ 2019-09-02 07:07:17

現在很多網站都是非同步,
尤其是像React, Vue 這些框架寫出來的,
都是非同步的方式,
所以你Get的時候資料還沒取得,
就無法抓到資料,

其實比較深入的爬蟲,
最好是本身也會寫網頁,
對網頁的架構有一定的了解,
會比較知道怎麼寫,
要不然有時候要花比較多的時間去研究,

至於你要抓的資料,
比較簡單的方式可以使用selenium套件,
他可以設定資料都載入之後才去處理,
(但是要如何判斷也是你要告訴他的,
所以你還是要去了解網頁的架構)
缺點是selenium會有延遲的情況,
要不然基本上只要你的判斷方法正確,
幾乎可以做任何事情.

聽說另外也可以透過他的API去抓資料,
只要你從原始碼當中分析出他用的API是哪個,
不過如果有作CSRF防護的話就比較麻煩,
這部份我就沒有研究了.

mirause iT邦新手 5 級 ‧ 2019-09-03 09:23:35 檢舉

謝謝!
下載selenium套件了.
....
還不知道怎樣用, 努力摸索!

1
dragonH
iT邦超人 5 級 ‧ 2019-09-02 09:46:10

只用 requests 跟 bs4

code

import requests
from bs4 import BeautifulSoup

def getCompanyWorksCount(companyNo):
  url = "https://www.1111.com.tw/job-bank/company-description-joblist.asp?nNo={}".format(companyNo)
  html = requests.get(url)
  soup = BeautifulSoup(html.text, 'lxml')
  target = soup.find(id = 'eCountTotA')
  return target.getText()

result = getCompanyWorksCount(8325616)
print(result)

companyNo 為 公司編號

根據傳進去的編號回傳該公司的數字


用 ccutmis大 推薦的 requests_html

連 bs4 都不用

code

from requests_html import HTMLSession

def getCompanyWorksCount(companyNo):
  url = "https://www.1111.com.tw/job-bank/company-description-joblist.asp?nNo={}".format(companyNo)
  session = HTMLSession()
  req = session.get(url)
  target = req.html.find('div#eCountTotA', first=True)
  print(target.text)

result = getCompanyWorksCount(8325616)

另外補充一下

其實

React, Vue, Angular等 前端框架

不能直接爬的最主要原因不是因為同不同步

而是因為他們的內容都是 js render 出來的

而一般的爬蟲

基本上不會執行 js

以 vue 舉例

<p>{{ myText }}</>

...

data() {
    return {
        myText: 'Hello ithelp',
    }
}

就算你 myText 一開始就有值

爬蟲也爬不到

看更多先前的回應...收起先前的回應...
ccutmis iT邦高手 2 級 ‧ 2019-09-02 10:16:24 檢舉

js render 的網頁 用 requests_html 可以爬
/images/emoticon/emoticon82.gif

dragonH iT邦超人 5 級 ‧ 2019-09-02 10:24:33 檢舉

我知道

你的範例很清楚可以看到XD/images/emoticon/emoticon07.gif

ccutmis iT邦高手 2 級 ‧ 2019-09-02 10:48:23 檢舉

req.html.find('div#eCountTotA', first=True)
是個簡單方便的好解法,
我抓到html碼後就會忍不住想使用Re來解析它們
/images/emoticon/emoticon77.gif
剛才把我的demo改成不用Re了...

dragonH iT邦超人 5 級 ‧ 2019-09-02 10:56:04 檢舉

感覺原本的 re 寫法好像比較簡潔 XD
/images/emoticon/emoticon82.gif

ccutmis iT邦高手 2 級 ‧ 2019-09-02 11:12:19 檢舉

/images/emoticon/emoticon21.gif

mirause iT邦新手 5 級 ‧ 2019-09-03 09:20:26 檢舉

感謝大師!
這個連結https://www.1111.com.tw/job-bank/company-description-joblist.asp?nNo=
是怎找出來的?

dragonH iT邦超人 5 級 ‧ 2019-09-03 09:24:43 檢舉

mirause

用 browser 的 f12 console 找的

有的時候先分析網頁再爬

會讓你繞少一點路/images/emoticon/emoticon07.gif

mirause iT邦新手 5 級 ‧ 2019-09-04 03:07:24 檢舉

感謝大師,
我進了console, 不知道要打甚麼, 打了 console.clear 也沒理我, 出現這個字串
ƒ clear() { [native code] }
要下甚麼指令去找?
例如另一個人力銀行,
https://www.104.com.tw/company/a5h92m0
要怎麼找到這個職缺人數?

dragonH iT邦超人 5 級 ‧ 2019-09-04 09:18:39 檢舉

mirause

這個更簡單

他直接幫你整理好 json 格式

連爬蟲都不用

code

import requests
url = 'https://www.104.com.tw/company/a5h92m0'
def getCompanyJobsCount(companyNo):
  url = 'https://www.104.com.tw/company/ajax/joblist/options/{}'.format(companyNo);
  companyData = requests.get(url).json()
  return companyData['data']['jobCount']

count = getCompanyJobsCount('a5h92m0');
print(count)

ps

舊的文就盡量不要回了

尤其是 it邦通知壞了很久

有夠難找是哪一篇有新留言XD/images/emoticon/emoticon07.gif

真的要

可以考慮加個標記

mirause iT邦新手 5 級 ‧ 2019-09-05 23:22:13 檢舉

dragonH
再次感謝!

我要發表回答

立即登入回答