写点什么

爬虫练习题(四)

作者:张立梵
  • 2022 年 10 月 09 日
    江西
  • 本文字数:1823 字

    阅读完需:约 6 分钟

爬虫练习题(四)

题目:爬取百度贴吧https://tieba.baidu.com


要求 1.在输入框中输入海贼王


2.爬取前六页的网页源代码


3.掌握百度贴吧网页链接的运行规律,构建合适的 URL


步骤:

打开网址-->分析网站 -->发送请求-->提取数据-->保存数据


import requestsword = input("输入要搜索的内容")start = int(input("输入起始页"))end = int(input("输入结束页"))headers = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}for n in range(start,end+1):    url = f'https://tieba.baidu.com/f?kw={word}&pn={(n-1)*50}'    print(url)    response = requests.get(url, headers=headers)    with open(f"{word}的第{n}页.html", 'w', encoding='utf-8') as file:        file.write(response.content.decode('utf-8'))
复制代码


接下来我们就打开百度贴吧看看他的 URL 与之前的有什么区别吧!**

1.打开网址

https://tieba.baidu.com

2.分析网页

初始链接


https://tieba.baidu.com/f?ie=utf-8&kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&fr=search


第一页至第四页的链接


https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=0


https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=50


https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=100


https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=150


我们可以发现除了原始百度贴吧的网页链接后面还有 kw,ie,pn,这都在符号/f?后面,这些参数我们在上一篇都已明晰,唯一不同的是搜索内容变成了 %E6%B5%B7%E8%B4%BC%E7%8E%8B 原因很简单,kw 是用户在输入框中输入的搜索内容,“海贼王”是汉字所以就被转码了,这一串字符的意思就是“海贼王”的意思。值得注意的是


在“&”符号后面出现了 pn=0 的字样


每一个网址都有自己独特的一面,百度贴吧也是一样,自己携带的 pn 参数在一些链接中是没有的,所以在构建 URL 时要注意他的变化,由分析可得第一页 pn=0,爹人也陪你,第三页 100,每页以 50 递增,我们不妨修改 URL 测试一下第五页和第六页的链接,把 pn 后面的值改成 200 和 250


这样剩余俩页的就可以凭空写出:


https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=200


https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn=250

3.发送请求

导入 requests 模块,并且导入起始页和结束页 (这里别忘了强转哦) 还有一点就是导入搜索内容用 word 接收,构建好 UA(User-Agent)。


import requestsword = input("输入要搜索的内容")start = int(input("输入起始页"))end = int(input("输入结束页"))headers = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'}
复制代码

4、提取数据(pn 的变化)

for n in range(start,end+1):    url = f'https://tieba.baidu.com/f?kw={word}&pn={(n-1)*50}'    print(url)    response = requests.get(url, headers=headers)
复制代码


首先,我们需要提取第一页到第六页的数据,因为第一页 pn 的值为零,要满足每增长一页 nn 的值增加 50,这个规律,我们就可以用公式 pn =(n- 1)*50,当 n 为 1 时,Pn 的值正好等于零,满足需求,后面的页面正好是以倍数增加,所以这个公式满足要求。以后我们要注意各种网址,每一种网址规律都不一样,想要找到它们之间的规律还是很难的,后面的文章我会详细的和大家慢慢的分析各种网址的应对情况,每一种网址需要找到规律,并且用公式把规律概括出来,并且反复的验证公式的准确性,所以公式不是唯一的,他极为灵活,要应对不同的场合,构建不同的公式,构建好可以打印一下发送请求的 url。


还有一点需要注意的是,要明确是什么请求类型,这个就是 Get 请求,所以 response=requests.get,后面传入相关成分 这个发送请求的过程就包含了 get 请求,突显了这是一个 get 请求类型的网页,后面我们会遇到 post 请求类型,这个咱们遇到再说,百度翻译就是一个 post 的请求。

5、保存数据

   with open(f"{word}的第{n}页.html", 'w', encoding='utf-8') as file:        file.write(response.content.decode('utf-8'))
复制代码


这里就是依次把文件名,写入,转码处理好就可以,转码类型一定要看清否则会报错。


希望大家能在我的文章中打好基础能够满怀信心的应对初级爬虫的任何挑战!后续会继续推出爬虫知识点与相关题目!

发布于: 刚刚阅读数: 5
用户头像

张立梵

关注

还未添加个人签名 2022.07.02 加入

还未添加个人简介

评论

发布
暂无评论
爬虫练习题(四)_10 月月更_张立梵_InfoQ写作社区