一、實現數據爬取流程
- 指定url
- 基於requests模塊發起請求
- 獲取響應對象中的數據
- 數據解析
- 進行持久化存儲
在持久化存儲之前需要進行指定數據解析。因為大多數情況下的需求,我們都會指定去使用聚焦爬蟲,也就是爬取頁面中指定部分的數據值,而不是整個頁面的數據。
二、BeautifulSoup環境安裝
環境配置
- 需要將pip源設置為國內源,阿里源、豆瓣源、網易源等 - windows (1)打開文件資源管理器(文件夾地址欄中) (2)地址欄上面輸入 %appdata% (3)在這里面新建一個文件夾 pip (4)在pip文件夾里面新建一個文件叫做 pip.ini ,內容寫如下即可 [global] timeout = 6000 index-url = https://mirrors.aliyun.com/pypi/simple/ trusted-host = mirrors.aliyun.com
- linux (1)cd ~ (2)mkdir ~/.pip (3)vi ~/.pip/pip.conf (4)編輯內容,和windows一模一樣
環境安裝
- 需要安裝:
# 安裝BeautifulSoup
pip install bs4
# bs4在使用時候需要一個第三方庫,把這個庫也安裝一下
pip install lxml
三、bs4基礎使用
注意:
- lxml就是一款解析器
- find_all與select返回結果是復數形式(列表)
使用流程: - 導包:from bs4 import BeautifulSoup - 使用方式:可以將一個html文檔,轉化為BeautifulSoup對象,然后通過對象的方法或者屬性去查找指定的節點內容 (1)轉化本地文件: - soup = BeautifulSoup(open('本地文件'), 'lxml') (2)轉化網絡文件: - soup = BeautifulSoup('字符串類型或者字節類型', 'lxml') (3)打印soup對象顯示內容為html文件中的內容
基礎鞏固: (1)根據標簽名查找 - soup.a 只能找到第一個符合要求的標簽
- soup.div 只能找到第一個div標簽
(2)獲取屬性 - soup.a.attrs 獲取a所有的屬性和屬性值,返回一個字典 - soup.a.attrs['href'] 獲取href屬性 - soup.a['href'] 也可簡寫為這種形式
(3)獲取內容 - soup.a.string # string獲取的是標簽中直系的文本內容 - soup.a.text # text獲取的是當前標簽下所有文本內容,包括子標簽 - soup.a.get_text() 【注意】如果標簽還有標簽,那么string獲取到的結果為None,而其它兩個,可以獲取文本內容
(4)find:找到第一個符合要求的標簽 - soup.find('a') 找到第一個符合要求的 - soup.find('a', title="xxx") 獲取title=xxx的第一個標簽 - soup.find('a', alt="xxx") h獲取alt=xxx的第一個標簽 - soup.find('a', class_="xxx") ... - soup.find('a', id="xxx") ...
(5)find_all:找到所有符合要求的標簽 - soup.find_all('a') - soup.find_all(['a','b']) 找到所有的a和b標簽 - soup.find_all('a', limit=2) 限制前兩個
(6)根據選擇器選擇指定的內容 - soup.select('#tang') - 常見的選擇器:標簽選擇器(a)、類選擇器(.)、id選擇器(#)、層級選擇器 - 層級選擇器: select(".tang li") #class=tang標簽下面的所有li標簽,包含所有層級 div > p > a > .lala # 只能是下面一級 【注意】select選擇器返回永遠是列表,需要通過下標提取指定的對象
總結:層級選擇器定位返回總是一個復數(列表)
-
-
- 類選擇器,id選擇器,標簽選擇器,層級選擇器
- 層級選擇器:>表示一個層級,空格表示多個層級
-
四、項目實戰(詩詞名句網)
需求:使用bs4實現將詩詞名句網站中三國演義小說的每一章的內容爬去到本地磁盤進行存儲
網址:http://www.shicimingju.com/book/sanguoyanyi.html
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from bs4 import BeautifulSoup
# 配置請求頭 headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', }
# 網站詩詞內容下載 def parse_content(url): #獲取標題正文頁數據 page_text = requests.get(url,headers=headers).text soup = BeautifulSoup(page_text,'lxml') #解析獲得標簽 ele = soup.find('div',class_='chapter_content') content = ele.text #獲取標簽中的數據值 return content if __name__ == "__main__": url = 'http://www.shicimingju.com/book/sanguoyanyi.html' reponse = requests.get(url=url,headers=headers) page_text = reponse.text #創建soup對象 soup = BeautifulSoup(page_text,'lxml') #解析數據 a_eles = soup.select('.book-mulu > ul > li > a') print(a_eles) cap = 1 for ele in a_eles: print('開始下載第%d章節'%cap) cap+=1 title = ele.string content_url = 'http://www.shicimingju.com'+ele['href'] content = parse_content(content_url) with open('./sanguo.txt','w') as fp: fp.write(title+":"+content+'\n\n\n\n\n') print('結束下載第%d章節'%cap)