當前位置:
首頁 > 最新 > Python爬蟲簡介

Python爬蟲簡介

標題

  • Python爬蟲簡介

  • 基礎知識

  • requests庫

  • 提交請求

  • 響應內容

  • BeautifulSoup

    BeautifulSoup使用方法

    Selenium+PhantomJS

    Python爬蟲簡介

    爬蟲是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。通過使用爬蟲計算我們可以輕鬆快速的獲取我們所需要的信息,python作為腳本語言可以通過少量的代碼即可編寫網路爬蟲。在為大家介紹編寫爬蟲腳本的常用工具庫之前先為大家介紹一些前端的基礎知識。

    基礎知識

    網頁前端的三要素是HTML+CSS+JavaScript,其中HTML中有網頁大量的信息,因此爬蟲主要是抓取和解析網頁的HTML。

    HTML是用來描述超文本的一門標記語言,我們日常中所看到的網頁界面只不過是瀏覽器通過將特定格式的字元串進行解析使我們看到一個可視化的具有一定格式的界面,但是其實質上就是一堆格式化的字元串。我們爬蟲所要提取的內容就是根據需求篩選出特定的目的信息。CSS也被稱為樣式文件,其作用就是規定顯示的諸如邊界顏色等格式。

    JavaScript作為一門腳本語言在網頁前端起到的是邏輯控制的功能,比如動態的顯示數據進行非同步請求或者表單驗證等等。

    Cookies是伺服器返回給瀏覽器的一組信息,目的是為了可以追蹤識別用戶。Session保存在伺服器內存中用於跟蹤會話,它和cookie的生存周期不一樣,當會話結束後Session的生存周期就結束了,但是Cooikes有著更長的生存周期,因此我們經常通過保存cookies使得我們的爬蟲保存登錄狀態。

    requests庫

    爬蟲的策略有很多種,比較常用的就是使用requests爬取,然後交給BeautifulSoup庫進行解析。這種策略可以抓取絕大部分的網頁,但無法抓取js渲染的網頁,因為Python只能通過HTTP請求獲取到HTML、CSS、JS原始代碼而已。

    提交請求

    HTTP請求類型有:GET、POST、PUT、DELETE、HEAD以及OPTIONS六種,我們一般會用到的只有GET和POST這兩種。我們可以通過以下代碼即可爬取網頁的HTML

    當然以上是最簡單的網路請求,我們還可以通過params關鍵字傳入更多的參數提交更複雜的請求

    如上所示實際上我們訪問的URL為https://www.baidu.com/s?wd=requests,用瀏覽器打開這個網頁你會發現我們在百度上搜索requests關鍵字,因為get方法是通過URL訪問網頁,get方法會把傳給params的參數組裝成新的url進行訪問。

    有些時候我們希望給我們的請求定製請求頭,這是我們可以通過傳入一個字典給headers參數即可,類似的,像是cookies和proxy(代理伺服器)等參數均是接受一個字典作為參數。

    除此以外,我們還可以傳入timeout參數告訴 requests 在經過以 timeout 參數設定的秒數時間之後停止等待響應。

    post方法主要用於提交網頁表單,他通過傳入data參數提交數據,例子如下

    Post方法使用起來比較複雜,首先你需要找到真正的請求伺服器,並且根據它的請求主體編寫請求。

    響應內容

    get和post方法返回response對象,它是網頁的響應內容,並且我們可以根據它返回的內容用合適的方法對它進行解析。例如

    並且在解析為文本的時候我們還可以指定字元編碼來解析,通常使用網頁指定的編碼

    但是我們的請求不一定總會成功有些時候可能會出點差錯,我們可以通過response.stauts_code獲取伺服器返回的狀態碼,狀態碼200為響應成功。如果網頁沒能正確的響應,我們可以response.raise_for_status()拋出異常。

    BeautifulSoup

    BeautifulSoup是一個用於解析網頁的第三方庫,它提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。並且它自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式。

    現在Beautiful Soup已成為和lxml、html6lib一樣出色的python解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。

    下表列出了主要的解析器,以及它們的優缺點:

    推薦使用lxml作為解析器,因為效率更高. 在Python2.7.3之前的版本和Python3中3.2.2之前的版本,必須安裝lxml或html5lib, 因為那些Python版本的標準庫中內置的HTML解析方法不夠穩定.

    BeautifulSoup使用方法

    由於我們只是使用BeautifulSoup對爬取的網頁進行解析,因此我們只需掌握如何查找我們想要的內容即可,其中find_all是我們最常用的方法,我們通過傳遞不同的過濾器,使得find_all以不同的方式來查找我們想要的內容。例如以下代碼查找文檔中所有的標籤並以列表的形式返回

    有些時候我們並不希望完全匹配,這是我們可以使用正則表達式。我們使用以下的代碼就可以匹配以b開頭的表情

    我們還可以傳入一個函數進行查找,例如一下代碼可以返回含有class但不含id屬性的標籤。

    更一般的,find_all()函數的參數如下

    name是標籤的名字,kwargs可以傳入描述標籤的屬性。例如一下代碼查找了標籤名為a,含有屬性id且值為』link2』的標籤。

    需要注意的是,class是python中的保留字,所以我們可以通過 class_ 參數搜索有指定CSS類名的tag。

    我們還可以指定text參數按照標籤的文本進行查找,並且在我們不需要全部結果的時候,我們可以通過設定limit參數限制返回的數量以減少搜索的時間。

    如果你熟悉CSS選擇器的話,你還可以使用Soup.select()方法。

    Selenium+PhantomJS

    Selenium是一個用於Web應用程序測試的工具,同時我們可以使用它來模擬真實瀏覽器對URL進行訪問從而對網頁進行爬取。Selenium的往往要配合PhantomJS使用,PhantomJS是一個無界面的,可腳本編程的WebKit瀏覽器引擎。Selenium+PhantomJS可以抓取那些使用JS載入數據的網頁。你可以試著使用requests去抓取B站首頁,你會發現,你抓取不到那些具體的視頻名稱及鏈接,但是我們可以通過以下代碼抓取

    在獲取完全載入的網頁源碼後,你可以使用BeautifulSoup對網頁進行進一步的解析。

    有些時候網頁的一些內容需要瀏覽器執行特定操作的時候才會更新。常刷微博的朋友應該知道,將滾動條拖到底部,瀏覽器才會繼續刷出新的微博,我們可以讓我們的瀏覽器執行一段腳本實現這麼一種操作。

    如果說有需要執行特定的點擊或者輸入操作的話,我們可以先查找這些元素再調用其他方法。Selenium提供了很多的方法用來選取元素,例如通過類名、id等屬性等等,但最快速的方法是使用CSS選擇器進行選取

    具體的使用方法,可以在w3school查看

    在爬取之前,我們需要配置我們的無頭瀏覽器,否則很容易被伺服器識別出機器人,

    資料來源:

    官方文檔以及網上各位大佬的博文


    喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

    本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


    請您繼續閱讀更多來自 Python 的精彩文章:

    Python成長日記-初識裝飾器
    我是如何用Python獲取整個學校女生電話和QQ?技術撩妹

    TAG:Python |