python 爬虫请求到的源码信息 只是一部分_网络爬虫(一)(二)bs4提取之Selector...

本文介绍了Python爬虫的基本概念,包括网络爬虫的作用和数据结构化的重要性。通过PyCharm环境的配置,讲解了如何使用bs4库进行网页数据的抓取。针对酷狗音乐Top500榜单,详细阐述了如何构造URL、设置请求头以规避反爬机制,并演示了使用BeautifulSoup解析HTML源码,提取歌曲排名、歌名和播放时间的方法。最后指出,基于Selector的提取方式对网页结构调整较敏感,不够健壮。
摘要由CSDN通过智能技术生成

一、前言

1.1 网络爬虫简介

“网络爬虫”又称“网络蜘蛛”。是一种在互联网上自动采集数据的自动化程序,爬虫的规模可大可小,大到百度,谷歌搜索,小到自动下载图片等。

采集数据,所采集的数据是结构化的,批量提取,提高效率的。例如,我们希望在某电商平台上获取某产品相关信息,其中包含信息可能存在产品名称、产品价格、参评参数、广告、评论内容等,我们只想要其中的用户好评信息,其他的都不要,以表格形式保存,表格就是结构化以后的结果,如果该数据量较小的话我们可以手动复制粘贴,但当有 1000,100000 或更庞大的数据量时,显然复制粘贴效率就太低了还不能保证正确率,使用爬虫提取,正确率都,效率都得意保证,下次再有类似的网页,改一改就可以用。

爬虫的本质是网络请求(request),请求访问一个网页获得响应后(response),提取其中的数据。

1.2 Pycharm下载

我们使用 pycharm 来进行爬虫的编写,所以需要下载个 pycharm,下载地址:

https://www.jetbrains.com/pycharm/

1.3 新建项目

首先要新建个空项目文件夹,用来保存我们写的爬虫文件,后依次点击左上角 File -> New Project。

1:把路径设置成刚刚建的空文件夹

2:选择现有环境,指的是你电脑下载的 python 环境

3:你的电脑下载的 python 的环境的路径

4:创建

即可以开始编写程序

二、bs4提取

2.1 Selector爬取酷狗top500

2.1.1 环境配置

第一步:下载谷歌浏览器

第二步:安装bs4,requests库

打开 cmd 命令行(win + r)

输入 pip install bs4 完成bs4模块安装。

输入 pip install requests 完成requests模块安装。

2.1.2 可能遇到的安装错误

如果执行 pip install bs4 后报错为“pip 不是可执行的命令”,将pip 的路径加入环境变量即可

2.1.3 构造请求网址

提供URL如下:

https://www.kugou.com/yy/rank/home/1-8888.html?from=rank

我们观察 url 如下几个字段:

https:超文本传输协议

www.kugou.com:域名

yy/rank/home/1-8888:域名下的子网页

.html:代表此网页是静态的,后面会讲

?:问好后面的一般都是一些请求参数

打开后只能看到前 22 名的数据,如下:

e0cb8969b417e7e0eb65841423e43797.png

我们可以看到,其中有一个 1-8888 这个参数,打开上述网址后我们只能看到前 22 首歌,如果需要查看更多内容可以下载客户端,但是这里我们把 1-8888 改成 2-8888其实也是可以实现翻页的效果,如下:

fb2e40218fb4d7e1332104c108fe390c.png

我们可以根据排名共有500条记录可以知道一共有23页:

5b9e383f5dc2f16ee41dcd041aa65569.png

到这里我们我们需要提取的数据就知道在哪里了。

在知道了有多少页以及 url 的含义后,通过以下代码构造所有的 url:

urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range(1, 24)]

我们需要的所有url就都包含在urls中了

2.1.4构造请求头

一般浏览器都会有反爬机制,用来区别是人还是机器访问的一种手段。我们设置请求头为浏览器的请求头,以模拟成人为的访问,当然这只是最简单的一种防反爬的手段,一般我们都会带上,代码如下:

headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}

这个headers是先通过人为访问,在headers中的user-agent找到:

fb59a2e6462925fb13f5a7d56990dc27.png

2.1.5 请求访问网页

response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
else:
return

response = requests.get(url, headers=headers)

使用 requests 库的get方法访问网页,第一个参数为网址,第二个参数为请求头,返回值里面有很多结果,包括有状态响应码,网页源码,二进制等,赋值给我们定义的response

response.status_code == 200

c47410f86403cb05d3be0bb8935e009f.png

调用请求结果 response 中的status_code查看请求状态码,200代表请求成功,就返回,否则返回一个 None,状态码一般有 2xx,4xx,3xx,5xx,分别代表请求成功,客户端访问失败,重定向,服务器问题。

return response.text表示返回响应结果的text,即网页html源码

9e172d32d39d056f0b10e778f3a900c4.png

2.1.6 解析网页

在请求访问网页中我们得到了我们需要的response,其中的html源码也被我们所得到,但是这个源码比较丑陋,所以我们可以利用beautifulsoup来对源码进行煲汤。

html = BeautifulSoup(html)

e830635c2da0b6cc8796a88f5c75102f.png

2.1.7 提取数据

在浏览器中将鼠标指向我们所需要提取的元素,右击检查后会出现对应源码,右击→copy→copy selector

可以得到

ranks = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num')
names = html.select('#rankWrap > div.pc_temp_songlist > ul > li > a')
times = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span')

2.1.8 获得数据

for r,n,t in zip(ranks,names,times):
r = r.get_text().replace('n','').replace('t','').replace('r','')
n = n.get_text()
t = t.get_text().replace('n','').replace('t','').replace('r','')

用zip 函数,把对应的排名,歌名歌手,播放时间打包,打包结果为一个列表,[(排名,歌手歌名,播放时间),(排名,歌手歌名,播放时间),……]

使用 get_text() 获得实际数据

2.1.9 selector总结

这种提取方式是不会常用的,因为效果很不健壮,如果网页改了改结构,就不能使用了。

代码如下:

c775b61aa917880b4132c2f2be8c86f4.png

运行效果如下:

9adfa8724a58d640d1304b21dbec561e.png

欢迎大家加入人工智能圈参与交流

人工智能学习圈 - 知乎​www.zhihu.com
9d38f6995242abf59fbff858f40a331b.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值