Python 網路爬蟲的常用庫彙總及應用

weixin_44264006發表於2020-10-24

Python 網路爬蟲的常用庫彙總

爬蟲的程式語言有不少,但 Python 絕對是其中的主流之一。今天就為大家介紹下 Python 在編寫網路爬蟲常常用到的一些庫。

請求庫:實現 HTTP 請求操作

urllib:一系列用於操作URL的功能。

requests:基於 urllib 編寫的,阻塞式 HTTP 請求庫,發出一個請求,一直等待伺服器響應後,程式才能進行下一步處理。

selenium:自動化測試工具。一個呼叫瀏覽器的 driver,通過這個庫你可以直接呼叫瀏覽器完成某些操作,比如輸入驗證碼。

aiohttp:基於 asyncio 實現的 HTTP 框架。非同步操作藉助於 async/await 關鍵字,使用非同步庫進行資料抓取,可以大大提高效率。

解析庫:從網頁中提取資訊

beautifulsoup:html 和 XML 的解析,從網頁中提取資訊,同時擁有強大的API和多樣解析方式。

pyquery:jQuery 的 Python 實現,能夠以 jQuery 的語法來操作解析 HTML 文件,易用性和解析速度都很好。

lxml:支援HTML和XML的解析,支援XPath解析方式,而且解析效率非常高。

tesserocr:一個 OCR 庫,在遇到驗證碼(圖形驗證碼為主)的時候,可直接用 OCR 進行識別。

從基礎的python指令碼到web開發、爬蟲、資料分析、資料視覺化、機器學習、面試真題等。想要的可以進群:688244617免費領取學習資料

儲存庫:Python 與資料庫互動

pymysql:一個純 Python 實現的 MySQL 客戶端操作庫。

pymongo:一個用於直接連線 mongodb 資料庫進行查詢操作的庫。

redisdump:一個用於 redis 資料匯入/匯出的工具。基於 ruby 實現的,因此使用它,需要先安裝 Ruby。

爬蟲框架

Scrapy:很強大的爬蟲框架,可以滿足簡單的頁面爬取(比如可以明確獲知url pattern的情況)。用這個框架可以輕鬆爬下來如亞馬遜商品資訊之類的資料。但是對於稍微複雜一點的頁面,如 weibo 的頁面資訊,這個框架就滿足不了需求了。

Crawley:高速爬取對應網站的內容,支援關係和非關聯式資料庫,資料可以匯出為 JSON、XML 等。

Portia:視覺化爬取網頁內容。

newspaper:提取新聞、文章以及內容分析。

python-goose:java 寫的文章提取工具。

cola:一個分散式爬蟲框架。專案整體設計有點糟,模組間耦合度較高。

Web 框架庫

flask:輕量級的 web 服務程式,簡單,易用,靈活,主要來做一些 API 服務。做代理時可能會用到。

django:一個 web 伺服器框架,提供了一個完整的後臺管理,引擎、介面等,使用它可做一個完整網站。
  1. Re庫的基本使用

    Re庫介紹:

     Re庫是Python的標準庫,主要用於字串匹配。
    
     呼叫方式:import re
    

    正規表示式的表示型別:

     raw string型別(原生字串型別):
    
         re庫採用raw string型別表示正規表示式,表示為:r'text'
    
         例如:r'[1-9]\d{5}'
    
         raw string是指不包含轉義符的字串
    
     string型別,更繁瑣。
    
         例如:'[1-9]\\d{5}';'\\d{3}-\\d{8}|\\d{4}-\\d{7}'
    

    當正規表示式包含轉義符時,建議使用raw string型別來表示正規表示式。

    Re庫主要功能函式:

函式

說明
re.search()

在一個字串中搜尋匹配正規表示式的第一個位置,返回match物件

re.match()

從一個字串的開始位置起匹配正規表示式,返回match物件

re.findall()

搜尋字串,以列表型別返回全部能匹配的字串

