1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【Python】Python爬蟲快速入門,BeautifulSoup基本使用及實踐

        共 4507字,需瀏覽 10分鐘

         ·

        2021-06-03 02:45

        來源:Python數(shù)據(jù)之道

        作者:Peter

        整理:陽哥

        爬蟲,是學習Python的一個有用的分支,互聯(lián)網(wǎng)時代,信息浩瀚如海,如果能夠便捷的獲取有用的信息,我們便有可能領先一步,而爬蟲正是這樣的一個工具。

        「Python數(shù)據(jù)之道」 之前已經(jīng)分享過一些關(guān)于介紹 爬蟲 的內(nèi)容,大家也可以前往閱讀:


        Beautiful Soup 是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫。由于 BeautifulSoup 是基于 Python,所以相對來說速度會比另一個 Xpath 會慢點,但是其功能也是非常的強大,本文會介紹該庫的基本使用方法,幫助讀者快速入門。

        網(wǎng)上有很多的學習資料,但是超詳細學習內(nèi)容還是非官網(wǎng)莫屬,資料傳送門:

        英文官網(wǎng):https://www.crummy.com/software/BeautifulSoup/bs4/doc/

        中文官網(wǎng):https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

        本文的主要內(nèi)容如下:

        安裝和使用

        安裝

        安裝過程非常簡單,直接使用pip即可:

        pip install beautifulsoup4

        上面安裝庫最后的4是不能省略的,因為還有另一個庫叫作 beautifulsoup,但是這個庫已經(jīng)停止開發(fā)了。

        因為BS4在解析數(shù)據(jù)的時候是需要依賴一定的解析器,所以還需要安裝解析器,我們安裝強大的lxml:

        pip install lxml

        在python交互式環(huán)境中導入庫,沒有報錯的話,表示安裝成功。

        使用

        使用過程直接導入庫:

        from bs4 import BeautifulSoup

        解析原理

        解析原理

        • 實例化一個BeautifulSoup對象,并且將本地或者頁面源碼數(shù)據(jù)加載到該對象中
        • 通過調(diào)用該對象中相關(guān)的屬性或者方法進行標簽定位和數(shù)據(jù)提取

        如何實例化BeautifulSoup對象

        1. 將本地的HTML文檔中的數(shù)據(jù)加載到BS對象中
        2. 將網(wǎng)頁上獲取的頁面源碼數(shù)據(jù)加載到BS對象中

        案例解析

        原數(shù)據(jù)

        假設我們現(xiàn)在本地有一個HTML文件待解析,具體內(nèi)容如下,數(shù)據(jù)中有各種HTML標簽:html、head、body、div、p、a、ul、li等

        加載數(shù)據(jù)

        from bs4 import BeautifulSoup

        fp = open('./test.html','r',encoding='utf-8')  # 打開本地文件
        soup = BeautifulSoup(fp,'lxml')
        soup

        所有的數(shù)據(jù)解析都是基于soup對象的,下面開始介紹各種解析數(shù)據(jù)方法:

        soup.tagName

        soup.TagName返回的是該標簽第一次出現(xiàn)的內(nèi)容,以a標簽為例:

        數(shù)據(jù)中多次出現(xiàn)a標簽,但是只會返回第一次出現(xiàn)的內(nèi)容

        我們再看下div標簽:

        出現(xiàn)了2次,但是只會返回第一次的內(nèi)容:

        soup.find('tagName')

        find()主要是有兩個方法:

        • 返回某個標簽第一次出現(xiàn)的內(nèi)容,等同于上面的soup.tagName
        • 屬性定位:用于查找某個有特定性質(zhì)的標簽

        1、返回標簽第一次出現(xiàn)的內(nèi)容:

        比如返回a標簽第一次出現(xiàn)的內(nèi)容:

        再比如返回div標簽第一次出現(xiàn)的內(nèi)容:

        2、屬性定位

        比如我們想查找a標簽中id為“谷歌”的數(shù)據(jù)信息:

        在BS4中規(guī)定,如果遇到要查詢class情況,需要使用class_來代替:

        但是如果我們使用attrs參數(shù),則是不需要使用下劃線的:

        soup.find_all()

        該方法返回的是指定標簽下面的所有內(nèi)容,而且是列表的形式;傳入的方式是多種多樣的。

        1、傳入單個指定的標簽

        image-20210523170401516

        上面返回的是列表形式,我們可以獲取我們想要的內(nèi)容:

        2、傳入多個標簽(列表形式)

        需要主要返回內(nèi)容的表達形式,每個標簽的內(nèi)容是單獨顯示的

        3、傳入正則表達式

        比如查看以a開頭標簽的全部內(nèi)容

        查看以li標簽開頭的全部內(nèi)容:

        選擇器soup.select()

        主要是有3種選擇器,返回的內(nèi)容都是列表形式

        • 類選擇器:點
        • id選擇器:#
        • 標簽選擇器:直接指定標簽名

        1、類選擇器

        2、id選擇器

        3、標簽選擇器

        直接指定li標簽

        4、選擇器和find_all()可以達到相同的效果:

        soup.tagName和soup.find('tagName')的效果也是相同的:

        層級選擇器使用

        在soup.select()方法中是可以使用層級選擇器的,選擇器可以是類、id、標簽等,使用規(guī)則:

        • 單層:>
        • 多層:空格

        1、單層使用

        2、多層使用

        獲取標簽文本內(nèi)容

        獲取某個標簽中對應文本內(nèi)容主要是兩個屬性+一個方法:

        • text
        • string
        • get_text()

        1、text

        2、string

        3、get_text()

        3者之間的區(qū)別

        # text和get_text():獲取標簽下面的全部文本內(nèi)容
        # string:只能獲取到標簽下的直系文本內(nèi)容

        獲取標簽屬性值

        1、通過選擇器來獲取

        2、通過find_all方法來獲取

        BeautifulSoup實戰(zhàn)

        下面介紹的是通過BeautifulSoup解析方法來獲取某個小說網(wǎng)站上古龍小說名稱和對應的URL地址。

        網(wǎng)站數(shù)據(jù)

        我們需要爬取的數(shù)據(jù)全部在這個網(wǎng)址下:https://www.kanunu8.com/zj/10867.html,右鍵“檢查”,查看對應的源碼,可以看到對應小說名和URL地址在源碼中位置

        每行3篇小說在一個tr標簽下面,對應的屬性href和文本內(nèi)容就是我們想提取的內(nèi)容。

        獲取網(wǎng)頁源碼

        import requests
        from bs4 import BeautifulSoup
        import pandas as pd
        import re

        url = 'https://www.kanunu8.com/zj/10867.html'
        headers = {'user-agent''個人請求頭'}

        response = requests.get(url = url,headers = headers)
        result = response.content.decode('gbk')   # 該網(wǎng)頁需要通過gbk編碼來解析數(shù)據(jù)
        # result

        實例化BeautifulSoup對象

        soup1 = BeautifulSoup(result,'lxml')
        # print(soup1.prettify())  美化輸出源碼內(nèi)容

        獲取名稱和URL地址

        1、先獲取整體內(nèi)容

        兩個信息全部指定a標簽中,我們只需要獲取到a標簽,通過兩個屬性href和target即可鎖定:

        # 兩個屬性href和target,不同的方法來鎖定

        information_list = soup1.find_all('a',href=re.compile('^/book'),target='_blank')
        information_list

        2、再單獨獲取兩個信息

        通過屬性來獲取URL地址,通過文本來獲取名稱

        url_list = []
        name_list = []

        for i in information_list:
            url_list.append(i['href'])  # 獲取屬性
            name_list.append(i.text)  # 獲取文本

        3、生成數(shù)據(jù)幀

        gulong = pd.DataFrame({
            "name":name_list,
            "url":url_list}
        )

        gulong

        我們發(fā)現(xiàn)每部小說的具體地址其實是有一個公共前綴的:https://www.kanunu8.com/book,現(xiàn)在給加上:

        gulong['url'] = 'https://www.kanunu8.com/book' + gulong['url']   # 加上公共前綴
        gulong.head()

        另外,我們想把書名的《》給去掉,使用replace替代函數(shù):

        gulong["name"] = gulong["name"].apply(lambda x:x.replace("《",""))  # 左邊
        gulong["name"] = gulong["name"].apply(lambda x:x.replace("》","")) # 右邊

        # 保存
        gulong.to_csv("gulong.csv",index=False)  # 保存到本地的csv文件

        最后顯示的前5行數(shù)據(jù):

        總結(jié)

        本文從BeautifulSoup4庫的安裝、原理以及案例解析,到最后結(jié)合一個實際的爬蟲實現(xiàn)介紹了一個數(shù)據(jù)解析庫的使用,文中介紹的內(nèi)容只是該庫的部分內(nèi)容,方便使用者快速入門,希望對讀者有所幫助。

        作者簡介

        Peter,碩士畢業(yè)僧一枚,從電子專業(yè)自學Python入門數(shù)據(jù)行業(yè),擅長數(shù)據(jù)分析及可視化。喜歡數(shù)據(jù),堅持跑步,熱愛閱讀,樂觀生活。個人格言:不浮于世,不負于己

        個人站點:www.renpeter.cn

        往期精彩回顧





        本站qq群851320808,加入微信群請掃碼:

        瀏覽 35
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            操大奶人妻 | 人人爽人人爽人人 | 午夜精品视频在线观看一区二区 | 91爱爱电影 | 91人妻日韩人妻无码专区精品 | 亚洲精品成AV人片天堂无码 | 亚洲黄色视频在线观看网站 | 手机在线一区 | 国產亂倫一級黃色 | 色色V |