職友集是一家匯聚全網(wǎng)眾多招聘信息的網(wǎng)站咙冗,并具有很多職位趨勢分析漱挚。
這篇文章介紹如何快速爬取職友集網(wǎng)站的信息俭识。
爬蟲思路分析
首先確認(rèn)需要爬取的職位信息的地址格式是https://www.jobui.com/jobs?jobKw={key_word}&cityKw={city_name}
凉倚。
然后確認(rèn)我們所需要的職位詳細(xì)頁面鏈接格式是https://www.jobui.com/job/{job_id}/
我們只需要從職位列表頁面獲取每個職位對應(yīng)的職位詳細(xì)頁面鏈接兼都,即可對獲取到職位詳細(xì)信息。而每個職位的鏈接其實(shí)就是職位列表頁每個職位標(biāo)題的href屬性稽寒。
所以我們把爬蟲分為三步(以10頁為例):
-
爬取職位列表頁面的鏈接扮碧,每頁17個,分10頁可以爬取170個鏈接杏糙,最好存儲到文件以備下一步使用慎王。
-
從存儲的鏈接文件中一次讀取全部170個鏈接,然后逐個鏈接爬取宏侍,并且將網(wǎng)頁源碼分別存儲為170個文件備用赖淤。
-
從存儲的170個職位文件中讀取數(shù)據(jù),這些數(shù)據(jù)都是html源碼谅河,可以用BeautifulSoup解析咱旱。
爬取職位詳情的全部鏈接
習(xí)慣性的在瀏覽器登錄注冊,從控制臺Networks中找到/jobs?...
請求并copy request headers獲得請求頭字符串旧蛾,并利用str2dict函數(shù)轉(zhuǎn)為dict對象備用莽龟。
header_str='''
GET /jobs?jobKw=python&cityKw=%E5%85%A8%E5%9B%BD&n=2&taget=subscribe HTTP/1.1
Host: www.jobui.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
...
'''
#字符串轉(zhuǎn)dict的方法
def str2dict(s,s1=';',s2='='):
li=s.split(s1)
res={}
for kv in li:
li2=kv.split(s2)
if len(li2)>1:
res[li2[0]]=li2[1]
return res
headers=str2dict(header_str,'\n',': ')
headers
這里的headers看起來是這樣的一個dict:
下面是獲取鏈接link的函數(shù)
import requests
from bs4 import BeautifulSoup
urlstr = 'https://www.jobui.com/jobs?jobKw={kw}&cityKw=%E5%85%A8%E5%9B%BD&n={n}'
#n,頁碼锨天,第幾頁;kw剃毒,搜索詞病袄,如'python'
def getLinks(n,kw):
links = []
url = urlstr.format(n=n,kw=kw)
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text)
jobs = soup.find('ul', {'data-jobidlist': True})
jobs=jobs.find_all('li')
for job in jobs:
atag = job.find('h3', {'data-positionid': True}).parent
links.append('https://www.jobui.com' + atag['href']) #獲取到鏈接href屬性
return links
先從大數(shù)據(jù)工程師.json
中讀出已有的全部鏈接,放入all_links赘阀,然后再啟動爬蟲爬取新的鏈接也放入all_links益缠,并且去除重復(fù),重新存儲大數(shù)據(jù)工程師.json
覆蓋基公,實(shí)現(xiàn)新增鏈接幅慌。
#獲取detail頁面鏈接
import json
import os
import time
kw = '大數(shù)據(jù)工程師'
all_links = []
linkfdr = './jobui/links/'
file = linkfdr + '{}.json'.format(kw)
if not os.path.exists(linkfdr): #如果文件夾不存在就創(chuàng)建它
os.makedirs(linkfdr)
#先讀取已有的,避免重復(fù)
if os.path.isfile(file):#檢查文件存在
with open(file, 'r') as f:
all_links = json.loads(f.read())
#增加新的鏈接
for i in range(0, 10):
print('Crawling LINK:', i)
try:
all_links = all_links + getLinks(i, kw)
time.sleep(1)
except:
print('Get link failed.')
with open(file, 'w') as f:
all_links = list(set(all_links)) #去重復(fù)
f.write(json.dumps(all_links))
print('LINK OK!')
這個代碼將在當(dāng)前文件夾的/jobui/link/
文件夾中創(chuàng)建一個以kw
命名的.json文件轰豆,比如大數(shù)據(jù)工程師.json
,其中包含了10個頁面共170個職位鏈接地址胰伍,看起來如下:
爬取并存儲每個職位詳情源碼
根據(jù)鏈接讀取文件并存儲的函數(shù)。
#link,職位頁面的地址,http://...完整地址酸休;keyw骂租,關(guān)鍵詞,將作為存放網(wǎng)頁源碼文件的文件夾名稱斑司。
def getHtml(link, keyw):
res = requests.get(link, headers=headers)
fdr = './jobui/{}/'.format(keyw)
if not os.path.exists(fdr):
os.makedirs(fdr) #如果不存在文件夾則創(chuàng)建它
fname = link.split('/')[-2:-1][0] #從https://.../job/194131276/中獲得194131276
with open(fdr + fname + '.html', 'w',encoding='utf-8') as f:
f.write(res.text)
從大數(shù)據(jù)工程師.json
中讀取全部link,為每個link啟動getHtml
爬取數(shù)據(jù)并存儲頁面源碼渗饮。
#讀取link文件中所有鏈接的html
read_links = []
keyfdr = kw
link_file = linkfdr + '{}.json'.format(keyfdr)
with open(link_file, 'r') as f:
links = json.loads(f.read())
for link in links:
print('Getting HTML:', link)
try:
getHtml(link, keyfdr)
except:
print('--failed')
time.sleep(1)
print('HTML OK!')
最終生成的文件目錄大致是:
每個人的智能新時(shí)代
如果您發(fā)現(xiàn)文章錯誤,請不吝留言指正互站;
如果您覺得有用私蕾,請點(diǎn)喜歡;
如果您覺得很有用胡桃,歡迎轉(zhuǎn)載~
END