ulrlib案例-爬取百度貼吧
阿新 • • 發佈:2018-07-07
request class clas uml sleep 很多 下載 變化 random
1.任務需求
百度貼吧有很多主題,每個主題下的網頁存在很多分頁。爬取不同的主題,並下載每個主題下的多頁網頁。
輸入貼吧名稱,下載相應貼吧的多頁網頁,設置最多下載50頁。
2.分析網頁
訪問不同的百度貼吧時。嘗試搜索多個貼吧,觀察到瀏覽器的url中的kw為貼吧的名稱。
因此,發送get請求時,設置不同的kw可以訪問不同的貼吧。
同一主題的貼吧中,有分頁,通過點擊不同的分頁,可以看出,url中的pn規律變化
第1頁 pn = 0
第2頁 pn=50
第3頁 pn=100
據此規律可以爬取不同頁數的網頁。
3.代碼實現
1 from urllib import request,parse2 import time 3 import random 4 import os 5 6 kw = input(‘請輸入貼吧名稱:‘) 7 start = input(‘請輸入起始頁:‘) 8 end = input(‘請輸入結束頁:‘) 9 10 # 構建請求字符串 11 qs = { 12 ‘kw‘:kw 13 } 14 qs = parse.urlencode(qs) 15 16 # 構建貼吧鏈接地址 17 base_url = ‘https://tieba.baidu.com/f?‘ + qs 18 19 start = (int(start) - 1) * 50 20end = (int(end) - 1) * 50 + 1 21 22 for pn in range(start,end,50): 23 # pn 分頁數字 24 # 文件名 25 fname = str((pn//50 + 1)) + ‘.html‘ 26 fullurl = base_url + ‘&pn=‘ + str(pn) 27 print(fullurl) 28 response = request.urlopen(fullurl) 29 data = response.read().decode(‘utf-8‘) 30 31 #自動創建目錄 32 path = ‘./tieba/‘ + kw 33 if not os.path.exists(path): 34 os.makedirs(path) 35 36 with open(os.path.join(path,fname),‘w‘,encoding=‘utf-8‘) as f: 37 f.write(data) 38 39 # 加入請求間隔 40 time.sleep(random.random() * 2)
4.註意事項
後面的加入隨機請求間隔,防止請求過於頻繁導致被封IP。
ulrlib案例-爬取百度貼吧