社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

我要偷偷的学Python,然后惊呆所有人(第八天)

看,未来 • 4 年前 • 560 次点击  

在这里插入图片描述

标题无意冒犯,就是觉得这个广告挺好玩的
上面这张思维导图喜欢就拿走,反正我也学不了这么多

前言

前期回顾: 我要偷偷学Python(第七天)

上一篇呢,我们初见爬虫,其实近距离接触之后,发现也不是学不会的嘛,虽然我们只是爬取了小图片,爬网页还比较吃力,一下用例过猛把人家的源代码都给爬过来了。

那怎么办呢?我们看别人的爬虫效果,好像没有那么凌乱的源代码啊。这就需要做网页解析了,好,今天我们就来解析一下网页,然后把里面的有效的字提取出来。

注意哦,我们并不能教你去做前端,只是简单的了解一下网页结构,以便我们的爬虫定位。

插播一条推送:(如果是小白的话,可以看一下下面这一段)

欢迎来到我们的圈子

我建了一个Python学习答疑群,有兴趣的朋友可以了解一下: 这是个什么群

群里已经有两百多个小伙伴了哦!!!

直通群的传送门: 传送门


本系列文默认各位有一定的C或C++基础,因为我是学了点C++的皮毛之后入手的Python,这里也要感谢齐锋学长送来的支持。
本系列文默认各位会百度,学习‘模块’这个模块的话,还是建议大家有自己的编辑器和编译器的,上一篇已经给大家做了推荐啦?

我要的不多,点个关注就好啦
然后呢,本系列的目录嘛,说实话我个人比较倾向于那两本 Primer Plus,所以就跟着它们的目录结构吧。

本系列也会着重培养各位的自主动手能力,毕竟我不可能把所有知识点都给你讲到,所以自己解决需求的能力就尤为重要,所以我在文中埋得坑请不要把它们看成坑,那是我留给你们的锻炼机会,请各显神通,自行解决。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

HTML基础

HTML是什么?

HTML(Hyper Text Markup Language)是用来描述网页的一种语言,也叫超文本标记语言 。
它是什么在这边已经不重要了,咱重点来看它,在座的各位,应该都不排斥陌生语言了吧,这是个大前提。

查看网页的HTML代码

来我们随便打开个网页吧,比如说就第七天的吧:https://blog.csdn.net/qq_43762191/article/details/109320746

在网页空白区域右击,显示网页源代码。
代码太长了我就不拷贝过来了啊,呐,网址在这里:view-source:https://blog.csdn.net/qq_43762191/article/details/109320746
找不到源代码的可以直接从网址进。

还有一种办法:右击->检查,这种方法可以让源代码和网页同屏出现。
就看个人喜好啦,各有千秋。


我们看了个啥玩意儿啊?

标签和元素

好,来先看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) #打印网页源代码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

好,你去试一下。你会发现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=2247489783&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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

事实证明啊,纸上得来终觉浅,绝知此事要躬行啊,差点就信了上面那张图的鬼话。

(其实你再回头认真研究一下,又会有新的发现)

括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要在网页中提取的内容。
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=2247489783&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)) # 打印提取出的数据类型
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

我们用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=2247489783&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) # 打印书籍的类型、名字、链接和简介的文字

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

回顾

其实说白了,从最开始用requests库获取数据,到用BeautifulSoup库来解析数据,再继续用BeautifulSoup库提取数据,不断经历的是我们操作对象的类型转换。

请看下图:

在这里插入图片描述

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/74895
 
560 次点击