re.split()

將一個字串按照正規表示式匹配結果進行分割,返回列表型別

re.finditer()

搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件

re.sub()

在一個字串中替換所有匹配正規表示式的子串,返回替換後的字串
re.compile() 返回的是一個匹配物件,它單獨使用就沒有任何意義,需要和findall(), search(), match()搭配使用。

re.search(pattern,string,flags=0)

    在一個字串中搜尋匹配正規表示式的第一個位置,返回match物件。

        pattern:正規表示式的字串或原生字串表示

        string:待匹配字串

        flags:正規表示式使用時的控制標記

            re.I(re.IGNORECASE):忽略正規表示式的大小寫,[A-Z]能夠匹配小寫字元

            re.M(re.MULTILINE):正規表示式中的^操作符能夠將給定字串的每行當作匹配開始

            re.S(re.DOTALL):正規表示式中的.操作符能夠匹配所有字元,預設匹配除換行外的所有字元****!!!!****

                      

re.match(pattern, string, flags = 0)

    從一個字串的開始位置起匹配正規表示式,返回match物件。

        pattern:正規表示式的字串或原生字串表示

        string:待匹配字串

        flags:正規表示式使用時的控制標記

                        

re.findall(pattern, string, flags = 0)

    搜尋字串,以列表型別返回全部能匹配的子串。

        pattern:正規表示式的字串或原生字串表示

        string:待匹配字串

        flags:正規表示式使用時的控制標記

                        

re.split(pattern, string, maxsplit = 0, flags = 0)

    搜尋字串,以列表型別返回全部能匹配的子串。

        pattern:正規表示式的字串或原生字串表示

        string:待匹配字串

        maxsplit:最大分割數,剩餘部分作為最後一個元素輸出

        flags:正規表示式使用時的控制標記

                        

re.finditer(pattern, string, flags = 0)

    搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件。

        pattern:正規表示式的字串或原生字串表示

        string:待匹配字串

        flags:正規表示式使用時的控制標記

                           

re.compile()

compile()的定義:

    compile(pattern, flags=0) 
    Compile a regular expression pattern, returning a pattern object.

從compile()函式的定義中,可以看出返回的是一個匹配物件,它單獨使用就沒有任何意義,需要和findall(), search(), match()搭配使用。 
compile()與findall()一起使用,返回一個列表。

    import re
     
    def main():
        content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
        regex = re.compile('\w*o\w*')
        x = regex.findall(content)
        print(x)
     
     
    if __name__ == '__main__':
        main()
    # ['Hello', 'from', 'Chongqing', 'montain', 'to', 'you']


compile()與match()一起使用,可返回一個class、str、tuple。但是一定需要注意match(),從位置0開始匹配,匹配不到會返回None,返回None的時候就沒有span/group屬性了,並且與group使用,返回一個單詞‘Hello’後匹配就會結束。

    import re
     
    def main():
        content = 'Hello, I am Jerry, from Chongqing, a montain city, nice to meet you……'
        regex = re.compile('\w*o\w*')
        y = regex.match(content)
        print(y)
        print(type(y))
        print(y.group())
        print(y.span())
     
     
    if __name__ == '__main__':
        main()
    # <_sre.SRE_Match object; span=(0, 5), match='Hello'>
    # <class '_sre.SRE_Match'>
    # Hello
    # (0, 5)

compile()與search()搭配使用, 返回的型別與match()差不多, 但是不同的是search(), 可以不從位置0開始匹配。但是匹配一個單詞之後,匹配和match()一樣,匹配就會結束。

 

re.sub(pattern, repl, string, count = 0, flags = 0)

    在一個字串中替換所有匹配正規表示式的子串,返回替換後的字串。

        pattern:正規表示式的字串或原生字串表示

        repl:替換匹配字串的字串

        string:待匹配字串

        count:匹配的最大替換次數

        flags:正規表示式使用時的控制標記

相關文章