玩爬蟲的時候記得偽裝成瀏覽器!這樣就不可能被封了哦!
進群:960410445 即可獲取數十套PDF!
如果我們在頁面上【右擊-顯示網頁原始碼】可以看到豎向有兩千多行的html標籤程式碼,你可以在這裡找到頁面上看到的各個職位的對應文字,比如按【ctrl+F】搜尋“華夏高科”就可以找到它。
2. 請求頁面資料
使用阿里雲天池的Notebook或者Anaconda的Jupyter Notebook都可以,編寫以下程式碼,獲取整個頁面的html檔案資料。
url='https://www.zhipin.com/c101190400/h_101190400/?query=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&page=1' import requests from bs4 import BeautifulSoup html=requests.get(url) print(html.text)
url是複製貼上的瀏覽器地址,在這裡中文部分自動變成了亂碼,不用擔心,一樣可以使用。
執行這個程式碼,會output輸出頁面的標記程式碼,但你仔細看會發覺有什麼不對,好像少了很多,而且會看到這個資訊。
<h3 class="gray">您暫時無法繼續訪問~</h3> <p>由於您當前網路訪問頁面過於頻繁,可能存在安全風險,我們暫時阻止了您的本次訪問,24小時將自動解除限制。</p>
這表示伺服器識別我們的請求是爬蟲了!
但是如果我們把網址複製到瀏覽器裡,仍然可以正常開啟的。這是為什麼?
Python預設傳送的請求和瀏覽器傳送的請求是有不同的。最主要的不同就是瀏覽器傳送的請求除了http地址之外還包含了看不到的header頭資訊。
3. 認識請求頭 Request header
還是在剛才的Boss直聘工作列表頁面,右擊檢查之後,注意Elements元素面板邊上還有【Network網路】面板,點開看上去如下圖:
Network網路面板包含了所有向伺服器發出的請求的資訊,如圖所示,這一行 ?query=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&page=1就是我們程式碼裡面傳送的那個請求,點選它,可以看到它的更多資訊:
所以,瀏覽器向伺服器傳送的資訊很多,除了基本的 RequestURL地址,還發送了 RequestHeaders請求頭和 QueryStringParameters查詢字串引數。
QueryStringParameters很簡單,其實就是我們位址列最後 ?問號後面的部分 ?query=人工智慧&page=1。
RequestHeaders請求頭包含了很多資訊,非常複雜,我們這裡不逐個解釋了,你可以稍後自己在Google裡面搜尋到相關教程,這裡只重點解釋其中下面的三個:
- User-agent使用者代理欄位,就是你使用的瀏覽器,預設情況Python發出的Request裡面的這個資訊是缺失的,所以伺服器就發現你不是正常瀏覽器而是爬蟲了。
- Referer(圖中沒有)來路,就是說這個連結從哪個頁面點選開啟的,有些時候伺服器會檢查你的 request請求是否來自其他正常頁面連結點選而不是爬蟲。
- Cookie小甜餅,這個就複雜了,因為這個是每個網站伺服器自己記錄在你的瀏覽器的資訊(是的,他們的伺服器能操縱你的瀏覽器!),所以人家想記錄什麼就記錄什麼,最常見的是記錄你的使用者賬戶名和密碼(一般會只記錄你的編號就好了),這樣你每次向伺服器傳送 request的時候,伺服器就能從 header的 cookie裡面找到你的記錄,知道是你在傳送請求而不是其他人。
4. 新增請求頭
我們改進一下程式碼:
url='https://www.zhipin.com/c101190400/h_101190400/?query=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&page=1' headers={ 'user-agent':'Mozilla/5.0' } import requests from bs4 import BeautifulSoup html=requests.get(url,headers=headers) print(html.text)
再次執行,就可以得到完整的頁面資料了。
這裡主要是添加了 headers={...}物件(一對大括號包裹), headers物件只有一個 user-agent欄位屬性,用冒號隔開它的值 Mozilla/5.0(這裡我們偷懶只留了開頭Mozila火狐瀏覽器的資訊)
5. 迴圈獲取更多內容
改進後獲取10頁共300條招聘資訊:
url='https://www.zhipin.com/c101020100/h_101020100/?query=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&page=' headers={ 'user-agent':'Mozilla/5.0' } page=1 hud=['職位名','薪資1','薪資2','職位名','地點','經驗','學歷','公司行業','融資階段','公司人數','釋出日期','釋出人'] print(' '.join(hud)) import requests from bs4 import BeautifulSoup import time for n in range(1,11): html=requests.get(url+str(page),headers=headers) page+=1 soup = BeautifulSoup(html.text, 'html.parser') for item in soup.find_all('div','job-primary'): shuchu=[] shuchu.append(item.find('div','job-title').string) #職位名 xinzi=item.find('span','red').string xinzi=xinzi.replace('k','') xinzi=xinzi.split('-') shuchu.append(xinzi[0]) #薪資起始數 shuchu.append(xinzi[1]) #薪資起始數 yaoqiu=item.find('p').contents shuchu.append(yaoqiu[0].string if len(yaoqiu)>0 else 'None') #地點 shuchu.append(yaoqiu[2].string if len(yaoqiu)>2 else 'None') #經驗 shuchu.append(yaoqiu[4].string if len(yaoqiu)>4 else 'None') #學歷 gongsi=item.find('div','info-company').find('p').contents shuchu.append(gongsi[0].string if len(gongsi)>0 else 'None') #公司行業 shuchu.append(gongsi[2].string if len(gongsi)>2 else 'None') #融資階段 shuchu.append(gongsi[4].string if len(gongsi)>4 else 'None') #公司人數 shuchu.append(item.find('div','info-publis').find('p').string.replace('釋出於','')) #釋出日期 shuchu.append(item.find('div','info-publis').find('h3').contents[3].string) #釋出人 print(' '.join(shuchu)) time.sleep(1)
這裡是有了幾個新的知識點:
- '-'.join(hud)將列表集合 ['aa','bb','cc']合併成字串 'aa-bb-cc'。我們用 拼合成最後輸出 shuchu的內容。
- 集合.append(a),把a加入到集合最後面,之前是 [b,c]的話就會變成 [b,c,a]。我們用這個辦法逐個的把資料新增到集合的每個單元中。
- 字串.split('-'),和 join相反,split是把字串切成很多單元,再組成集合,小括號內就是分隔符號,比如 'aa-bb-cc'分割之後就成為 ['aa','bb','cc']。
- importtime和 time.sleep(1),每次請求之後停止休息1秒,避免頻繁傳送請求被Boss直聘伺服器遮蔽。如果我們請求的頻率遠超過正常人點選頻率,那麼很可能被伺服器看出是爬蟲,進而不再理睬我們的請求,也不會發送資料給我們。
最終得到的Excel結果如下:
下面是利用上一篇文章介紹的Excel資料透視表方法繪製的統計圖:
注,300個職位資料規模還很小,而且由於Boss直聘的搜尋問題,其中摻雜了大量的實際與人工智慧無關的職位,我們的分析方法還是很原始很粗糙的,僅供參考。隨著後續學習我們會逐步加深這方面的研究。
6. 後續學習資源
作為一個網際網路或科技企業的你,一定很關注你當前的職位的分佈情況吧,現在可以自己動手從Boss直聘網站的大資料上進行科學分析了!
換一個城市,換一個行業,嘗試更多的可能,從分析圖表中總結規律,推測趨勢。
如果要做更多的練習,還是推薦你花一點時間翻翻Html和Python的知識,不要有太大壓力,用心閱讀就可以,適當的時候可以跟著教程做做程式碼實驗。
- Html標籤技術基礎入門:http://www.w3school.com.cn/html/index.asp
- Python基礎入門教程:http://www.runoob.com/python/python-tutorial.html
- BeautifulSoup中文官方文件:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
以上就是本文的全部內容,希望對大家的學習有所幫助。如果覺得文章不錯,動手轉發支援一下哦!