‘’
    需求:
    目标:百度贴吧(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
    ‘’’
    代码如下:

    1. import urllib.request
    2. import urllib.parse
    3. name = input("请输入你要查询的贴吧名:")
    4. begin = int(input('请输入从第几页开始查询:')) #如1
    5. end = int(input('请输入从第几页结束查询:')) #如2
    6. #因name为中文,浏览器不认识中文,所以要对name进行编码
    7. name1 = urllib.parse.quote(name) #用urllib.parse的quote方法来对name进行编码
    8. #请求头
    9. headers = {
    10. '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'
    11. }
    12. for page in range(begin, end+1): #左闭右开
    13. pn = (page-1)*50
    14. # print(pn)
    15. url = f'https://tieba.baidu.com/f?kw={name1}&pn={pn}' #url用(f'字符串')格式化成字符串,这个要注意,只有{}里面的变量可以变,其他的都不能变!
    16. # print(url)
    17. #发送请求,创建对象
    18. req = urllib.request.Request(url, headers=headers)
    19. # print(req)
    20. #返回也是一个对象
    21. res = urllib.request.urlopen(req)
    22. # print(res)
    23. #从返回的res对象里读取字符流
    24. html = res.read().decode('utf-8') #要用decode('utf-8')来解码,这样才能看得懂!
    25. # print(html)
    26. #写入文件 第{page}页.html
    27. filename = f'{name}的第{page}页.html' #定义写入文件的文件名
    28. with open(filename, 'w', encoding='utf-8') as f:
    29. f.write(html)