‘’
需求:
目标:百度贴吧(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.request
import urllib.parse
name = input("请输入你要查询的贴吧名:")
begin = int(input('请输入从第几页开始查询:')) #如1
end = 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}页.html
filename = f'{name}的第{page}页.html' #定义写入文件的文件名
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)