網(wǎng)絡數(shù)據(jù)抓取-二級頁面-Python-requests爬蟲

智能決策上手系列教程索引

我們繼續(xù)上一篇抓取Boss直聘網(wǎng)站招聘列表的練習隘击,進一步抓取每個招聘的詳細信息仰禀。

網(wǎng)絡數(shù)據(jù)抓取-Python-爬蟲-Header-Boss直聘

代碼回顧(中間啰嗦部分被省略):

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','地點','經(jīng)驗','學歷','公司行業(yè)','融資階段','公司人數(shù)','發(fā)布日期','發(fā)布人']
print('\t'.join(hud))

import requests
from bs4 import BeautifulSoup
for n in range(1,21):  
    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) #職位名
     ...
      print('\t'.join(shuchu))

1. 分析頁面

對于https://www.zhipin.com/c101020100/h_101020100/?query=人工智能&page=1這個頁面必尼,我們再次右擊某個招聘的標題文字纫事,檢查Elements元素面板:

詳細頁面的鏈接

這里的a標記元素是一個可以點擊的鏈接元素矮湘,它的href屬性就是點擊后將要打開的新頁面地址刹衫,點擊它就會打開這個招聘職位對應的詳情頁面被丧,對比發(fā)現(xiàn)真正打開的頁面只是比這個 href地址前面多了https://www.zhipin.com,就變成了類似https://www.zhipin.com/job_detail/7231c7f3bb87e0f51XZ43tm8F1A~.html的頁面绪妹。

我們需要讓爬蟲自動的打開每個詳細頁面甥桂,并提取里面的有用信息,以便于我們存儲到Excel表格里面進行分析邮旷。

下圖是我們期望的順序:

抓取流程

2. 獲取鏈接

BeautifulSoup獲取元素屬性的方法是直接使用['屬性名']黄选,比如這里我們需要獲取href屬性,那么就只要找到這個a標記婶肩,然后.['href']就可以得到鏈接地址了办陷。

建議你新建一個文件,然后使用下面精簡過的代碼進行測試(這里改為range(1,2)只讀取第1頁):

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','地點','經(jīng)驗','學歷','公司行業(yè)','融資階段','公司人數(shù)','發(fā)布日期','發(fā)布人']
print('\t'.join(hud))

import requests
from bs4 import BeautifulSoup
for n in range(1,2):  
    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) #職位名     
      
      #讀取每個職位的詳細信息頁面
      link=item.find('div','info-primary').find('h3').find('a')['href']
      print(link)
      #print('\t'.join(shuchu))

Python里面律歼,如果你需要臨時禁用一行代碼民镜,可以在它開頭添加井號#;如果你需要臨時禁用多行代碼险毁,那么需要在開始和結尾添加三個單引號'''

3. 請求詳情頁面并提取數(shù)據(jù)

打開任意一個詳情頁面比如這個頁面制圈,可以看到我們需要的職位詳情內(nèi)容包含在一個<div class='text'>的標記元素下面。

職位詳情信息位置

這里有個難題畔况,這個text div里面的內(nèi)容很亂鲸鹦,包含了很多空格回車還有<br>這樣的東西,用以前的.string是不行的跷跪,但用.text就能很好的解決這些問題

在Notebook里再新建一個代碼文件馋嗜,測試下面的代碼:

import requests
from bs4 import BeautifulSoup
headers={
  'user-agent':'Mozilla/5.0'
}
def getDetails(link):
    xq_html=requests.get('https://www.zhipin.com'+link,headers=headers)
    xq_soup= BeautifulSoup(xq_html.text, 'html.parser')
    miaoshu=xq_soup.find('div','job-sec').find('div','text').text #獲得標記的內(nèi)部文字
    miaoshu=miaoshu.lstrip().rstrip() #去除開頭和結尾的空格
    return miaoshu
xq=getDetails('/job_detail/7231c7f3bb87e0f51XZ43tm8F1A~.html')
print(xq)

這里我們使用了幾個新的知識:

  • def getDetails(link), def xxx(a):這是創(chuàng)建了一個函數(shù)。def是define(定義)的意思吵瞻。
    • 什么是函數(shù)葛菇?函數(shù)就是動作甘磨,跑可以是一個函數(shù),打你也是一個函數(shù)眯停,所以我們可以創(chuàng)建def run():也可以創(chuàng)建def hit(someone):這樣的函數(shù)宽档。
    • 創(chuàng)建的目的是為了使用。其實我們一致在使用函數(shù)庵朝,比如print('hello!')就是在使用print函數(shù),執(zhí)行輸出hello這個單詞的動作又厉;同樣九府,requests.get(...)也是在執(zhí)行requests自身帶有的get動作函數(shù),上面的xq=getDetails(...)就是使用了我們自己創(chuàng)建的getDetails函數(shù)覆致。
    • return miaoshu,這里是指函數(shù)最后輸出的結果侄旬,類似html=requests.get(...)這樣把獲取到的頁面數(shù)據(jù)輸出給html這個對象。我們的getDetails函數(shù)也會把整理后的miaoshu文字輸出給下面的xq煌妈。
  • 元素.text元素.string差不多效果儡羔,都是得到元素里面的文字,但.text可以去掉摻雜在里面的尖括號璧诵。
  • lstrip().rstrip()汰蜘,左右去掉多余的空格,left-strip,right-strip的意思之宿。

