1. 程式人生 > >ulrlib案例-爬取百度貼吧

ulrlib案例-爬取百度貼吧

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,parse
2 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 20
end = (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案例-爬取百度貼吧