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

  1. BeautifulSoul      

    

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

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

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

  經過定位 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頁面,查找須要的標籤組或者標籤。
url

  用法:

  •   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 。    

相關文章
相關標籤/搜索