<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>

          『爬蟲四步走』手把手教你使用 Python 抓取并存儲網(wǎng)頁數(shù)據(jù)!

          共 4472字,需瀏覽 9分鐘

           ·

          2020-10-24 01:23

          爬蟲是 Python 的一個重要的應(yīng)用,使用 Python 爬蟲我們可以輕松的從互聯(lián)網(wǎng)中抓取我們想要的數(shù)據(jù)

          本文將基于爬取 B 站視頻熱搜榜單數(shù)據(jù)并存儲為例,詳細介紹 Python 爬蟲的基本流程。

          如果你還在入門爬蟲階段或者不清楚爬蟲的具體工作流程,那么應(yīng)該仔細閱讀本文!

          ? 第一步:嘗試請求

          首先進入 b 站首頁,點擊排行榜并復(fù)制鏈接

          https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3

          現(xiàn)在啟動Jupyter notebook,并運行以下代碼

          import?requests

          url?=?'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
          res?=?requests.get('url')
          print(res.status_code)
          #200

          在上面的代碼中,我們完成了下面三件事

          • 導(dǎo)入requests
          • 使用get方法構(gòu)造請求
          • 使用status_code獲取網(wǎng)頁狀態(tài)碼

          可以看到返回值是200,表示服務(wù)器正常響應(yīng),這意味著我們可以繼續(xù)進行

          ? 第二步:解析頁面

          在上一步我們通過 requests 向網(wǎng)站請求數(shù)據(jù)后,成功得到一個包含服務(wù)器資源的 Response 對象,現(xiàn)在我們可以使用.text來查看其內(nèi)容

          可以看到返回一個字符串,里面有我們需要的熱榜視頻數(shù)據(jù),但是直接從字符串中提取內(nèi)容是比較復(fù)雜且低效的,因此我們需要對其進行解析,將字符串轉(zhuǎn)換為網(wǎng)頁結(jié)構(gòu)化數(shù)據(jù),這樣可以很方便地查找 HTML 標(biāo)簽以及其中的屬性和內(nèi)容。

          在 Python 中解析網(wǎng)頁的方法有很多,可以使用正則表達式,也可以使用BeautifulSouppyquerylxml,本文將基于?BeautifulSoup?進行講解

          Beautiful Soup?是一個可以從 HTML 或 XML 文件中提取數(shù)據(jù)的第三方庫

          安裝也很簡單,使用pip install bs4安裝即可

          下面讓我們用一個簡單的例子說明它是怎樣工作的

          from?bs4?import?BeautifulSoup

          page?=?requests.get(url)
          soup?=?BeautifulSoup(page.content,?'html.parser')
          title?=?soup.title.text?
          print(title)
          #?熱門視頻排行榜?-?嗶哩嗶哩?(゜-゜)つロ?干杯~-bilibili

          在上面的代碼中,我們通過 bs4 中的 BeautifulSoup 類將上一步得到的 html 格式字符串轉(zhuǎn)換為一個 BeautifulSoup 對象,注意在使用時需要制定一個解析器,這里使用的是html.parser

          接著就可以獲取其中的某個結(jié)構(gòu)化元素及其屬性,比如使用soup.title.text獲取頁面標(biāo)題,同樣可以使用soup.body、soup.p等獲取任意需要的元素

          ? 第三步:提取內(nèi)容

          在上面兩步中,我們分別使用 requests 向網(wǎng)頁請求數(shù)據(jù)并使用 bs4 解析頁面,現(xiàn)在來到最關(guān)鍵的步驟:如何從解析完的頁面中提取需要的內(nèi)容

          在?Beautiful Soup?中,我們可以使用find/find_all來定位元素,但我更習(xí)慣使用 CSS 選擇器.select,因為可以像使用 CSS 選擇元素一樣向下訪問 DOM 樹

          現(xiàn)在我們用代碼講解如何從解析完的頁面中提取 B 站熱榜的數(shù)據(jù),首先我們需要找到存儲數(shù)據(jù)的標(biāo)簽,在榜單頁面按下 F12 并按照下圖指示找到

          可以看到每一個視頻信息都被包在class="rank-item"的?li 標(biāo)簽下,那么代碼就可以這樣寫?

          all_products?=?[]

          products?=?soup.select('li.rank-item')
          for?product?in?products:
          ????rank?=?product.select('div.num')[0].text
          ????name?=?product.select('div.info?>?a')[0].text.strip()
          ????play?=?product.select('span.data-box')[0].text
          ????comment?=?product.select('span.data-box')[1].text
          ????up?=?product.select('span.data-box')[2].text
          ????url?=?product.select('div.info?>?a')[0].attrs['href']

          ????all_products.append({
          ????????"視頻排名":rank,
          ????????"視頻名":?name,
          ????????"播放量":?play,
          ????????"彈幕量":?comment,
          ????????"up主":?up,
          ????????"視頻鏈接":?url
          ????})

          在上面的代碼中,我們先使用soup.select('li.rank-item'),此時返回一個 list?包含每一個視頻信息,接著遍歷每一個視頻信息,依舊使用 CSS 選擇器來提取我們要的字段信息,并以字典的形式存儲在開頭定義好的空列表中

          可以注意到我用了多種選擇方法提取去元素,這也是 select 方法的靈活之處,感興趣的讀者可以進一步自行研究

          ? 第四步:存儲數(shù)據(jù)

          通過前面三步,我們成功的使用 requests+bs4 從網(wǎng)站中提取出需要的數(shù)據(jù),最后只需要將數(shù)據(jù)寫入 Excel 中保存即可。

          如果你對 pandas 不熟悉的話,可以使用csv模塊寫入,需要注意的是設(shè)置好編碼encoding='utf-8-sig',否則會出現(xiàn)中文亂碼的問題

          import?csv
          keys?=?all_products[0].keys()

          with?open('B站視頻熱榜TOP100.csv',?'w',?newline='',?encoding='utf-8-sig')?as?output_file:
          ????dict_writer?=?csv.DictWriter(output_file,?keys)
          ????dict_writer.writeheader()
          ????dict_writer.writerows(all_products)

          如果你熟悉 pandas 的話,更是可以輕松將字典轉(zhuǎn)換為 DataFrame,一行代碼即可完成

          import?pandas?as?pd
          keys?=?all_products[0].keys()

          pd.DataFrame(all_products,columns=keys).to_csv('B站視頻熱榜TOP100.csv',?encoding='utf-8-sig')


          ? 小結(jié)

          至此我們就成功使用 Python 將 b 站熱門視頻榜單數(shù)據(jù)存儲至本地,大多數(shù)基于requests 的爬蟲基本都按照上面四步進行

          不過雖然看上去簡單,但是在真實場景中每一步都沒有那么輕松,從請求數(shù)據(jù)開始目標(biāo)網(wǎng)站就有多種形式的反爬、加密,到后面解析、提取甚至存儲數(shù)據(jù)都有很多需要進一步探索、學(xué)習(xí)。

          本文選擇 B 站視頻熱榜也正是因為它足夠簡單,希望通過這個案例讓大家明白爬蟲的基本流程,最后附上完整代碼

          import?requests
          from?bs4?import?BeautifulSoup
          import?csv
          import?pandas?as?pd

          url?=?'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
          page?=?requests.get(url)
          soup?=?BeautifulSoup(page.content,?'html.parser')

          all_products?=?[]

          products?=?soup.select('li.rank-item')
          for?product?in?products:
          ????rank?=?product.select('div.num')[0].text
          ????name?=?product.select('div.info?>?a')[0].text.strip()
          ????play?=?product.select('span.data-box')[0].text
          ????comment?=?product.select('span.data-box')[1].text
          ????up?=?product.select('span.data-box')[2].text
          ????url?=?product.select('div.info?>?a')[0].attrs['href']

          ????all_products.append({
          ????????"視頻排名":rank,
          ????????"視頻名":?name,
          ????????"播放量":?play,
          ????????"彈幕量":?comment,
          ????????"up主":?up,
          ????????"視頻鏈接":?url
          ????})


          keys?=?all_products[0].keys()

          with?open('B站視頻熱榜TOP100.csv',?'w',?newline='',?encoding='utf-8-sig')?as?output_file:
          ????dict_writer?=?csv.DictWriter(output_file,?keys)
          ????dict_writer.writeheader()
          ????dict_writer.writerows(all_products)

          ###?使用pandas寫入數(shù)據(jù)
          pd.DataFrame(all_products,columns=keys).to_csv('B站視頻熱榜TOP100.csv',?encoding='utf-8-sig')


          -END-




          推薦閱讀


          聊聊 Python 數(shù)據(jù)處理全家桶(Mysql 篇)

          聊聊 Python 數(shù)據(jù)處理全家桶(Sqlite 篇)

          聊聊 Python 數(shù)據(jù)處理全家桶(Redis 篇)

          聊聊 Python 數(shù)據(jù)處理全家桶(Memc 篇)

          聊聊 Python 數(shù)據(jù)處理全家桶(Mongo 篇)

          最全總結(jié) | 聊聊 Python 數(shù)據(jù)處理全家桶(配置篇)




          瀏覽 63
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  人人要人人射 | av无码国产电影在线观看 | 小黄片软件下载 | 国产免费性爱视频 | 国产精品成人电影 |