4. 合并代碼

我們測試好了之后族操,把它們合并到一起(仍然是只拉取第一頁職位列表):

強烈推薦安裝Anaconda,使用它自帶的Jupyter Notebook來運行下面這個代碼比被。使用天池Notebook可能導致被Boss直聘網(wǎng)站禁用后無法修復的問題色难。

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'
}
hud=['頁數(shù)','職位名','薪資1','薪資2','地點','經(jīng)驗','學歷','公司行業(yè)','融資階段','公司人數(shù)','發(fā)布日期','發(fā)布人','詳情']
print('\t'.join(hud))

import requests
from bs4 import BeautifulSoup
import time
def getDetails(link):
    xq_html=requests.get('https://www.zhipin.com'+link,headers=headers)
    xq_soup= BeautifulSoup(xq_html.text, 'html.parser')
    miaoshu=''
    try:
        miaoshu=xq_soup.find('div','job-sec').find('div','text').text #獲得標記的內(nèi)部文字
        miaoshu=miaoshu.lstrip().rstrip() #去除開頭和結尾的空格
    except:
        miaoshu='None'
    return miaoshu 

for n in range(1,2):  
    html=requests.get(url+str(n),headers=headers)
    soup = BeautifulSoup(html.text, 'html.parser')
    liebiao=soup.find_all('div','job-primary')
    for item in liebiao:
      shuchu=[]
      shuchu.append(str(n))
      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]) #薪資起始數(shù)
      shuchu.append(xinzi[1]) #薪資起始數(shù)
      
      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') #經(jīng)驗
      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') #公司行業(yè)
      shuchu.append(gongsi[2].string  if len(gongsi)>2 else 'None') #融資階段
      shuchu.append(gongsi[4].string if len(gongsi)>4 else 'None') #公司人數(shù)
      
      shuchu.append(item.find('div','info-publis').find('p').string.replace('發(fā)布于','')) #發(fā)布日期
      shuchu.append(item.find('div','info-publis').find('h3').contents[3].string) #發(fā)布人
      
      #讀取每個職位的詳細信息頁面
      link=item.find('div','info-primary').find('h3').find('a')['href']
      xq=getDetails(link)
      shuchu.append(xq)      
      print('\t'.join(shuchu))
      time.sleep(1)

如果你的代碼本來好好地,然后就不能正常運行等缀,或者能運行但是詳情字段都輸出None枷莉,那么請做以下嘗試:

  • 如果完全無反應,可以嘗試在最初發(fā)送列表請求后添加一行print(html.text)尺迂,輸出最初得到的頁面內(nèi)容笤妙,查看是否正常,有沒有被服務器拒絕的字樣噪裕。
  • 檢查這個鏈接地址是否能在瀏覽器正常打開危喉。
  • 如果彈出下面這個畫面,不用擔心州疾,手工輸入一下驗證碼就好了辜限,然后可以繼續(xù)爬數(shù)據(jù)。這是因為Boss直聘網(wǎng)站服務器發(fā)覺你請求頁面的頻率太多了严蓖,要確認一下你是真人而不是爬蟲薄嫡。
  • 你可能需要多次修改for n in range(1,21)中的1氧急,這個1代表從第幾頁列表開始爬取,Boss直聘似乎是每次爬取100個詳情頁面(3個列表頁)左右就要驗證一下毫深,所以你需要3頁3頁的爬取骂际,然后粘貼到excel中放到一起界轩。
    Boss直聘網(wǎng)站的人工驗證

目前還不確定Boss直聘的反爬蟲機制,不過下一篇我們一定會深入討論更多內(nèi)容,屆時也許會有更好辦法臼勉。

這里在getDetails函數(shù)里面增加了try:...except:...這個用法,它表示嘗試著執(zhí)行try后面的代碼冒签,如果運行出錯(比如找不到對應的標記元素導致find函數(shù)失敗),那么就執(zhí)行except:后面的代碼闯两。

5. 關于請求失敗

Boss直聘的頁面相對還是比較容易抓取的,但是如果你頻繁發(fā)送頁面請求腥沽,他們的服務器會把你的網(wǎng)絡IP地址給封禁逮走,讓你再也請求不到他們服務器的任何數(shù)據(jù)。

如果你不確定當前電腦的IP是否被他們服務器封禁今阳,可以在瀏覽器里面查看打開你代碼中的任意鏈接师溅,看是否能正常訪問,如果可以那就沒事盾舌。Boss直聘有時候封禁你只是臨時的墓臭,你只要在瀏覽器內(nèi)正常驗證一下表示當前你是真人不是爬蟲,那么就能解除封禁妖谴。

