首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >爬虫练习题(四)

爬虫练习题(四)

作者头像
设计者
发布2022-12-20 13:16:50
发布2022-12-20 13:16:50
4150
举报

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

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

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

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

步骤:

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

代码语言:javascript
复制
import requests
word = 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)。

代码语言:javascript
复制
import requests
word = 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 的变化)

代码语言:javascript
复制
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、保存数据

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.打开网址
  • 2.分析网页
  • 3.发送请求
  • 4、提取数据(pn 的变化)
  • 5、保存数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档