目錄
- 前言
- 一、BeautifulSoup的基本語法
- 二、爬取網頁圖片
- 擴展學習
- 后記
前言
本章同樣是解析一個網頁的結構信息
在上章內容中(python網絡爬蟲之解析網頁的正則表達式(爬取4k動漫圖片)[三])我們知道了可以使用re正則表達式來解析一個網頁。
但是這樣的一個解析方式可能對大部分沒有正則表達式的人來說就比較困難了,
額,就算會的,也會嫌麻煩。比如me( ̄︶ ̄)↗
那么我們本章同樣是學習解析,只不過這個解析的方式不需要特別的一個學習功底。
能夠分析一個網頁的結構就行了
φ(* ̄0 ̄)
本次的流程:
- 學習BeautifulSoup的基本語法
- 開始分析爬取
一、BeautifulSoup的基本語法
建議直接看官方文檔
如果有什么進階性的需求這章內容不能解決的話,就可以看官方文檔:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
下載lxml模塊
解析器的區別可以參考文檔上面的資料。
下好之后就可以測試了:
先給大家解析一波:
全部代碼
""" 學習使用beautifulsoup的語法 """ from bs4 import BeautifulSoup html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <p class="title"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> """ # 1、實例化一個BeautifulSoup對象,並標明用什么解釋器去解釋(lxml) soup = BeautifulSoup(html_doc, "lxml") # 按照格式化的內容排版 (優化排版) soup.prettify() print(soup)
# 2、獲取特定的標簽 (title) ps:如果有多個就返回第一個 print(soup.title)
# 3、獲取特定的標簽 (title) 里面的值 print(soup.title.string)
# 4、查詢特定的標簽 里面的值 print(soup.find("a"))
# 5、查詢全部標簽 以ResultSet的形式 print(soup.find_all("a")) # 查詢所有標簽為a的 print(soup.find_all("a", attrs={"id": "link2"})) # 查詢所有標簽為a的,並且屬性為id,屬性值為link2 print(soup.find_all(attrs={"id":"link3"})) # 查詢所有屬性為id,屬性值為link3的 print(soup.find_all(id="link1")) # 查詢所有屬性為id,屬性值為link1的
# 6、獲取父節點 print(soup.find_all(id="link1")[0].parent.name) # 它的屬性為ResultSet print(soup.find("a").parent.name)
# 7、獲取子節點 print(soup.find("p",attrs={"class":"story"}).contents) # 遍歷了所有內容 print(soup.find("p",attrs={"class":"story"}).clidren) # 有格式的遍歷 print(soup.find("p",attrs={"class":"story"}).descendants) # 遍歷子孫節點
# 8、獲取筒節點的上下節點 print(soup.find("p", attrs={"class", "story"})) print(soup.find(id="link2").next_sibling) # 下一個節點 print(soup.find(id="link2").previous_sibling.previous_sibling) # 上一個節點 print(soup.find(id="link2").previous_siblings) # 下面所有節點 print(soup.find(id="link2").previous_siblings) # 上面所有節點
# 9、獲取一個標簽中的屬性值 print(soup.find("a")["id"]) # 第一種方式 print(soup.find("a").get("id"))# 第二種方式
# 10、獲取一個標簽中的所有屬性值 print(soup.find("a").attrs) # 全部屬性 print(soup.find("a").attrs["class"]) # 獲取全部屬性中的class屬性的值 print(soup.find("a").attrs.get("id"))# 獲取全部屬性中的id屬性的值
二、爬取網頁圖片
這個僅僅就是用來學習的一個內容,學會了就可以自己去爬自己剛興趣的東西
爬取的對象:https://maoyan.com/board/4
分析:
代碼解讀:
全部代碼
""" BeautifulSoup綜合案例:爬取“貓眼電影的排行榜” """ import requests from bs4 import BeautifulSoup import os headers = { "Cookie":"__mta=55342740.1575370883618.1575371366305.1575371383145.4; uuid_n_v=v1; uuid=3DACA12015BC11EABE1E1379EFD48C6B2BC02A509AA141CD821BF91F9AF4D24A; _csrf=0f7d373e4f690e2a84b3d5383f941f44faa7316e764ded1cf46f088e34b40614; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1575370883; _lxsdk_cuid=16ecb6c014ec8-059803946267d8-2393f61-144000-16ecb6c014ec8; _lxsdk=3DACA12015BC11EABE1E1379EFD48C6B2BC02A509AA141CD821BF91F9AF4D24A; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1575371383; _lxsdk_s=16ecb6c014e-d7d-844-f5b%7C%7C15", "User-Agent": "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14" } response = requests.get("https://maoyan.com/board/4", headers=headers) # 獲取當前根目錄 root = os.getcwd() # 在根目錄中創建文件夾"第1頁" os.mkdir("第1頁") # 改變當前目錄 os.chdir("第1頁") if response.status_code == 200: # 解析網頁 soup = BeautifulSoup(response.text, "lxml") imgTags = soup.find_all("img", attrs={"class": "board-img"}) print(imgTags) for imgTag in imgTags: name = imgTag.get("alt") src = imgTag.get("data-src") resp = requests.get(src, headers=headers) with open(f"{name}.png", "wb") as f: f.write(resp.content) print(f"{name} {src} 保存成功")
擴展學習
""" BeautifulSoup綜合案例: 爬取“最好大學網”排行 """ import requests from bs4 import BeautifulSoup headers = { "User-Agent": "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14" } response = requests.get("http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html", headers=headers) response.encoding = "utf-8" if response.status_code == 200: soup = BeautifulSoup(response.text, "lxml") trTags = soup.find_all("tr", attrs={"class": "alt"}) for trTag in trTags: id = trTag.contents[0].string name = trTag.contents[1].string addr = trTag.contents[2].string sco = trTag.contents[3].string print(f"{id} {name} {addr} {sco}")
后記
本章的內容也是解析數據,但是對於正則表達式來說的話實在是方便太多了,
下一章的內容還是解析,不過是使用xpath解析
如果感覺本章寫的還不錯的話,不如。。。。。(~ ̄▽ ̄)~ ,(´▽`ʃ♡ƪ)