1.導入子產品
import urllib.request
from bs4 import BeautifulSoup
2.添加頭檔案,防止爬取過程被拒絕連結
def qiuShi(url,page):
################### 模拟成高仿度浏覽器的行為 ##############
# 設定多個頭檔案參數,模拟成高仿度浏覽器去爬取網頁
heads ={
'Connection':'keep-alive',
'Accept-Language':'zh-CN,zh;q=0.9',
'Accept':'text/html,application/xhtml+xml,application/xml;
q=0.9,image/webp,image/apng,*/*;q=0.8',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
}
headall = []
for key,value in heads.items():
items = (key,value)
# 将多個頭檔案參數一個一個添加到headall清單中
headall.append(items)
# print(headall)
# print('測試1--')
# 建立opener對象
opener = urllib.request.build_opener()
# 添加頭檔案到opener對象
opener.addheaders = headall
# 将opener對象設定成全局模式
urllib.request.install_opener(opener)
# 爬取網頁并讀取資料到data
data = opener.open(url).read().decode()
# data1 = urllib.request.urlopen(url).read().decode('utf-8')
# print(data1)
# print('測試2--')
################## end ########################################
3.建立soup解析器對象
soup = BeautifulSoup(data,'lxml')
x = 0
4.開始使用BeautifulSoup4解析器提取使用者名資訊
############### 擷取使用者名 ########################
name = []
# 使用bs4解析器提取使用者名
unames = soup.find_all('h2')
# print('測試3--',unames)
for uname in unames:
# print(uname.get_text(),'第',page,'-',str(x)+'使用者名:',end='')
# 将使用者名一個一個添加到name清單中
name.append(uname.get_text())
# print(name)
# print('測試4--')
#################end#############################
5.提取發表的内容資訊
發表的内容
cont = []
data4 = soup.find_all('div',class_='content')
# print(data4)
# 記住二次篩選一點要轉換成字元串形式,否則報錯
data4 = str(data4)
# 使用bs4解析器提取内容
soup3 = BeautifulSoup(data4,'lxml')
contents = soup3.find_all('span')
for content in contents:
# print('第',x,'篇糗事的内容:',content.get_text())
# 将内容一個一個添加到cont清單中
cont.append(content.get_text())
# print(cont)
# print('測試5--')
##############end####################################
**6.提取搞笑指數**
#################搞笑指數##########################
happy = []
# 擷取搞笑指數
# 第一次篩選
data2 = soup.find_all('span',class_="stats-vote")
# 擷取搞笑指數
# 第二次篩選
data2 = str(data2) # 将清單轉換成字元串形式才可以使用
# print(data2)
# print('測試6--')
soup1 = BeautifulSoup(data2,'lxml')
happynumbers = soup1.find_all('i',class_="number")
for happynumber in happynumbers:
# print(happynumber.get_text())
# 将将搞笑數一個一個添加到happy清單中
happy.append(happynumber.get_text())
# print(happy)
# print('測試7--')
##################end#############################
如果你跟我一樣都喜歡python,想成為一名優秀的程式員,也在學習python的道路上奔跑,歡迎你加入python學習群:python群号:491308659 驗證碼:南燭
群内每天都會分享最新業内資料,分享python免費課程,共同交流學習,讓學習變(編)成(程)一種習慣!
7.提取評論數
############## 評論數 ############################
comm = []
data3 = soup.find_all('a',class_='qiushi_comments')
data3 = str(data3)
# print(data3)
soup2 = BeautifulSoup(data3,'lxml')
comments = soup2.find_all('i',class_="number")
for comment in comments:
# print(comment.get_text())
# 将評論數一個一個添加到comm清單中
comm.append(comment.get_text())
############end#####################################
8.使用正規表達式提取性别和年齡
######## 擷取性别和年齡 ##########################
# 使用正規表達式比對性别和年齡
pattern1 = '<div class="articleGender (w*?)Icon">(d*?)</div>'
sexages = re.compile(pattern1).findall(data)
# print(sexages)
9.設定使用者所有資訊輸出的格局設定
################## 批量輸出使用者的是以個人資訊 #################
print()
for sexage in sexages:
sa = sexage
print('*'*17, '=_= 第', page, '頁-第', str(x+1) + '個使用者 =_= ','*'*17)
# 輸出使用者名
print('【使用者名】:',name[x],end='')
# 輸出性别和年齡
print('【性别】:',sa[0],' 【年齡】:',sa[1])
# 輸出内容
print('【内容】:',cont[x])
# 輸出搞笑數和評論數
print('【搞笑指數】:',happy[x],' 【評論數】:',comm[x])
print('*'*25,' 三八分割線 ','*'*25)
x += 1
###################end##########################
10.設定循環周遊爬取13頁的使用者資訊
for i in range(1,14):
# 糗事百科的網址
url = 'https://www.qiushibaike.com/8hr/page/'+str(i)+'/'
qiuShi(url,i)
運作結果,部分截圖:
