elasticsearch入門系列">elasticsearch入門系列
674
2022-05-30
這篇文章是爬蟲系列第三期,講解使用 Python 連接到網站,并使用 BeautifulSoup 解析 HTML 頁面。
在 Python 中我們使用 requests 庫來訪問目標網站,使用 BeautifulSoup 對獲取的內容進行解析。由于這兩個庫并不是 Python 標準庫,因此需要單獨安裝這兩個庫:
pip install beautifulsoup4 pip install requests
下面是獲取網站內容的示例代碼:
from urllib.error import HTTPError, URLError import requests from bs4 import BeautifulSoup from config import logger_config class ProcessConnection: def __init__(self): logger_name = ‘web_scraping' self._logger_write_file = logger_config.LoggingConfig().init_logging(logger_name) def init_connection(self, uri): # 連接網站 try: session = requests.session() headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"} html = session.get(uri, headers=headers) except (HTTPError, URLError) as e: self._logger_write_file.error('執行 get_sms_data 函數出錯,具體錯誤內容:{message}'.format(message=e)) return False try: bsObj = BeautifulSoup(html.text, features='html.parser') return bsObj except AttributeError as e: self._logger_write_file.error('執行 get_sms_data 函數出錯,具體錯誤內容:{message}'.format(message=e)) return False
首先使用了 requests 會話對象發送請求,并且設置了 User-agent,這里 User-agent 可以自定,這就為偽造 User-agent 提供了便利,同時也告訴了服務器客戶端接受那些內容類型:
session = requests.session() headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"}
網絡如果連接出現了錯誤,對錯誤進行異常處理:
except (HTTPError, URLError) as e:
BeautifulSoup 解析 HTML 文檔出現錯誤,拋出 AttributeError:
except AttributeError as e:
以上就完成了一個使用 Python 連接網站的過程。這個時候如果沒有異常我們就會拿到網站的 HTML 代碼,之后根據需要進一步對 HTML 進行內容解析,獲取自己需要的內容。
解析 HTML
如果你已經確定了目標內容,可能是采集一個名字,一組統計數據,或者一段文字。你的目標內容可能隱藏在一個 HTML “爛泥堆”的第20層標簽里,帶有許多沒用的標簽或 HTML 屬性,你按照目標網站的代碼層級你有可能寫出如下的一行代碼抽取內容:
bsObj.findAll("table")[4].findAll("tr")[2].find("td").findAll("section")[1].find("a")
雖然以上寫法可以達到目標,但是這樣的寫法看起來并不是很好。除了代碼欠缺美感之外,還有一個問題就是:當網站管理員對網站稍作修改之后,這行代碼便會失效。
例如,我們需要獲得自己的公網 IP 地址,我們可以通過查詢這個網站獲得:https://www.pdflibr.com,之后查看網頁源代碼,找到自己的 IP 地址,又如下源代碼:
我們使用 BeautifulSoup 經行解析:
result = bsObj.findAll("div", {"class": "right-result"}) for child in result: get_ip = child.get_text() print(get_ip)
這樣就可以獲取自己的 IP 以及 IP 歸屬地。
HTML Python 爬蟲 網站
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。