若不是太複雜的非同步網頁爬虫也可以試試 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 教學" 資源蠻多的。
現在很多網站都是非同步,
尤其是像React, Vue 這些框架寫出來的,
都是非同步的方式,
所以你Get的時候資料還沒取得,
就無法抓到資料,
其實比較深入的爬蟲,
最好是本身也會寫網頁,
對網頁的架構有一定的了解,
會比較知道怎麼寫,
要不然有時候要花比較多的時間去研究,
至於你要抓的資料,
比較簡單的方式可以使用selenium套件,
他可以設定資料都載入之後才去處理,
(但是要如何判斷也是你要告訴他的,
所以你還是要去了解網頁的架構)
缺點是selenium會有延遲的情況,
要不然基本上只要你的判斷方法正確,
幾乎可以做任何事情.
聽說另外也可以透過他的API去抓資料,
只要你從原始碼當中分析出他用的API是哪個,
不過如果有作CSRF防護的話就比較麻煩,
這部份我就沒有研究了.
只用 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 一開始就有值
爬蟲也爬不到
js render 的網頁 用 requests_html 可以爬
我知道
你的範例很清楚可以看到XD
req.html.find('div#eCountTotA', first=True)
是個簡單方便的好解法,
我抓到html碼後就會忍不住想使用Re來解析它們
剛才把我的demo改成不用Re了...
感覺原本的 re 寫法好像比較簡潔 XD
感謝大師!
這個連結https://www.1111.com.tw/job-bank/company-description-joblist.asp?nNo=
是怎找出來的?
感謝大師,
我進了console, 不知道要打甚麼, 打了 console.clear 也沒理我, 出現這個字串
ƒ clear() { [native code] }
要下甚麼指令去找?
例如另一個人力銀行,
https://www.104.com.tw/company/a5h92m0
要怎麼找到這個職缺人數?
這個更簡單
他直接幫你整理好 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
真的要
可以考慮加個標記
dragonH
再次感謝!