<wbr id="juant"></wbr>
  • <wbr id="juant"></wbr>
    更多課程 選擇中心


    Python培訓

    400-111-8989

    如何用Python做一只網絡爬蟲?

    • 發布: sgb
    • 來源: supgb
    • 時間:2018-01-31 13:14

    今天要跟大家分享的是一個有趣的且有效的工具——網絡爬蟲(Web Scraping)。首先跟大家簡短的介紹一下,網絡爬蟲是一種數據挖掘的方法,可以從網絡中抓取海量的數據,并把它存儲在本地的系統中。在當前流行的機器學習中也不乏它的應用,它提供了一種搜集數據的手段,畢竟如今時互聯網的時代,互聯網上有著取之不盡的數據。至于它的其他用途,那就考驗你的想象力嚕~

            現在,我們要做的用爬蟲在網上下載幾十篇我一直沒抽出時間看的 PDF。當然幾十篇的話我花上十幾分鐘也就可以手動下載完了,但是如果當數據多到成千上百了的時候你就可以真切地感受到網絡爬蟲帶給我們的便利了。好了,進入正題!

    準備


            要建造一只爬蟲需要什么工具呢?我們需要用到兩個Python的組件:urllib2、BeautifulSoup。其中urllib2在安裝Python3的時候本身就安裝好了,我們無需安裝,但是需要注意的是urllib2在python的導入應該為:

    import urllib.request

    安裝BeautifulSoup的方法請看:https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-beautiful-soup

    (有什么看不懂的請給我留言)。

    實戰


    接下來我們可以開動啦~首先,用瀏覽器打開我們今天要“爬”的網站:https://www.math.utah.edu/~zwick/Classes/Fall2012_2270/Lectures/

            

    可以按F12進入開發者模式,查看網站的 HTML 格式文件。

    接下來著手編輯Python文件,首先當然是導入我們先前說到的兩個Python模塊:


    import urllib.request as urllib2 from bs4 import BeautifulSoup as bfs 

            大家可以看到,BeautifulSoup 模塊的導入與其他模塊有些不同,這需要格外注意;其次,as 后面的名字是由自己取的,目的是簡化模塊名,不然你想想每次要用到 BeautifulSoup 模塊都得輸入那么多個字母那不得累死!所以我后面也將稱它為 bfs,哈哈哈哈。下一步是將我們要爬取的網站指定、并發起請求:


    # Specify the url we are going to scrap. index = "https://www.math.utah.edu/" \
            "~zwick/Classes/Fall2012_2270/Lectures/" # Query the website and return the html.  
    

    page = urllib2.urlopen(index)


            這里大家也可以揣測到urllib2.urlopen()函數便是用來發起請求的,并且它會返回一個 HTML ,我們將它存在 page 中。接下來我們需要將這個 HTML 格式的內容解析成方便我們使用的 bfs “格式”(暫且這么稱呼它吧~):


    # Parse the html. soup = bfs(page,"html5lib")

    現在我們可以先看一下我們當前的效果是怎樣的,通過輸入:


    print(soup.prettify()) 

            我們可以得到當前獲得頁面的 HTML 代碼(由于篇幅過大僅截取一部分):

            首先,<a>標記中是超鏈接的意思,“href” 則是該超鏈接的地址,但是從次片段我們可以發現,該“href”并不代表著我們要爬取的頁面的地址,正確的地址應該加上我們前面的主頁地址才完整:

    ”https://www.math.utah.edu/~zwick/Classes/Fall2012_2270/Lectures/“ + “href”中的值

            接著,我們需要得到的是所有帶有標簽<a>的項,因為我們需要得到每個 PDF 文件的鏈接才能實現下載:


    all_links = soup.find_all("a") 

    emmmmmm....沒錯,就這簡單的一句。

            得到標簽<a>之后,要考慮的就是如何得到<a>中的屬性“href”,幸好,bsf 早就為我們準備好了。由于是對于每一<a>標簽我們都需要獲取其屬性“href”,因此這里我們用一個 for 循環來解決這個問題:


    for link in all_links:
        downlink = link.get("href")
        if "Lecture" not in downlink:
            continue
        f = open("Linear algebra/"+downlink, "wb")
        f.write(urllib2.urlopen(index + downlink).read())
        print(downlink, "downloaded!")
        f.close() 

            嗯,這里我把剩下所有代碼都給出來了....總的代碼也不過24行,這就是我為什么不想一個一個 PDF 去下載的原因~

    先看第一行


    for link in all_links: 

            指的是在每一次循環中用 link 來存儲 all_links 的一個值,直到遍歷了 all_links 中所有的值才結束。

    再看


    downlink = link.get("href")
        if "Lecture" not in downlink:
            continue 

            這里我們新建了一個變量 downlink ,由于 link 中存的是一個 <a> 標簽,所以我們通過方法 get(“href”) 可以得到例如 <a href="Lecture1.pdf">中的 “Lecture1.pdf” 并存入downlink ,其類型是 String 字符串。

    接下來要考慮的問題是如何從我們獲取的鏈接中把 PDF 下載下來呢?

     第一我們要面對一個問題,如何篩選出哪些是我們需要的下載鏈接哪些不是呢,比如說對于網站中的 Name 、Last modified等并不是我們需要的鏈接,所以我們需要用一個 if 語句把這些過濾掉。這里我用的是對于那些屬性 “href” 中不含 “Lecture” 的均無需理睬,使用一句 continue 使循環回到頭部執行,而忽略循環后面的部分。


    過濾掉那些無用的鏈接之后對于得到的鏈接該怎么做呢?


    f = open("Linear algebra/"+downlink, "wb")
    f.write(urllib2.urlopen(index + downlink).read()) print(downlink, "downloaded!")
    f.close() 

            首先我們需要在運行這段程序前,在工程目錄下新建一個文件夾名為“Linear algebra”(因為我們的這些 PDF 正是我沒學好的線性代數)。再看這幾行代碼執行的邏輯為:

    1. 以二進制寫入的格式打開文件 “Linear algebra/” + downlink (是不是有點好奇為啥用上了 + 號,因為downlink也是一個字符串,連接兩個字符串我們用加號 + 來實現),例如下載 “Lecture1.pdf” 時,downlink = “Lecture1.pdf” 然后連在一起文件的路徑正是“Linear algebra/Lecture1.pdf”。有的同學可能又會好奇明明還沒下載下來我怎么打開這個文件呢?嗯,如果這個文件不存在的時候,Python會幫我們自動創建~

    2. urllib2.urlope(index + downlink)解決了我們之前說到的,超鏈接<a href="Lecture1.pdf"> 中“Lecture1.pdf” 不是正確的網址的問題,正確的網址應該是字符串 index 連上 downlink。(例如:https://www.math.utah.edu/~zwick/Classes/Fall2012_2270/Lectures/Lecture1.pdf),再運用read() 方法得到 pdf 文件的二進制碼,這時候用寫入方法write() 將文件寫入我們指定的名稱和路徑即可。

    3.  將該文件關閉。

    通過幾十個循環我們便可以將文件全部下載下來啦~碩果累累呀

    最后給出文章中完整的代碼(需要文件的同學后臺回復scrapPDF):


    import urllib.request as urllib2 from bs4 import BeautifulSoup as bfs # Specify the url we are going to scrap. index = "https://www.math.utah.edu/" \
            "~zwick/Classes/Fall2012_2270/Lectures/" # Query the website and return the html. page = urllib2.urlopen(index) # Parse the html. soup = bfs(page,"html5lib")
    
    all_links = soup.find_all("a") for link in all_links:
        downlink = link.get("href")
        if "Lecture" not in downlink:
            continue
        f = open("Linear algebra/"+downlink, "wb")
        f.write(urllib2.urlopen(index + downlink).read())
        print(downlink, "downloaded!")
        f.close() 

            經過這篇文章我們學會了怎么簡單的在網上抓取一些我們感興趣的內容,當然網絡爬蟲的用途以及難度遠不止如此,面對一些有相應保護措施的網站我們要做的就更多了,再后面的推文中我也會跟大家分享一些有趣的方法并做一些有趣的內容。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:Python環境搭建—Python環境安裝詳細教程
    下一篇:Python 導入csv報錯的解決辦法

    2021年Python面試題及答案匯總詳解

    python數據分析,你需要這些工具

    Python培訓講解二叉樹的三種深度

    Python培訓:如何實現窮舉搜索?

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    天天日天天射天天干天天伊|奇米电影|奇米网_奇米首页|奇米首页 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>