鏈接分析
1、不同的搜索關鍵字 的搜索鏈接分析:
搜索python工程師:https://sou.zhaopin.com/?jl=538&kw=python工程師&kt=3
搜索java工程師:https://sou.zhaopin.com/?jl=538&kw=java工程師&kt=3
對比結果:兩個鏈接只有 kw=
后的內容有所不同。kw
后的內容就是搜索的關鍵詞,你就可以根據查詢內容構造自己的鏈接。
2、不同頁面的搜索鏈接分析
中間頁的鏈接:https://sou.zhaopin.com/?p=2&jl=538&kw=java工程師&kt=3
最后一頁的鏈接:https://sou.zhaopin.com/?p=12&jl=538&kw=java工程師&kt=3
對比結果:不同頁面的鏈接,只有第一頁沒有 p=
參數。其余頁面只是 p=
后的參數不同。
頁面的渲染
我們所看到的網頁是瀏覽器將 HTML、CSS、JavaScript 代碼加工后呈現到屏幕上的。因此,為了獲得完整的內容,爬蟲也需要重復這一過程。
在默認情況下,爬蟲獲取到的是未經渲染的 HTML、JavaScript、CSS 代碼。
渲染頁面
在獲取的結果上調用reader函數,渲染頁面。
from requests_html import HTMLSession session=HTMLSession() firstPage=session.get('https://sou.zhaopin.com/?jl=538&kw=python工程師&kt=3') firstPage.html.render() print(firstPage.html.text)
數據提取
查看網頁源代碼,寫正則表達式
比如薪資的源代碼是:<p class="contentpile__content__wrapper__item__info__box__job__saray">10K-15K</p>
其正則表達式可以寫成:<p.*>(\d+)K-(\d+)K</p>
再比如下一頁的源代碼是:<button disabled="disabled" class="btn soupager__btn soupager__btn--disable">下一頁</button>
其正則表達式可以寫成:<button.* disabled="disabled".*>下一頁</button>,你可以用這個正則來判斷是不是最后一頁。
from requests_html import HTMLSession import re session=HTMLSession() first_page=session.get('https://sou.zhaopin.com/?jl=489&kw=%E7%88%AC%E8%99%AB%E5%B7%A5%E7%A8%8B%E5%B8%88&kt=3') first_page.html.render(sleep=10) #薪資水平源代碼正則表達式 salary_element='<p.*>(\d+)K-(\d+)K</p>' salary=re.findall(salary_element,first_page.html.html) #最后一頁 下一頁 按鈕正則表達式 disabled_button_element='<button.* disabled="disabled".*>下一頁</button>' disabled_button=re.findall(disabled_button_element,first_page.html.html)
成功匹配薪資水平和 下一頁 按鈕后,嘗試提取所有 python工程師的薪資水平 並利用 matplotlib
繪圖展示。
完整代碼如下:
from requests_html import HTMLSession import re from matplotlib import pyplot as plt salary_element='<p.*>(\d+)K-(\d+)K</p>' salary=[] disabled_button_element='<button.* disabled="disabled".*>下一頁</button>' #disabled_button_element='<button class="btn soupager__btn soupager__btn--disable" disabled="disabled">下一頁</button>' disabled_button=None p=1 while not disabled_button: print('正在爬取第'+str(p)+'頁') url='https://sou.zhaopin.com/?p='+str(p)+'&jl=530&kw=python工程師&kt=3' session=HTMLSession() page=session.get(url) page.html.render(sleep=3) # 提取出薪資,保存為形如 [[10,20], [15,20], [12, 15]] 的數組 salary+=re.findall(salary_element,page.html.html) # 判斷頁面中下一頁按鈕還能不能點擊 disabled_button=re.findall(disabled_button_element,page.html.html) p=p+1 session.close() #求出每家公司的平均工資 salary=[(int(s[0])+int(s[1]))/2 for s in salary] low_salary,middle_salary,high_salary=[0,0,0] for s in salary: if s<=15: low_salary+=1 elif s>15 and s<=30: middle_salary+=1 else: high_salary+=1 # 調節圖形大小,寬,高 plt.figure(figsize=(16,19)) labels=[u'<15K',u'15K-30K',u'>30K'] data=[low_salary,middle_salary,high_salary] plt.pie(data,labels=labels) plt.axis('equal') plt.legend() plt.show()
數據展示