Python爬虫之旅_(数据解析)_bs4
生活随笔
收集整理的這篇文章主要介紹了
Python爬虫之旅_(数据解析)_bs4
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言:
這次來學習數據解析這方面的知識!
0x00:了解數據解析
在ONE那一篇中,就提到過聚焦爬蟲(爬取頁面中指定內容),大部分的爬蟲都是聚焦爬蟲,但我們剛開始爬取的肯定都是整個頁面的數據,如何定位到我們想要的那一部分數據,就用到了數據解析
數據解析主要通過以下三種進行:
加粗樣式
數據解析原理:
—— 解析的局部的文本內容都會在標簽之間或者標簽對應的屬性中進行存儲 一 1.進行指定標簽的定位 二 2.標簽或者標簽對應的屬性中存儲的數據值進行提取(解析)先練習一下爬取圖片:
爬取圖片
#爬取圖片 import requests if __name__ == "__main__":url = 'http://gaoxiao.jokeji.cn/UpFilesnew/2011/8/20/201182002041961.jpg'#content返回的是二進制形式的圖片數據img_data = requests.get(url=url).content#text(字符串) content(二進制數據) json(對象)with open('imag.jpg','wb') as fp:fp.write(img_data)print('Over')爬取成功:
0x01:使用bs4進行解析
bs4數據解析的原理: —— 1.實例化一個BeautifulSoup對象,并且將頁面源碼數據加載到該對象中 —— 2.通過調用BeautifulSoup對象中相關的屬性或者方法進行標簽定位和數據提取 如何實例化BeautifulSoup對象: —— from bs4 import BeautifulSoup —— 對象的實例化:—— 1.將本地的html文檔中的數據加載到該對象中fp = open('sogou.html','r',encoding='utf-8')soup = BeautifulSoup(fp,'lxml')—— 2.將互聯網上獲取的網頁源碼加載到該對象中page_text = response.textsoup = BeautifulSoup(page_text,'lxml')—— 提供用于數據解析的方法和屬性:soup.tagName:返回的是文檔中第一次出現的tagName對應的標簽(單數,只能返回一個)soup.find('tagName'):等同于soup.tagName(單數)—— 屬性定位:——soup.find('div',class_/(還可以是其他的屬性)='bg-gj-w')#下劃線是為了區分關鍵字——soup.find_all('a')(多個數)#返回要求的所有標簽(列表)—— select:——soup.select('.dingpai > li > a')# >表示的是一個層級——soup.select('.dingpai a')#空格表示的是多個層級#層級選擇器——獲取標簽之間的文本數據:——soup.a.text/string/get_text()——區別:text/get_text():可以獲取某一個標簽中所有的文本內容string:只可以獲取該標簽下面直系的文本內容 ——獲取標簽中屬性值:—— soup.a['href']測試文檔:
<div class="dingpai"> <li> <a id="ding79" href="javascript:ding('79','http://so.gushiwen.org/shiwenv.aspx?id=8dd719a833f0')">有用</a> <a id="pai79" style=" margin-left:10px;" href="javascript:pai('79','http://so.gushiwen.org/shiwenv.aspx?id=8dd719a833f0')">沒用</a> <a style="width:34px; height:18px; line-height:19px; margin-top:2px; float:right; color:#aeaeae;" href="/jiucuo.aspx?u=%e7%bf%bb%e8%af%9179%e3%80%8a%e8%af%91%e6%96%87%e5%8f%8a%e6%b3%a8%e9%87%8a%e3%80%8b" target="_blank">完善</a> </li> </div>練習代碼:
from bs4 import BeautifulSoup if __name__ == "__main__":#將本地的html文檔的數據加載到該對象中fp = open('test.html','r',encoding='utf-8')soup = BeautifulSoup(fp,'lxml')# print(soup.a)# print(soup.find('div',class_='dingpai').get_text())# print(soup.find_all('a'))# print(soup.select('.dingpai > li > a')[0])# print(soup.select('.dingpai a')[0])# print(soup.select('.dingpai a')[0].text)# print(soup.select('.dingpai a')[0].get_text())# print(soup.select('.dingpai a')[0]['href'])0x02:爬取三國演義小說
練習了基本的一些操作,接下來利用這個模塊爬取一下三國演義的小說:
要做的就是將 標題 和 標題對應的內容爬取保存到本地
一開始還是先要爬取整個頁面的數據(通用爬蟲):
import requests from bs4 import BeautifulSoupif __name__ == '__main__':#URLurl = 'http://shicimingju.com/book/sanguoyanyi.html'#UA偽裝headers = {'User-Agent' : 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}#獲取頁面數據content = requests.post(url=url,headers=headers).text爬取整個頁面數據之后再來看,標題和對應的URL在那個標簽中
既然知道了層級關系,就行先來解析出標題:
import requests from bs4 import BeautifulSoupif __name__ == '__main__':#URLurl = 'http://shicimingju.com/book/sanguoyanyi.html'#UA偽裝headers = {'User-Agent' : 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}#獲取頁面數據content = requests.post(url=url,headers=headers).text#實例化對象soup = BeautifulSoup(content,'lxml')# print(soup)#解析文章標題和標題對應的urlli_list = soup.select('.book-mulu > ul > li')for li in li_list:title = li.a.string#拼接成完整的urltitle_url = 'http://shicimingju.com'+li.a['href']print(title)print(title_url)運行結果:
接下來觀察詳情頁的標簽
發現內容全部在p標簽下,那我們是不是提取出所有p標簽再進行處理一下就可以了
每一個章節爬取的url在這里就要用的了,在每個章節詳情頁再重新實例化一個對象,使用循環即可爬出所有章節內容
import requests from bs4 import BeautifulSoupif __name__ == '__main__':#URLurl = 'http://shicimingju.com/book/sanguoyanyi.html'#UA偽裝headers = {'User-Agent' : 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}#獲取頁面數據content = requests.post(url=url,headers=headers).text#實例化對象soup = BeautifulSoup(content,'lxml')# print(soup)#解析文章標題和標題對應的urlli_list = soup.select('.book-mulu > ul > li')fp = open('sanguo.txt','w',encoding='utf-8')for li in li_list:title = li.a.stringtitle_url = 'http://shicimingju.com'+li.a['href']# print(title)# print(title_url)#對詳情頁發起請求,解析內容details_text = requests.get(url=title_url,headers=headers).text#解析內容detail_soup = BeautifulSoup(details_text,'lxml')detail_text = detail_soup.find('div',class_='chapter_content')contents = detail_text.textfp.write(title +':'+ contents+ '\n')print(title+':爬取成功')
爬取成功!
總結:
哇 這爬蟲真的越學習越有意思,下次學習數據解析中的xpath
總結
以上是生活随笔為你收集整理的Python爬虫之旅_(数据解析)_bs4的全部內容,希望文章能夠幫你解決所遇到的問題。