<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          3000字 “嬰兒級(jí)” 爬蟲(chóng)圖文教學(xué) | 手把手教你用Python爬取 “實(shí)習(xí)網(wǎng)”!

          共 11717字,需瀏覽 24分鐘

           ·

          2021-05-30 11:00

          點(diǎn)擊上方“Python爬蟲(chóng)與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書(shū)籍”即可獲贈(zèng)Python從入門(mén)到進(jìn)階共10本電子書(shū)

          潮平兩岸闊,風(fēng)正一帆懸。

          1. 為"你"而寫(xiě)

          這篇文章,是專(zhuān)門(mén)為那些 "剛學(xué)習(xí)" Python爬蟲(chóng)的朋友,而專(zhuān)門(mén)準(zhǔn)備的文章。希望你看過(guò)這篇文章后,能夠清晰的知道整個(gè) "爬蟲(chóng)流程"。從而能夠 "獨(dú)立自主" 的去完成,某個(gè)簡(jiǎn)單網(wǎng)站的數(shù)據(jù)爬取。

          好了,咱們就開(kāi)始整個(gè) “爬蟲(chóng)教學(xué)” 之旅吧!

          2. 頁(yè)面分析

          ① 你要爬取的網(wǎng)站是什么?

          首先,我們應(yīng)該清楚你要爬去的網(wǎng)站是什么?
          由于這里我們想要爬取的是 “實(shí)習(xí)網(wǎng)” 中的數(shù)據(jù),因此我們可以打開(kāi)這個(gè)網(wǎng)站看看(如圖所示)。
          網(wǎng)站鏈接:https://www.shixi.com/search/index?
          由于我們想要爬取 “數(shù)據(jù)分析” 崗位的數(shù)據(jù)。因此,直接在輸入框輸入數(shù)據(jù)分析即可。
          這里是我們要的最終頁(yè)面鏈接。????待爬取鏈接:
          https://www.shixi.com/search/index?key=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90
          觀(guān)察下圖,可以清楚看到有哪些數(shù)據(jù),下面還有頁(yè)面信息。我們需要了解這些: 一個(gè)頁(yè)面中共有多少條數(shù)據(jù)。這個(gè)很重要,后面可以幫你檢查,是否爬取到了每個(gè)頁(yè)面的所有信息。
          圖中顯示的是 “一級(jí)頁(yè)面” 中的信息,點(diǎn)擊任意一個(gè) “崗位名”,會(huì)自動(dòng)跳轉(zhuǎn)到 “二級(jí)頁(yè)面”。以點(diǎn)擊 “數(shù)據(jù)分析實(shí)習(xí)生” 為例,原來(lái)二級(jí)頁(yè)面是這樣的。

          ② 你要爬取頁(yè)面上的哪些信息?

          這里我們獲取的不僅有一級(jí)頁(yè)面中的信息,還有二級(jí)頁(yè)面中的信息。
          在一級(jí)頁(yè)面中(如圖所示),我們獲取到的有 “公司名”“崗位名”“公司地址”“學(xué)歷”“薪資”
          在二級(jí)頁(yè)面中(如圖所示),我們獲取到的有 “崗位需求”“公司類(lèi)型”“公司規(guī)模”
          好了,這里一共有8個(gè)數(shù)據(jù),是我們要獲取的數(shù)據(jù),這就是我們的 “爬蟲(chóng)目的”

          ③ 頁(yè)面是 “靜態(tài)網(wǎng)頁(yè)”,還是“動(dòng)態(tài)網(wǎng)頁(yè)”?

          如果你請(qǐng)求某個(gè)網(wǎng)頁(yè),網(wǎng)頁(yè)的信息是一次性給你的,那么它就是 “靜態(tài)網(wǎng)頁(yè)”
          如果你請(qǐng)求某個(gè)網(wǎng)頁(yè),網(wǎng)頁(yè)中的信息,隨著你鼠標(biāo)往下滑動(dòng),而慢慢展現(xiàn)出來(lái),那么它就是 “動(dòng)態(tài)網(wǎng)頁(yè)”,即 “Ajax技術(shù)”
          那么它們的區(qū)別就在于: 靜態(tài)網(wǎng)頁(yè)中的數(shù)據(jù),是一次性給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數(shù)據(jù),是隨著頁(yè)面一步步加載出來(lái),而逐步呈現(xiàn)的,也就是你用靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù),無(wú)法獲取到里面所有的數(shù)據(jù)。
          這里有一個(gè)很好 “檢驗(yàn)” 是靜態(tài)網(wǎng)頁(yè)還是動(dòng)態(tài)網(wǎng)頁(yè)的方法,我給大家介紹一下 。
          點(diǎn)“鼠標(biāo)右鍵”,點(diǎn)擊 “查看網(wǎng)頁(yè)源代碼”
          最終效果如下(部分截圖):
          這其實(shí)就是你請(qǐng)求這個(gè)網(wǎng)頁(yè),最終返回給你的信息。你要爬取的數(shù)據(jù),如果在里面都能找到,大致可以判斷是 “靜態(tài)網(wǎng)頁(yè)”,如果找不到,大致可以考慮是 “動(dòng)態(tài)網(wǎng)頁(yè)”
          怎么查找呢?
          在上述頁(yè)面,可以點(diǎn)擊 “ctrl + f”,調(diào)出搜索框(如圖所示),你將網(wǎng)頁(yè)中的數(shù)據(jù),粘貼進(jìn)來(lái),看看能否都能被搜索到。
          當(dāng)然,今天這堂課是小白教程,肯定教你的是一個(gè) “靜態(tài)網(wǎng)頁(yè)”。但是沒(méi)關(guān)系呀,這些知識(shí)你都知道了。

          3. 如何定位數(shù)據(jù)

          在正式寫(xiě)代碼之前,你肯定要知道,你想要用哪種方式,來(lái)幫你解析數(shù)據(jù)。常見(jiàn)的Python爬蟲(chóng)解析數(shù)據(jù)的方法有:re正則表達(dá)式、xpath、beautifulsoup、pyquery等。
          本文黃同學(xué)采用的將會(huì)是xpath解析法。
          好了,我們接著就來(lái)定位數(shù)據(jù)吧!
          點(diǎn)擊 “鼠標(biāo)右鍵”,再點(diǎn)擊 “審查元素”。【或者直接按電腦上的F12鍵】
          此時(shí),會(huì)出現(xiàn)如下頁(yè)面。
          這其實(shí)是一個(gè) “橋梁”,幫助我們建立起 “網(wǎng)頁(yè)”“源代碼” 之間的關(guān)系定位。
          那么,應(yīng)該怎么使用它呢?(觀(guān)察下圖三個(gè)步驟)
          首先,單擊①處。接著,光標(biāo)指向你要定位的數(shù)據(jù)(②)。此時(shí),在③處,他回自動(dòng)跳轉(zhuǎn)到你想要定位的數(shù)據(jù),在源碼中的位置。
          這個(gè)對(duì)于我們寫(xiě)代碼超極有幫助,也是最基本的操作。
          關(guān)于怎么解析數(shù)據(jù),我就不在詳細(xì)說(shuō)明。因?yàn)椋@也不是今天這篇文章能夠講清楚的。
          今天我就是想讓你掌握 “爬蟲(chóng)技術(shù)” 的流程。因此,接下來(lái)我會(huì)為大家講述整個(gè)代碼的爬蟲(chóng)思路。

          4. 爬蟲(chóng)代碼講解

          這里我將會(huì)分步為大家講解整個(gè)爬蟲(chóng)流程,這種文章只寫(xiě)這一篇,剛學(xué)Python的朋友,一定要看哦!

          ① 導(dǎo)入相關(guān)庫(kù)

          import pandas as pd # 用于數(shù)據(jù)存儲(chǔ)
          import requests # 用于請(qǐng)求網(wǎng)頁(yè)
          import chardet # 用于修改編碼
          import re # 用于提取數(shù)據(jù)
          from lxml import etree # 解析數(shù)據(jù)的庫(kù)
          import time # 可以粗糙模擬人為請(qǐng)求網(wǎng)頁(yè)的速度
          import warnings # 忽略代碼運(yùn)行時(shí)候的警告信息
          warnings.filterwarnings("ignore")

          ② 請(qǐng)求一級(jí)頁(yè)面的網(wǎng)頁(yè)源代碼

          url = 'https://www.shixi.com/search/index?key=數(shù)據(jù)分析&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'
          headers = {'User-Agent''Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
          rqg = requests.get(url, headers=headers, verify=False) ①
          rqg.encoding = chardet.detect(rqg.content)['encoding'] ②
          html = etree.HTML(rqg.text)
          這里我們僅僅講述①②兩處。在①處,有兩個(gè)參數(shù),一個(gè)是headers一個(gè)是verify。其中headers是一種反反扒的措施,讓瀏覽器認(rèn)為爬蟲(chóng)不是爬蟲(chóng),而是人在用瀏覽器去正常請(qǐng)求網(wǎng)頁(yè)。verify是忽略安全證書(shū)提示,有的網(wǎng)頁(yè)會(huì)被認(rèn)為是一個(gè)不安全的網(wǎng)頁(yè),會(huì)提示你,這個(gè)參數(shù)你記住就行。
          在②處,我們已經(jīng)獲取到了網(wǎng)頁(yè)的源碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和你所在電腦的解析方式,有可能不一致,返回的結(jié)果會(huì)導(dǎo)致亂碼。此時(shí),你就需要修改編碼方式,chardet庫(kù)可以幫你自動(dòng)檢測(cè)網(wǎng)頁(yè)源碼的編碼(不懂得再下去研究一下這個(gè)庫(kù))。

          ③ 解析一級(jí)頁(yè)面網(wǎng)頁(yè)中的信息

          # 1. 公司名
          company_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
          company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]

          # 2. 崗位名
          job_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
          job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]

          # 3. 地址
          address_list = html.xpath('//div[@class="job-pannel-two"]//a/text()')

          # 4. 學(xué)歷
          degree_list = html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')

          # 5. 薪資
          salary_list = html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')
          salary_list = [i.strip() for i in salary_list]

          # 獲取二級(jí)頁(yè)面的鏈接
          deep_url_list = html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')
          x = "https://www.shixi.com"
          deep_url_list = [x + i for i in deep_url_list]
          此時(shí),你可以看到,我直接采用xpath一個(gè)個(gè)去解析一級(jí)頁(yè)面中的數(shù)據(jù)分析。在代碼末尾,可以看到:我們獲取到了二級(jí)頁(yè)面的鏈接,為我們后面爬取二級(jí)頁(yè)面中的信息,做準(zhǔn)備。

          ④ 解析二級(jí)頁(yè)面網(wǎng)頁(yè)中的信息

          demand_list = []
          area_list = []
          scale_list = []

          for deep_url in deep_url_list:
              rqg = requests.get(deep_url, headers=headers, verify=False) ①
              rqg.encoding = chardet.detect(rqg.content)['encoding'] ②
              html = etree.HTML(rqg.text) ③
              
              # 6. 需要幾人
              demand = html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')
              
              # 7. 公司領(lǐng)域
              area = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')

              # 8. 公司規(guī)模
              scale = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')
              
              demand_list.append(demand)
              area_list.append(area)
              scale_list.append(scale)
          記住:二級(jí)頁(yè)面也是頁(yè)面呀,你要想獲取到其中的消息,就必須再次請(qǐng)求該網(wǎng)頁(yè)。因此,你可以看到①②③處的代碼,和上面寫(xiě)的代碼,就是一模一樣的。

          ⑤ 翻頁(yè)操作

          https://www.shixi.com/search/index?key=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=1
          https://www.shixi.com/search/index?key=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=2
          https://www.shixi.com/search/index?key=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=3
          隨意復(fù)制幾個(gè)不同頁(yè)面的url,觀(guān)察它們的區(qū)別。這里可以看到,也就page參數(shù)后面的數(shù)字不同,是第幾頁(yè),數(shù)字就是幾。
          x = "https://www.shixi.com/search/index?key=數(shù)據(jù)分析&page="
          url_list = [x + str(i) for i in range(1,61)] 
          由于我們爬取了60頁(yè) 的數(shù)據(jù),這里就構(gòu)造出了60個(gè)url,他們都存在url_list這個(gè)列表中。
          我們現(xiàn)在來(lái)看看整個(gè)代碼吧,我就不再文字?jǐn)⑹隽耍苯釉诖a中寫(xiě)好了注釋。
          import pandas as pd
          import requests
          import chardet
          import re
          from lxml import etree
          import time
          import warnings
          warnings.filterwarnings("ignore")

          def get_CI(url):
           # ① 請(qǐng)求獲取一級(jí)頁(yè)面的源代碼 
              url = 'https://www.shixi.com/search/index?key=數(shù)據(jù)分析&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'
              headers = {'User-Agent''Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
              rqg = requests.get(url, headers=headers, verify=False)
              rqg.encoding = chardet.detect(rqg.content)['encoding']
              html = etree.HTML(rqg.text)
              
              # ② 獲取一級(jí)頁(yè)面中的信息:一共有ⅠⅡⅢⅣⅤⅥ個(gè)信息。
              # Ⅰ 公司名
              company_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
              company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]

              # Ⅱ 崗位名
              job_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
              job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
              
              # Ⅲ 地址
              address_list = html.xpath('//div[@class="job-pannel-two"]//a/text()')
              
              # Ⅳ 學(xué)歷
              degree_list = html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')
              
              
              # Ⅴ 薪資
              salary_list = html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')
              salary_list = [i.strip() for i in salary_list]

              # Ⅵ 獲取二級(jí)頁(yè)面的url
              deep_url_list = html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')
              x = "https://www.shixi.com"
              deep_url_list = [x + i for i in deep_url_list]
              
              demand_list = []
              area_list = []
              scale_list = []

              # ③ 獲取二級(jí)頁(yè)面中的信息:一共有ⅠⅡⅢ三個(gè)信息。
              for deep_url in deep_url_list:
                  rqg = requests.get(deep_url, headers=headers, verify=False)
                  rqg.encoding = chardet.detect(rqg.content)['encoding']
                  html = etree.HTML(rqg.text)
                  
                  # Ⅰ 需要幾人
                  demand = html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')
                  
                  # Ⅱ 公司領(lǐng)域
                  area = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')

                  # Ⅲ 公司規(guī)模
                  scale = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')
                  
                  demand_list.append(demand)
                  area_list.append(area)
                  scale_list.append(scale)
               
              # ④ 將每個(gè)頁(yè)面獲取到的所有數(shù)據(jù),存儲(chǔ)到DataFrame中。
              data = pd.DataFrame({'公司名':company_list,'崗位名':job_list,'地址':address_list,"學(xué)歷":degree_list,
                                   '薪資':salary_list,'崗位需求量':demand_list,'公司領(lǐng)域':area_list,'公司規(guī)模':scale_list})
              return(data)

          x = "https://www.shixi.com/search/index?key=數(shù)據(jù)分析&page="
          url_list = [x + str(i) for i in range(1,61)] 

          res = pd.DataFrame(columns=['公司名','崗位名','地址',"學(xué)歷",'薪資','崗位需求量','公司領(lǐng)域','公司規(guī)模'])

          # ⑤ 這里進(jìn)行“翻頁(yè)”操作
          for url in url_list:
              res0 = get_CI(url)
              res = pd.concat([res,res0])
              time.sleep(3)

          # ⑥ 保存最終數(shù)據(jù)
          res.to_csv('aliang.csv',encoding='utf_8_sig')
          最終爬取到的數(shù)據(jù)如下:

          好了,本文就講述到這里。其實(shí)對(duì)于一個(gè)爬蟲(chóng)小白來(lái)說(shuō)內(nèi)容已經(jīng)夠多了,好好下去消化。
          ------------------- End -------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說(shuō)一兩句吧~

          瀏覽 62
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本私人色噜噜影院 | 日韩人妻精品中文字幕专区不卡 | 97xxxxx| 日本成人三级网站 | 精品国产操逼视频 |