‘’
需求:
目标:百度贴吧(https://tieba.baidu.com)
通过用户输入什么吧,从几页到几页,来爬取页面并保存成html文件
分析网站:
第一页:https://tieba.baidu.com/f?ie=utf-8&kw=%E8%BF%AA%E5%8A%A0&fr=search
第二页:https://tieba.baidu.com/f?kw=%E8%BF%AA%E8%BF%A6&ie=utf-8&pn=50
第三页:https://tieba.baidu.com/f?kw=%E8%BF%AA%E8%BF%A6&ie=utf-8&pn=100
第四页:https://tieba.baidu.com/f?kw=%E8%BF%AA%E8%BF%A6&ie=utf-8&pn=150
根据4页来分析:
初看url的变化,第一页跟后三页大大的不同,后三页发现有一共同点,就是只有后面的数字在变化(变的只有pn=后面的数字,前面的都不变)
所以有一个大胆的想法,那第一页能不能也跟后面的一样,只是最后的数字改成0
则:https://tieba.baidu.com/f?kw=%E8%BF%AA%E8%BF%A6&ie=utf-8&pn=0
恰恰是这一想法是成功的~!
所以url的统一写法就可以写为:https://tieba.baidu.com/f?kw={name}&ie=utf-8&pn={page}
再更进一步,name和page之间的:(&ie=utf-8)删除后一样没变化,所以最后的url为:
https://tieba.baidu.com/f?kw={name}&pn={page}
name - 要的贴吧名称
page - 页码
页码又可以改成: (i-1)*50 - i为第几页
例(迪加吧,第1页):https://tieba.baidu.com/f?kw=%E8%BF%AA%E8%BF%A6&ie=utf-8&pn=0
‘’’
代码如下:
import urllib.requestimport urllib.parsename = input("请输入你要查询的贴吧名:")begin = int(input('请输入从第几页开始查询:')) #如1end = int(input('请输入从第几页结束查询:')) #如2#因name为中文,浏览器不认识中文,所以要对name进行编码name1 = urllib.parse.quote(name) #用urllib.parse的quote方法来对name进行编码#请求头headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}for page in range(begin, end+1): #左闭右开pn = (page-1)*50# print(pn)url = f'https://tieba.baidu.com/f?kw={name1}&pn={pn}' #url用(f'字符串')格式化成字符串,这个要注意,只有{}里面的变量可以变,其他的都不能变!# print(url)#发送请求,创建对象req = urllib.request.Request(url, headers=headers)# print(req)#返回也是一个对象res = urllib.request.urlopen(req)# print(res)#从返回的res对象里读取字符流html = res.read().decode('utf-8') #要用decode('utf-8')来解码,这样才能看得懂!# print(html)#写入文件 第{page}页.htmlfilename = f'{name}的第{page}页.html' #定义写入文件的文件名with open(filename, 'w', encoding='utf-8') as f:f.write(html)
