标题无意冒犯,就是觉得这个广告挺好玩的
文章目录
- 前言
- 欢迎来到我们的圈子
- HTML基础
- HTML是什么?
- 查看网页的HTML代码
- 我们看了个啥玩意儿啊?
- 标签和元素
- HTML基本结构
- HTML属性
- 爬取网页文本
- 前情回顾
- BeautifulSoup
- 网页数据解析
- res = BeautifulSoup('要解析的数据','解析器')
- 提取数据
- tag对象
- 回顾
前言
前期回顾:你要偷偷学Python(第七天)
上一篇呢,我们初见爬虫,其实近距离接触之后,发现也不是学不会的嘛,虽然我们只是爬取了小图片,爬网页还比较吃力,一下用例过猛把人家的源代码都给爬过来了。
那怎么办呢?我们看别人的爬虫效果,好像没有那么凌乱的源代码啊。这就需要做网页解析了,好,今天我们就来解析一下网页,然后把里面的有效的字提取出来。
注意哦,我们并不能教你去做前端,只是简单的了解一下网页结构,以便我们的爬虫定位。
插播一条推送:(如果是小白的话,可以看一下下面这一段)
欢迎来到我们的圈子
我建了一个Python学习答疑群,有兴趣的朋友可以了解一下。如果大家在学习中遇到困难,想找一个python学习交流环境,可以加入我们的python圈,裙号930900780,可领取python学习资料,会节约很多时间,减少很多遇到的难题。
本系列文默认各位有一定的C或C++基础,因为我是学了点C++的皮毛之后入手的Python。
本系列文默认各位会百度,学习‘模块’这个模块的话,还是建议大家有自己的编辑器和编译器的,上一篇已经给大家做了推荐啦?
然后呢,本系列的目录嘛,说实话我个人比较倾向于那两本 Primer Plus,所以就跟着它们的目录结构吧。
本系列也会着重培养各位的自主动手能力,毕竟我不可能把所有知识点都给你讲到,所以自己解决需求的能力就尤为重要,所以我在文中埋得坑请不要把它们看成坑,那是我留给你们的锻炼机会,请各显神通,自行解决。
1234567
HTML基础
HTML是什么?
HTML(Hyper Text Markup Language)是用来描述网页的一种语言,也叫超文本标记语言 。
它是什么在这边已经不重要了,咱重点来看它,在座的各位,应该都不排斥陌生语言了吧,这是个大前提。
查看网页的HTML代码
来我们随便打开个网页吧,比如说就第七天的吧:https://www.toutiao.com/i6889211245900071428/
在网页空白区域右击,显示网页源代码。
代码太长了我就不拷贝过来了啊,呐,网址在这里:view-source:https://www.toutiao.com/i6889211245900071428/
找不到源代码的可以直接从网址进。
还有一种办法:右击->检查,这种方法可以让源代码和网页同屏出现。
就看个人喜好啦,各有千秋。
我们看了个啥玩意儿啊?
标签和元素
好,来先看HTML文档,可以看到很多夹在尖括号<>中间的字母,它们叫做【标签】。
标签通常是成对出现的:前面的是【开始标签】,比如;后面的是【结束标签】,如。
不过,也有标签是形单影只地出现,比如HTML代码的第五行(定义网页编码格式为 utf-8),就是此类。这些你知道就好,大部分情况下用的都是成双成对出现的标签。
事实上,开始标签+结束标签+中间的所有内容,它们在一起就组成了【元素】。
下面的表格列出了几个常见元素:
现在再回去看那份网页源代码,虽然没这个表格也能猜个八九不离十的。
是不是清晰了很多!!!
HTML基本结构
要是觉得还不够看,那再来一张:
HTML属性
你还会发现,代码里面还有一些诸如“class”之类的东西反复出现,跟在body后面,这些被称为“属性”,我们来看看:
至此,我们就讲完了HTML的组成:标签、元素、结构(网页头和网页体)、属性。
好,现在再直观的看一下网页的源代码,直到感觉没有压力了,咱再往下。
爬取网页文本
前情回顾
前一天,我们给大家留下了一个只能爬取网页源码的遗憾,但是那其实是第一步,接下来我们将那段网页代码解析出来,提取出我们想要的内容。
当时的代码是这样的:
import requests #调用requests库
res = requests.get('https://blog.csdn.net/qq_43762191') #爬我自己的主页
#获取网页源代码,得到的res是Response对象
html=res.text
#把res的内容以字符串的形式返回
print('响应状态码:',res.status_code) #检查请求是否正确响应
print(html) #打印网页源代码
1234567
BeautifulSoup
这里要介绍一个模块,BeautifulSoup,名字还不错嘛,美丽的灵魂。
在我的pycharm里面是下载不了这个的,不知道是不是因为我用Python3.9的缘故,还是说它没办法单独下载,像我之前做词云那样。不过我可以下载beautifulsoup4,反正不管你下载的是什么,只要确定下载之后能找到bs4这个包就行了。
网页数据解析
res = BeautifulSoup(‘要解析的数据’,‘解析器’)
参数释义:
第一个是要被解析的文本,注意了,它必须是字符串。
第二个参数用来标识解析器,我们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,但是比较简单的)
好,我们再看:
import requests
from bs4 import BeautifulSoup
res = requests.get('https://blog.csdn.net/qq_43762191')
soup = BeautifulSoup( res.text,'html.parser')
print(type(soup)) #查看soup的类型
wt = open('test4.txt','w',encoding='utf-8')
wt.write(res.text)
wt.close()
12345678
好,你去试一下。你会发现CSDN不让你这么容易得逞,真好,虽然照样被爬。
那我们换个网址吧。
https://mp.weixin.qq.com/s?__biz=MzI4NDY5Mjc1Mg==&mid=2247489783&idx=1&sn=09d76423b700620f80c9da9e4d8a8536&chksm=ebf6c088dc81499e3d5a0febeb67fec27ba52f233b6a0e6fda37221a2c497dee82f2de29e567&scene=21#wechat_redirect
这篇有亮点哦,不过,自己爬下来看,当初看完之后我还特地研究了一下午,当然,我是为了安全,对,我是好人。
看看运行结果,soup的数据类型是<class ‘bs4.BeautifulSoup’>,说明soup是一个BeautifulSoup对象。
提取数据
这一步,又可以分为两部分知识:find()与find_all(),以及Tag对象。
import requests
from bs4 import BeautifulSoup
res = requests.get('https://mp.weixin.qq.com/s?__biz=MzI4NDY5Mjc1Mg==&mid=3325305851&idx=1&sn=09d76423b700620f80c9da9e4d8a8536&chksm=ebf6c088dc81499e3d5a0febeb67fec27ba52f233b6a0e6fda37221a2c497dee82f2de29e567&scene=21#wechat_redirect') #好像只能爬取以.html结尾的网址
soup = BeautifulSoup( res.text,'html.parser')
item = soup.find('div')
#item = soup.find_all('div')
print(type(item)) #查看soup的类型
wt = open('test6.txt','w',encoding='utf-8')
wt.write(str(item))
wt.close()
print(item)
1234567891011
事实证明啊,纸上得来终觉浅,绝知此事要躬行啊,差点就信了上面那张图的鬼话。
(其实你再回头认真研究一下,又会有新的发现)
括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要在网页中提取的内容。
icon
如果只用其中一个参数就可以准确定位的话,就只用一个参数检索。如果需要标签和属性同时满足的情况下才能准确定位到我们想找的内容,那就两个参数一起使用。
tag对象
各位有没有觉得胜利在望了,然后执行下来发现又是镜花水月一场空,别急嘛,我们继续往下看,看不到吃亏哦:
我们前面忙活了大半天,又是提出了一堆的源代码出来,tony带水,但是真的没有一点改变吗?不要相信你的眼睛,眼睛有时候会骗人的,各位不妨把每次返回的返回值打印出属性来看看,其实属性一直在往有利于我们的方向发展着。
我们看到它们的数据类型是<class ‘bs4.element.Tag’>,是Tag对象
还记得我们前边说,提取数据分为那啥和tag吗?现在就到了最后冲刺的时刻了,没有错,冲呐!!!
首先,Tag对象可以使用find()与find_all()来继续检索。
res = requests.get('https://mp.weixin.qq.com/s?__biz=MzI4NDY5Mjc1Mg==&mid=3325305851&idx=1&sn=09d76423b700620f80c9da9e4d8a8536&chksm=ebf6c088dc81499e3d5a0febeb67fec27ba52f233b6a0e6fda37221a2c497dee82f2de29e567&scene=21')#wechat_redirect') #好像只能爬取以.html结尾的网址')
# 返回一个response对象,赋值给res
html = res.text
# 把res的内容以字符串的形式返回
soup = BeautifulSoup( html,'html.parser')
# 把网页解析为BeautifulSoup对象
items = soup.find_all('div') # 通过定位标签和属性提取我们想要的数据
for item in items:
kind = item.find(class_='rich_media_area_primary') # 在列表中的每个元素里,匹配标签<h2>提取出数据
print(kind,'\n') # 打印提取出的数据
print(type(kind)) # 打印提取出的数据类型
1234567891011
我们用Tag.text提出Tag对象中的文字,用Tag[‘href’]提取出URL。
import requests # 调用requests库
from bs4 import BeautifulSoup # 调用BeautifulSoup库
res =requests.get('https://mp.weixin.qq.com/s?__biz=MzI4NDY5Mjc1Mg==&mid=3325305851&idx=1&sn=09d76423b700620f80c9da9e4d8a8536&chksm=ebf6c088dc81499e3d5a0febeb67fec27ba52f233b6a0e6fda37221a2c497dee82f2de29e567&scene=21#wechat_redirect')
# 返回一个response对象,赋值给res
html=res.text
# 把res解析为字符串
soup = BeautifulSoup( html,'html.parser')
# 把网页解析为BeautifulSoup对象
items = soup.find_all(class_='rich_media') # 通过匹配属性class='rich_media'提取出我们想要的元素
for item in items: # 遍历列表items
kind = item.find('h2') # 在列表中的每个元素里,匹配标签<h2>提取出数据
title = item.find(class_='profile_container') # 在列表中的每个元素里,匹配属性class_='profile_container'提取出数据
print(kind.text,'\n',title.text) # 打印书籍的类型、名字、链接和简介的文字
1234567891011121314
回顾
其实说白了,从最开始用requests库获取数据,到用BeautifulSoup库来解析数据,再继续用BeautifulSoup库提取数据,不断经历的是我们操作对象的类型转换。
请看下图:
最后多说一句,想学习Python可联系小编,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以进q裙930900780领取。
本文章素材来源于网络,如有侵权请联系删除。