寫在前面:某日,公司想要招聘一個崗位的人員,想從招聘網上看看相關崗位的薪資及相關條件,於是就有了以下爬取過程。
這裏以關鍵詞 “基因” “近一個月內”作爲條件爬取相關信息,打開獵聘網,輸入 “基因”,選擇近一個月內,結果如下:
當前顯示的是第一頁:
查看當前鏈接:發現規律不明顯
https://www.liepin.com/zhaopin/?init=-1&headckid=181a371f3583bfee&flushckid=1&fromSearchBtn=2&pubTime=30&ckid=3d871f0122b3e6c9°radeFlag=0&curPage=0&sfrom=click-pc_homepage-centre_searchbox-search_new&key=%E5%9F%BA%E5%9B%A0&siTag=wpx05sEHOAKOTToVOh4zJw~fA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp&d_ckId=cf67c27a6ce68af047a9752179e2d5d0&d_curPage=0&d_pageSize=40&d_headId=8551d000d99330889491c8d91023137d
點擊第二頁並查看第二頁的鏈接:
https://www.liepin.com/zhaopin/?init=-1&headckid=181a371f3583bfee&fromSearchBtn=2&pubTime=30&ckid=43f135ffd04645b1°radeFlag=0&sfrom=click-pc_homepage-centre_searchbox-search_new&key=%E5%9F%BA%E5%9B%A0&siTag=wpx05sEHOAKOTToVOh4zJw~UoKQA1_uiNxxEb8RglVcHg&d_sfrom=search_fp&d_ckId=a7fac3c3df0712444f709570b349c883&d_curPage=0&d_pageSize=40&d_headId=8551d000d99330889491c8d91023137d&curPage=1
通過對比發現關鍵curpage=1表示的是第二頁,那是不是將1改爲相應的數字就找到了頁碼呢?爲了證實猜想,我們多點開幾個試一下,試過之後發現curpage=0表示第一頁,curpage=2表示第三頁,猜想正確!這樣一來URL的構造就非常簡單了,只需要更改url最後的數字即可。接下來就是確定一共有多少頁,點擊頁碼跳到最後發現一共有100頁:
這樣,URL的構造就很清晰了,如下:
url = 'https://www.liepin.com/zhaopin/?init=-1&headckid=181a371f3583bfee&fromSearchBtn=2&pubTime=30&ckid=27fda43c09cfd22a°radeFlag=0&sfrom=click-pc_homepage-centre_searchbox-search_new&key=%E5%9F%BA%E5%9B%A0&siTag=wpx05sEHOAKOTToVOh4zJw~UoKQA1_uiNxxEb8RglVcHg&d_sfrom=search_fp&d_ckId=72cb43ffd77e25f190635f45f4400ce0&d_curPage=0&d_pageSize=40&d_headId=8551d000d99330889491c8d91023137d&curPage='
for i in range(101):
url = url + 'i'
接下來就是獲得具體的頁面信息:檢查網頁元素髮現每一條職位信息都在ul標籤下的li標籤中,於是我們可以通過xpath定位li標籤
html = requests.get(url, headers = headers).text
mytree = lxml.etree.HTML(html)
postList = mytree.xpath('//ul[@class="sojob-list"]/li')
這樣得到的是所有的li標籤列表,現在我們來解決其中一個具體的li標籤用以獲得想要的內容:
從該結構中可以看到,我們想要的內容在li標籤下的h3標籤和p標籤中,從而使用相應的xpath繼續定位並提取內容:
postTitle = postList.xpath('.//div[@class="job-info"]/h3/a/text()')[0]
postInfo = postList.xpath('.//div[@class="job-info"]/p/span//text()')
postSalary = postInfo[0]
postEDU = postInfo[1]
postExperience = postInfo[2]
這樣一來基本上就解決了一條職位信息的獲取,一頁的信息只需對li標籤列表進行循環獲取,而所有頁面的信息只需對所有構造的url進行循環獲取,最終將所有信息保存下來即可。
完整代碼如下:
import csv
from time import sleep
import lxml
import requests
from lxml import etree
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36"}
url = 'https://www.liepin.com/zhaopin/?init=-1&headckid=181a371f3583bfee&fromSearchBtn=2&pubTime=30&ckid=27fda43c09cfd22a°radeFlag=0&sfrom=click-pc_homepage-centre_searchbox-search_new&key=%E5%9F%BA%E5%9B%A0&siTag=wpx05sEHOAKOTToVOh4zJw~UoKQA1_uiNxxEb8RglVcHg&d_sfrom=search_fp&d_ckId=72cb43ffd77e25f190635f45f4400ce0&d_curPage=0&d_pageSize=40&d_headId=8551d000d99330889491c8d91023137d&curPage='
def getPerPageInfo(url):
html = requests.get(url, headers = headers).text
mytree = lxml.etree.HTML(html)
postList = mytree.xpath('//ul[@class="sojob-list"]/li')
# print(postList)
for post in postList:
postTitle = post.xpath('.//div[@class="job-info"]/h3/a/text()')[0]
postInfo = post.xpath('.//div[@class="job-info"]/p/span//text()')
postSalary = postInfo[0]
postEDU = postInfo[1]
postExperience = postInfo[2]
infoList = [postTitle,postSalary,postEDU,postExperience]
# 將得到的數據用csv格式存儲
writer.writerow(infoList) # writerows()會把單個字符寫入到一個單元格中,而writerow()會把一個字符串寫入一個單元格中
if __name__ == '__main__':
csvHeader = ['招聘崗位','薪酬','所需學歷','工作經驗']
with open('./獵聘網基因相關崗位信息.csv', 'a+', encoding='utf-8', errors='ignore', newline="") as f:
writer = csv.writer(f)
writer.writerow(csvHeader)
for i in range(101):
url = url + 'i'
getPerPageInfo(url)
sleep(0.5) # 每一頁爬取時延遲一會,防止對別人服務器造成太大壓力
總結:這個爬取過程比較簡單,基本上沒有遇到什麼阻力,當然,這也跟我們爬去的內容簡單有關係,如果想要爬去更多內容或者爬取更加智能化還需要修改很多地方,比如還要爬去詳情頁,相關的關鍵字不去手動輸入通過分析後得到URL而是使用者輸入關鍵字後url自動生成等等,這些都可以作爲擴展進行聯繫。