目的:獲取糗事百科段子
思路:
1、爬取網頁
2、然後根據正則爬取出 關鍵內容
3、根據關鍵內容 再用正則匹配出 對應的用戶名和內容
4、循環賦值進行輸出
源碼:
import urllib.request
import re
def getcontent(url, page):
headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 將opener安裝爲全局
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read().decode("utf-8")
# 構建對應用戶提取的正則表達式
userpat = '<h2>(.*?)</h2>\n[</a>\n<div class="articleGender|</span>\n<!-- <div class="articleGender]' # 存在匿名用戶 所有需要兩種條件
# 構建對應段子內容提取的正則表達式
contentpat = '<div class="content">\n<span>(.*?)\n</span>'
# 找出所有用戶
# re.S 將“\n”當做一個普通的字符加入到這個字符串中,在整體中進行匹配
userlist = re.compile(userpat, re.S).findall(data)
# 找出所有內容
contentlist = re.compile(contentpat, re.S).findall(data)
x = 1
# 通過for循環遍歷段子內容並將內容分別賦給對應的變量
for content in contentlist:
content = content.replace("\n", "")
# 用字符串作爲變量名,現將對應字符串賦給一個變量
name = "content"+str(x)
# 通過exec()函數實現用字符串作爲變量名並賦值
exec(name+'=content')
x += 1
y = 1
# 通過for循環遍歷用戶,並輸出該用戶對應的內容
for user in userlist:
user = user.replace("\n", "")
name = "content"+str(y)
print("用戶 " + str(page)+str(y)+" 是: " + user)
print("內容是: ")
exec("print( " + name + ")")
print("\n")
y += 1
# 分別獲取各項各頁的段子,通過for循環可以獲取多頁
for i in range(1, 3):
url = "https://www.qiushibaike.com/8hr/page/"+str(i)
getcontent(url, i)
結果:
注意:如果糗事百科網頁代碼結構發生變化那麼上述代碼中的URL以及網址的正則表達式也是需要改變的。
如有疑問可以留言 看到都會回覆的說~