這種封禁一般是幾分鐘到1小時起便,罕見徹底封禁不自動解禁的。

如果你被封禁了又急需解鎖窖维,那么恐怕最快的辦法就是換個IP了榆综,可以試試看換臺電腦或者換到別的網(wǎng)線接口上,如果是家庭寬帶铸史,也可以試試看拔掉網(wǎng)線過幾分鐘再插上鼻疮。

原則上講,網(wǎng)站服務器一般不會采用封IP的辦法的琳轿,因為如果是一個公司共用這個寬帶判沟,那么一旦封禁IP,全公司都不能訪問他們的網(wǎng)站了崭篡,其他人會覺得這個網(wǎng)站很糟而棄用挪哄。

我并不確定Boss直聘網(wǎng)站是否真的采用了封IP的方法,無論如何琉闪,下一篇我們將討論如何破解另外一種反爬蟲的機制迹炼。——對于封禁IP的方法來反爬蟲,代碼上幾乎是誤解的斯入,你必須有很多個IP來運行你的爬蟲砂碉,很多個IP可以是很多臺電腦,也可以是代理服務器刻两,暫時我們不討論這個增蹭。

如果你希望成為一個真正的爬蟲專家,那么你需要認真的學習一些計算機網(wǎng)絡通信的基礎知識磅摹,可以在網(wǎng)上購買一些大學計算機通信專業(yè)的課本來看滋迈。——當然這不是我推薦每個人去做的户誓。

6. 后續(xù)學習

經(jīng)過這三篇文章的學習饼灿,你應該已經(jīng)準備好邁入編程的門檻了,接下來的情況天池Notebook可能就不夠用了厅克,建議你正式下載和安裝Anaconda。
請認真參照我的這個教程進行橙依。

Anaconda安裝和Jupyter Notebook上手教程


智能決策上手系列教程索引

每個人的智能決策新時代

如果您發(fā)現(xiàn)文章錯誤证舟,請不吝留言指正;
如果您覺得有用窗骑,請點喜歡女责;
如果您覺得很有用,歡迎轉(zhuǎn)載~


END

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末创译,一起剝皮案震驚了整個濱河市抵知,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌软族,老刑警劉巖刷喜,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異立砸,居然都是意外死亡掖疮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門颗祝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浊闪,“玉大人,你說我怎么就攤上這事螺戳「楸觯” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵倔幼,是天一觀的道長盖腿。 經(jīng)常有香客問我,道長损同,這世上最難降的妖魔是什么奸忽? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任堕伪,我火速辦了婚禮,結果婚禮上栗菜,老公的妹妹穿的比我還像新娘欠雌。我一直安慰自己疙筹,他們只是感情好富俄,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著而咆,像睡著了一般霍比。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上暴备,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天悠瞬,我揣著相機與錄音,去河邊找鬼涯捻。 笑死浅妆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的障癌。 我是一名探鬼主播凌外,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涛浙!你這毒婦竟也來了康辑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤轿亮,失蹤者是張志新(化名)和其女友劉穎疮薇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體我注,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡惦辛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仓手。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胖齐。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嗽冒,靈堂內(nèi)的尸體忽然破棺而出呀伙,到底是詐尸還是另有隱情,我是刑警寧澤添坊,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布剿另,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雨女。R本人自食惡果不足惜谚攒,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氛堕。 院中可真熱鬧馏臭,春花似錦、人聲如沸讼稚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锐想。三九已至帮寻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赠摇,已是汗流浹背固逗。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留藕帜,地道東北人烫罩。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像耘戚,于是被迫代替她去往敵國和親嗡髓。 傳聞我的和親對象是個殘疾皇子操漠,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 用于python面試整理收津,主要來源于http://www.cnblogs.com/skiler/p/6952707...
    十里江城閱讀 2,356評論 0 13
  • 1. 概述 本文主要介紹網(wǎng)絡爬蟲,采用的實現(xiàn)語言為Python浊伙,目的在于闡述網(wǎng)絡爬蟲的原理和實現(xiàn)撞秋,并且對目前常見的...
    Lemon_Home閱讀 2,752評論 0 21
  • Python語言特性 1 Python的函數(shù)參數(shù)傳遞 看兩個如下例子,分析運行結果: 代碼一: a = 1 def...
    伊森H閱讀 3,063評論 0 15
  • 爬蟲文章 in 簡書程序員專題: like:128-Python 爬取落網(wǎng)音樂 like:127-【圖文詳解】py...
    喜歡吃栗子閱讀 21,752評論 4 412
  • 作者:京(來自豆瓣) 年前嚣鄙,帶孩子回了趟老家給祖宗上墳吻贿。剛下過一場暌違已久的大雪,從鄉(xiāng)村水泥路到田埂哑子,運動鞋沾了厚...
    艦一閱讀 228評論 0 0