1. 程式人生 > >玩爬蟲的時候記得偽裝成瀏覽器!這樣就不可能被封了哦!

玩爬蟲的時候記得偽裝成瀏覽器!這樣就不可能被封了哦!

玩爬蟲的時候記得偽裝成瀏覽器!這樣就不可能被封了哦!

 

玩爬蟲的時候記得偽裝成瀏覽器!這樣就不可能被封了哦!

 

進群: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

以上就是本文的全部內容,希望對大家的學習有所幫助。如果覺得文章不錯,動手轉發支援一下哦!