python爬蟲(二)——第一個爬蟲程序


  1. BeautifulSoul      

    

Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。

Beautiful Soup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。然后,你僅僅需要說明一下原始編碼方式就可以了。

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

  通過定位 HTML 標簽來格式化和組織復雜的網絡信息,用簡單易用的 Python 對象為我們展現 XML 結構信息。 它包含三個對象:

  • BeautifulSoup
  • Tag
  • NavigableString

    使用方法:

  1>導入bs4庫和urllib庫(用於打開html網頁):

    

from bs4 import BeautifulSoup
from urllib.request import urlopen

  2>創建一個BeautifulSoup對象:

  

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")
bsObj = BeautifulSoup(html)

  其中,http://www.pythonscraping.com/pages/page3.html  是一個簡單的用於測試爬蟲程序的網頁:

  3>.find() 與 .findAll() 函數

   例如:nameList = bsObj.findAll("span", {"class":"green"}) ;抽取所有屬性為 green的span標簽內的文字,find()和findAll()是最常用的兩個函數,借助它們,利用標簽的不同屬性輕松地過濾HTML頁面,查找需要的標簽組或者標簽。

  用法:

  •   findAll(tag, attributes, recursive, text, limit, keywords)
  •   find(tag, attributes, recursive, text, keywords)

  多數情況下可能只需要用到前兩個參數,tag和attributes,attributes指HTML標簽的屬性,遞歸參數 recursive 是一個布爾變量。你想抓取 HTML 文檔標簽結構里多少層的信息?如果recursive 設置為 TruefindAll 就會根據你的要求去查找標簽參數的所有子標簽,以及子標簽的子標簽。如果 recursive 設置為 FalsefindAll 就只查找文檔的一級標簽。 findAll默認是支持遞歸查找的( recursive 默認值是 True);一般情況下這個參數不需要設置,除非你真正了解自己需要哪些信息,而且抓取速度非常重要,那時你可以設置遞歸參數

      text參數用於匹配標簽的文本內容,如:nameList = bsObj.findAll(text="the prince")

  keword可以選擇具有制定屬性的標簽。

      

  2. 第一個爬蟲程序:

  先貼代碼:

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
def getTitle(url):
    try:
        html = urlopen(url)
    except HTTPError as e:
        return None
    try:
        bsObj = BeautifulSoup(html.read(),'lxml')
        title = bsObj.body.h1
    except AttributeError as e:
        return None
    return title
title = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title == None:
    print("Title could not be found")
else:
    print(title)

  輸出目標網頁內title標簽內的文本:<h1>An Interesting Title</h1>,getTitle()函數返回網頁的標題,如果獲取網頁遇到問題就返回一個 None 對象。 如果服務器不存在, html 就是一個 None 對象,html.read() 就會拋出 AttributeError 。


    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM