最近在學習python爬蟲,看到了崔大神的博客,由于他使用的python2.x,于是自己就想用python3實現一下,練練手。有哪些可以改進的地方,望指正。謝謝!
本篇目標
1.抓取糗事百科中24小時欄目的段子
2.過濾有圖片的段子(畢竟在終端中顯示圖片不太現實)
3.實現顯示段子的發布者、段子內容、好笑值和評論數
分析站點并抓取頁面代碼
1.頁面的url是https://www.qiushibaike.com/hot/page/1/,其中數字1代表的是頁碼,通過站點分析,24小時欄目下的頁面總共有13頁,所以爬取是就直接在1-13頁中,無需單獨獲取最大的頁碼數(其實主要是因為懶,能省一步是一步:happy:)
2.經測試該網站沒有反爬蟲措施,所以可以肆無忌憚的爬,連請求頭都不用加,開不開心。
代碼奉上:
import requests
from requests.exceptions import RequestException
def get_page(page):
'''獲取網頁源代碼'''
try:
url = "https://www.qiushibaike.com/hot/page/" + str(page)
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
return None
except RequestException:
return None
def main(page):
'''主函數'''
html = get_page(page)
if html:
print(html)
else:
print('請求網頁失敗!')
if __name__ == '__main__':
'''程序入口'''
map(main, [i for i in range(1,14)])
抓取某頁中所以的段子
獲取頁面的HTML代碼后,就需要分析該頁面具體每個段子的結構了,先上圖:
經分析,可知:
1.每個<div class="article block untagged……"
標簽都包含一個段子,結構很清晰
2.發布者在<h2></h2>
標簽中,段子內容在<div class="content">
下的<span>
標簽中,好笑值和評論數在上圖中都標明了位置(請自行查看)
3.帶圖片對待段子在 標簽下多一個
<div>
標簽,如下:
代碼奉上:
pattern = re.compile(
'<div.*?article block.*?<h2>(.*?)</h2>.*?content.*?<span>(.*?)</span>.*?' +
'<!--.*?或gif.*?>(.*?)<div class="stats".*?<span.*?number">(\d+)</i>.*?' +
'</span>.*?<a.*?>.*?number">(\d+)</i>.*?</div>',re.S)
items = re.findall(pattern, html)
for item in items:
if not item[2].split():
print(item[0], item[1], "好笑值:" + item[3], "評論數:" + item[4])
代碼說明:
1).*? 是一個固定的搭配,.和*代表可以匹配任意無限多個字符,加上?表示使用非貪婪模式進行匹配,也就是會盡可能短地做匹配,以后我們還會大量用到 .*? 的搭配。
2)(.*?)表示一個分組,就是我們需要匹配的內容。
3)re.S表示點(.)可以匹配換行符
4)沒有圖片的段子,item[2] 匹配的內容為幾個換行符,所以可以用split()
方法去除換行符,再加 if 判斷過濾有圖片的段子
輸出結果:
總結
1.整個項目比較簡單,主要就是正則匹配部分
2.由于能力有限,所以沒辦法做到和崔大神的一樣回車一下顯示一個段子
3.本來想再用BeautifulSoup實現下的,后來發現比較麻煩就中斷了,還不如正則簡單
完整代碼和輸出文件請訪問:https://github.com/xieys 歡迎Follow和star