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。