我們在工作中,都會聽說過爬蟲,那么什么是爬蟲呢?
什么是網絡爬蟲
爬蟲基本原理
所謂網絡爬蟲就是一個自動化數據采集工具,你只要告訴它要采集哪些數據,丟給它一個 URL,就能自動地抓取數據了。其背后的基本原理就是爬蟲程序向目標服務器發起 HTTP 請求,然后目標服務器返回響應結果,爬蟲客戶端收到響應並從中提取數據,再進行數據清洗、數據存儲工作。
爬蟲基本流程
爬蟲流程也是一個 HTTP 請求的過程,以瀏覽器訪問一個網址為例,從用戶輸入 URL 開始,客戶端通過 DNS 解析查詢到目標服務器的 IP 地址,然后與之建立 TCP 連接,連接成功后,瀏覽器構造一個 HTTP 請求發送給服務器,服務器收到請求之后,從數據庫查到相應的數據並封裝成一個 HTTP 響應,然后將響應結果返回給瀏覽器,瀏覽器對響應內容進行數據解析、提取、渲染並最終展示在你面前。
Beautiful Soup簡介
Beautiful Soup它通過定位HTML標簽來格式化和組織復雜的網絡信息,用python對象為我們展現XML結構信息。
Beautiful Soup每個節點都是Python對象,所有對象可以歸納為 4種:
1、Tag:表示一個標簽對象;
2、 NavigableString:表示一個字符對象
3、 BeautifulSoup:表示一個HTML對象
4、Comment :表示一個注釋對象
官方文檔:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
Beautiful Soup安裝
打開cmd,通過pip安裝
# 安裝BeautifulSoup4
pip install BeautifulSoup4
Beautiful Soup使用方法
1.根據request進入到想要爬去的頁面
2.導入BeautifulSoup模塊
3.創建BeautifulSoup對象
項目實戰
爬取有哪些笑話類型
# coding:utf-8 import requests from bs4 import BeautifulSoup # 通過request請求地址 r = requests.get("http://xiaohua.zol.com.cn/youmo/") # 獲取整個頁面的html bsobj = r.text # BeautifulSoup 實例化 soup = BeautifulSoup(bsobj,'html.parser') # html.parser 是python自帶的編輯器,如果不帶會一直提示異常 name = soup.find_all(class_='filter-links clearfix') # 找到全部的class內容 for i in name: title=i.select("a") # 查找關於a標簽的所有內容 for j in title: print(j.get_text()) 執行結果: 全部 冷笑話 幽默 愛情 爆笑男女 爆笑 綜合 兒童 校園 簡短 整人 經典 恐怖 動物 內涵 英語 小笑話 短信 短笑話 一句話 極品 數學 超級 短篇 四川方言 順口溜 名著暴笑 搞笑歌詞 戀愛必讀 求愛秘籍 原創 哈哈趣聞 數碼 重口味 搞笑 各地方言
html.parser 是python自帶的解析器,如果不帶會一直提示異常
UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. The code that caused this warning is on line 7 of the file XXXX. To get rid of this warning, pass the additional argument 'features="lxml"' to the BeautifulSoup constructor. blog = BeautifulSoup(r)
Beautiful Soup其他方法
print(soup.title) # 獲取頁面的標題 print(soup.title.string) # 獲取頁面標題字符串 print(soup.head) # 獲取頁面head print(soup.a) # 獲取頁面第一個a標簽 print(soup.find(class_='logo')) # 獲取單個具體內容 print(soup.find_all(class_='logo')) # 獲取頁面全部內容 print(soup.get_text()) # 獲取頁面全部文字
同時tag也可以進行刪改查
# 進行查看p標簽下class攜帶的內容 print(soup.p['class']) print(soup.p.get['class']) # 可以對屬性進行修改 soup.p['class']='NewClass' # 刪除標簽 del soup.p['class']