1. 程式人生 > >初識python爬蟲 Python網路資料採集1.0 BeautifulSoup安裝測試

初識python爬蟲 Python網路資料採集1.0 BeautifulSoup安裝測試

*文章說明這個學習資料是Ryan Mitchel的著作<Web Scraping with Python: Collecting Data from the Modern Web>我算是一步一步跟著一起去學習。分享自及遇到的問題。總結

*環境說明我使用的是python3.5+python2.7共存。

1.0.1

安裝BeautifulSoup

windows

cmd執行下面命令

pip3 install beautifulsoup4

Linux 

sudo apt-get install python-bs4

對於 Mac 系統

首先用

sudo easy_install pip

安裝 Python 的包管理器 pip,

然後執行來安裝庫檔案。

pip install beautifulsoup4

另外,如果你的裝置同時安裝了 Python 2.x 和 Python 3.x,

當你安裝包的時候,如果有可能安裝到了 Python 2.x 而不是 Python 3.x 裡,就需要使用 pip3 安裝 Python 3.x 版本的包:

pip3 install beautifulsoup4

你可以在python終端中驗證一下是否安裝成功

cmd中輸入

python3
from bs4 import BeautifulSoup


沒有報錯證明成功了。

可以做一個簡單的嘗試

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


這裡我有出現warning,並不影響程式第二次就沒有了,可以嘗試調取其他的函式

print(bsObj.h1)
print(bsObj.html.body.h1)
print(bsObj.html.body.div)

其實考慮到網路與諸多原因,我們這樣寫程式碼是不行的,

html = urlopen("http://www.pythonscraping.com/pages/page1.html")

這行程式碼主要可能會發生兩種異常:
1.網頁在伺服器上不存在(或者獲取頁面的時候出現錯誤)

2.伺服器不存在(就是說連結 http://www.pythonscraping.com/ 打不開,或者是 URL 連結寫錯了),

第一種異常發生時,程式會返回 HTTP 錯誤。HTTP 錯誤可能是“404 Page Not Found”“500Internal Server Error”等。我們可以用下面的方式處理這種異常

try:
 html = urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
 print(e)
 # 返回空值,中斷程式,或者執行另一個方案
else:
 # 程式繼續。注意:如果你已經在上面異常捕捉那一段程式碼裡返回或中斷(break),

 # 那麼就不需要使用else語句了,這段程式碼也不會執行

如果程式返回 HTTP 錯誤程式碼,程式就會顯示錯誤內容,不再執行 else 語句後面的程式碼

第二種異常發生時urlopen 會返回一個 None 物件。這個物件與其他程式語言中的 null 類似。我們

可以增加一個判斷語句檢測返回的 html 是不是 None:

if html is None:
 print("URL is not found")
else:

 # 程式繼續

當然了你調取函式的時候也會出現問題,如果你想要呼叫的標籤不存在也會出現問題

如果你想要呼叫的標籤不存在,BeautifulSoup 就會返回 None 物件。不過,如果再呼叫這個 None 物件下面的子標籤,就會發生 AttributeError錯誤。比如

print(bsObj.bucunzai)


繼續調取該標籤下的子標籤

 print(bsObj.bucunzai.ex)


則出現AttributeError錯誤。

所以每當你呼叫 BeautifulSoup 物件裡的一個標籤時,增加一個檢查條件保證標籤確實存在。

try:
    badContent = bsObj.nonExistingTag.anotherTag
except AttributeError as e:
    print("Tag was not found")
else:
    if badContent is None:
        print("Tag was not found")
    else:
        print(badContent)

所以寫了另一種比較嚴謹的的實現方式

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())
        title = bsObj.body.h1
    except AttributeError as e :
          return None
    return title
title = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title is None:
    print("Title could not be found")
else:
    print(title)

如果獲取網頁的時候遇到問題就返回一個 None 物件。在 getTitle 函式裡面,我們像前面那樣檢查了HTTPError,然後把兩行 BeautifulSoup 程式碼封裝在一個 try 語句裡面。這兩行中的任何一行有問題,AttributeError 都可能被丟擲(如果伺服器不存在,html 就是一個 None 物件,html.read() 就會丟擲 AttributeError)。