大白话版爬虫原理html是啥以及requests/json/beautifulsoup咋用

编程入门 行业动态 更新时间:2024-10-25 19:35:37

<a href=https://www.elefans.com/category/jswz/34/1770026.html style=大白话版爬虫原理html是啥以及requests/json/beautifulsoup咋用"/>

大白话版爬虫原理html是啥以及requests/json/beautifulsoup咋用

当你决定去某个网页后,

  1. 爬虫模拟浏览器去向服务器发出请求, 获取数据
  2. 等服务器响应后,爬虫程序可以代替浏览器帮我们解析数据;
  3. 爬虫根据我们设定的规则批量提取相关数据,而不需要我们去手动提取;
  4. 爬虫可以批量地把数据存储到本地。
    图例:

下边讲html:
html是一种文件格式,可以用浏览器打开。html文件可以被查看、编辑、修改。

HTML文档的最外层标签一定是< html>,里面嵌套着< head>元素与< body>元素。< head>元素代表了【网页头】,< body>元素代表了【网页体】,这是最基本的网页结构。

HTML文档和网页的内容一定是一一对应的。只是,【网页头】的内容不会被直接呈现在浏览器里的网页正文中,而【网页体】的内容是会直接显示在网页正文中的。

例:

<head><meta charset="utf-8"> <title>我是网页的名字</title>
</head>

先来看< head>元素,也就是【网页头】,它里面一般会有哪些内容呢。
第2行的< meta charset=“utf-8”>定义了HTML文档的字符编码。

第3行的< title>元素用来定义网页的标题,这个标题就是显示在浏览器的标签页中的内容

【网页头】中的编码是没办法在网页中直接被看到的,标签页的内容也不属于网页的正文。而< body>元素中,即【网页体】,就是那些你能看到的显示在网页中的内容了。

一个网页由哪几部分组成:
标签
网页上充满标签。标签由两部分构成——开始标签和结束标签。正常情况下,二者内容一致,但结束标签会多一个符号“/”,构成一个完整的标签。少数情况会以<文字文字文字/>,或者<文字文字文字>出现.

开始标签示例结束标签示例
< head>< /head>

标签是可以嵌套标签的,不同的标签会有它不同的功能

元素:
开始标签+结束标签+中间的所有内容,它们在一起就组成了【元素】
下边列出几个常见元素:

属性:
属性位于开始标签内,由属性名和属性的值两部分组成,用来描述标签的特性。复杂的网页会有许多不同属性,比如target,render,suda-uatrack,class,extra-data,href等。
例:
比如style=…,如标签的含义是网页中的一块区域,style属性就描述了这块区域的高、宽、底色等信息。
在属性里,有4个需要我们特别留意:
1)id属性
有的元素会有id属性,id属性在一个网页中是唯一的。所以我们可以通过查找id的方式,来找到这个元素。比如id=“201”
2)class属性:
class的作用是定义元素的样式,而且可以复用。也就是说在一个网页里,如果元素最终呈现的样式是一样的,那么它们就可能采用同一个class属性。每个属性都还有它对应的值——就是每个等号后面的那部分,比如class=“title”就是一个class属性,值为title。
3)herf属性:
添加链接
4)style属性:
style属性可以用来定义网页文本的样式,比如字体大小、颜色、间距、对齐方式等等。
在上面的代码中,style属性添加在了

的开始标签中,因为属性通常都是在HTML元素的开始标签中设置的。

head和body
html有两个最大的元素:head和body
body里面有一个div元素;div元素里面又有6个小div元素;其中的第3个div元素里有一个h3元素和一个bl元素;bl元素里有4个带有id属性的li元素;所以如果想找id=201的元素,它的完整路径就是html>body>div>div>bl>li#201
其实浏览器会显示出来路径,如下图红圈内:

结束,下面上浏览器相关内容


简单理解浏览器的工作过程:
我们在使用浏览器上网的时候。从本质上来讲,只有两种动作:一种是从服务器那儿拿数据,称作Get;一种是把我们这里的信息交给服务器去处理,称作Post。它们都被记录在【Network】里。
浏览器从网络上接收一个html的文档 — 浏览器对内容做解析 — 呈现。
查看方式:
可以点击右键-查看源代码或使用快捷键ctrl+u来查看网页源代码。Safari浏览器打开【偏好设置】-【高级】-【在菜单栏中显示“开发”菜单】,点击菜单页的【开发】
三种方式打开开发者工具:
右键-检查或按F12 或shift+ctrl+i
代码区点击左上角小箭头(快捷方式是ctrl+shift+c),再把鼠标放在网页区,右边代码区和它相关的代码会被标亮。


下边上重点:


有用的部分是:
XHR,通常我们要抓取的内容就是藏在里边。
XHR完整表述是XHR and Fetch,(两者作用一样,Fetch出现得比XHR更晚一些)。点击XHR一列,会筛选出所有请求类型是XHR(或Fetch)的东西。

我们平时在使用浏览器上网的时候,经常会有这样的情况:网址没变,但是网页里面的一部分内容却变了。比如购物网站,下滑自动加载出更多商品。在线翻译网站,输入中文翻译英文。这说明,即便我们没有进行翻页/跳转/刷新的操作,浏览器也在和服务器实时地传输一些数据。这个动作,就通过XHR(XHR and Fetch)来实现。

XHR的Headers分为四个模块。
General:
requests URL会在里边,我们想要的目标可以通过访问这个链接实现.
requests method:get 请求的方法是get
status code:200 代表正常相应
Response headers:
目前来看用处不大
Requests headers
你的浏览器发送请求的相关信息。其中最关键的是“User-Agent”,服务器会根据这个来判断你的电脑操作系统、浏览器信息等等。如果你使用Python来访问网站,服务器也会判定它是一个爬虫。
接下来尝试阅读它们的名字找目标所在文件夹。一般名称很显眼,文件也比较大:比如他叫client_search(客户端搜索)。
query string parameters
是浏览器发起GET请求时附带的参数。目前来看用处不大.

出现了如上图这样的一个窗口,
Headers:标头(介绍信息)、Preview:预览、Response:原始信息、Timing:时间。
点击Preview,在里面翻找我们想要的信息.可能不会很好找.


原理:
以目标在data-song-list-0-name为例…
这个XHR是一个字典,键“data”对应的值也是一个字典;在该字典里,键“song”对应的值也是一个字典;在该字典里,键“list”对应的值是一个列表;在该列表里,一共有20个元素;每一个元素都是一个字典;在每个字典里,键“name”的值,对应的是歌曲名。



requests:
requests库可以帮我们下载网页源代码、文本、图片,甚至是音频。其实,“下载”本质上是向服务器发送请求并得到响应。
get用法::
requests.get()
它向服务器发送了一个请求,括号里的参数是你需要的数据所在的网址,然后服务器对请求作出了响应。
post请求:
requests.post函数向服务器传递数据,返回text和content.
如下图,上传时先把待上传的数据封装进一个字典,post函数需要两个参数,一个是网址,一个就是我们刚才封装好的那个字典,赋值给data.


下面讲response:

1)常用属性有四个:

a)
response.status_code是一个很常用的属性,在我们之后的爬虫代码中也将多次出现。

b)
response.content,它能把Response对象的内容以二进制数据的形式返回,适用于图片、音频、视频的下载,看个例子你就懂了。
c)
response.text,这个属性可以把Response对象的内容以字符串的形式返回,适用于文字、网页源代码的下载。
d)
response.encoding,
目标数据本身是什么编码是未知的。用requests.get()发送请求后,我们会取得一个Response对象,其中,requests库会对数据的编码类型做出自己的判断。如果遇上文本的乱码问题,那我们就可以去查看目标数据的编码,然后再用response.encoding把编码定义成和目标数据一致的类型即可。

修改请求头:
把User-Agent的信息写成一个字典,get函数需要两个参数,一个是网址,一个就是我们刚才封装好的那个字典,赋值给headers.User-Agent信息,包括电脑系统,浏览器版本.

import requests
url = '.do'
#网址。
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
#User-Agent信息,包括电脑系统,浏览器版本。
data = {'type':'all','content':'test'}
#数据内容。XHR里面要post的是type和content两个数据。
#content里面的内容就是要解析的文本。
r = requests.post(url,data=data,headers=headers)
#发送请求。
print(r.text)
#将浏览器返回的结果,打印出来。

带参数地请求数据:
我们在使用浏览器上网时,并不总是只下载内容,还有许多上传的动作:翻评论时跳转的页码页,搜索或翻译时输入的文字,玩网页小游戏的点击互动等实际上是我们通过键鼠操作,向服务器发起一个带参数的请求,服务器处理这个请求,并返回了结果。

服务器会根据request url里边的User-Agent判断提交请求的是人还是爬虫,而form data就是POST请求所提交的数据Data。你看到它是一个字典的结构,包含两个键“type”和“content”。不同的XHR会有不同的Data,其键也会有所不同,提交这些数据给服务器,服务器会返回给我们一个字典,可以在Preview中看到。可以利用json模块解析它.


贴一段带注释的代码,用了json带了参数改了请求头:

import requests,json
url = '.do'
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
data = {'type':'all','content':'啦啦优秀好看是的回家睡觉啊'}
r = requests.post(url,data=data,headers=headers)
dividewords = json.loads(r.text)['dividewords']
#使用json模块,提取出了分词的结果。
#此时,json.loads(r.text)作为整体它是一个字典,后面可以跟括号,括号里面是一个键。
#将取出的结果赋值给dividewords,它会是一个字符串。
dividewords = dividewords.split(' ')
#字符串类的对象,都有一个方法叫split,可以把字符串转为列表。
#split方法需要输入参数,参数的内容是用于切分字符串的符号。
#此处,我们用空格切分字符串。那么列表的每个元素,就是一个词和它的词性。
newwords=[]
#创建一个空列表,命名为newwords。
cixing = []
#创建一个空列表,命名为cixing。for x in dividewords:
#启动一个循环if x == dividewords[-1]:#dividewords的最后一个元素是一个空的字符串,用[-1]表示continue#跳过它,继续循环else:singleword = x.split('/')#针对dividewords里的元素,这是一个字符串,由一个词和它的词性组成,中间用/隔开。#用/来把它们做切分,形成一个列表,命名为singleword。newwords.append(singleword[0])#singleword里的第0个元素,就是词。把它添加进列表newwords。cixing.append(singleword[1])#singleword里的第1个元素,就是词性。把它添加进列表cixing。
print(newwords)
#打印出所有的词。
print(cixing)
#打印出所有的词性。

在Python当中有这样一个模块,它的名字叫json。它的技能是text进去,列表/字典出来
用法:
json.loads(XXX.text)


BeautifulSoup(用来解析数据后提取数据)
不同于json解析XHR,BeautifulSoup能做到的是解析html网页源代码。
如果我们要找的东西被直接写进了网页源代码,而不是XHR。那么就轮到BeautifulSoup大放异彩。
BeautifulSoup干起活来是三步走:解析;查找;提取.
解析是读取网站的源代码;查找是定位我们想找的元素;提取是从元素里把我们想要的东西给拿出来。

解析数据:
bs对象=BeautifulSoup(要解析的文本,‘解释器’)
此处注意,要解析的文本必须是字符串.html.parser"就是解析器,帮助BeautifulSoup来读懂数据
例:

bsmovie = bs4.BeautifulSoup(res.text,'html.parser')

提取数据:

这一步,又可以分为两部分知识:find()与find_all(),以及Tag对象。
方法select()也可以达到相同目的,回头自己查用法.好像用比较少
全部用法:

最常用:

find(‘div’)运行结果正是首个< div>元素,它的数据类型:<class ‘bs4.element.Tag’>,说明这是一个Tag类对象。
find_all(‘div’)运行结果是全部

元素,它们一起组成了一个列表结构。打印items的类型,显示的是<class ‘bs4.element.ResultSet’>,是一个ResultSet类的对象。其实是Tag对象以列表结构储存了起来,可以把它当做列表来处理。

说明:

  1. 举例中括号里的class_,这里有一个下划线,是为了和python语法中的类 class区分,避免程序冲突。当然,除了用class属性去匹配,还可以使用其它属性,比如style属性等。
  2. 括号中的参数:标签和属性可以任选其一,也可以两个一起使用,这取决于我们要在网页中提取的内容。如果只用其中一个参数就可以准确定位的话,就只用一个参数检索。如果需要标签和属性同时满足的情况下才能准确定位到我们想找的内容,那就两个参数一起使用。

那么如何用写代码替代搜索这个动作?
先去看搜索页的网址结构。
《水形物语》“.php?kwtype=0&searchtype=title&keyword= %CB%AE%D0%CE%CE%EF%D3%EF”,
《敦刻尔克》:“.php?kwtype=0&keyword= %B6%D8%BF%CC%B6%FB%BF%CB”

尝试搜索不同的电影名字,你能看到:前半部分是通用地址".php?kwtype=0&keyword=",后半部分一堆%的内容,代表的应该就是电影名.
在网址结构里,%是分隔符,用于分隔一个字节和另一个字节。像CB/AE/D0……这些,都是十六进制的数字。
要先确认一个问题,此处用的编码是gbk还是utf-8
插个有用的函数:
quote(),这个函数存在于urllib库里,urllib是一个python内置的库.
它的技能是把gbk/utf-8编码的结果,转换成网址的样子。

from urllib.request import quote
#quote函数,可以帮我们把内容转为标准的url格式,作为网址的一部分打开。
movie = '水形物语'
gbkmovie=movie.encode('gbk')#将汉字,用gbk格式编码,赋值给gbkmovie。
urlmovie = '.php?kwtype=0&searchtype=title&keyword='+quote(gbkmovie)
#将gbk格式的内容,转为url,然后和前半部分的网址拼接起来。
print(urlmovie)

res.text是网页的源代码,html.parser是调用python的内置html解释器。这样,我们就创造了一个BeautifulSoup的对象,命名为bsmovie。
Python中还有许多种解析器,"html.parser"是通用性最好的一个。
当我们得到一个BeautifulSoup对象,就可以进行下一步操作。我们会用“select()”的方法来找寻想要的内容。这时候就要用到,标签/元素/属性/id属性/class属性

class咋用:

link = bsmovie.select('.co_content8 b a')
#你能看出它的意思是:匹配class属性的值为co_content8的元素,在它的内部再查找名为<b>的元素,在<b>元素里再找标签为<a>的元素。

html允许同一个元素内,有两个子元素它们的标签一模一样。所以有可能不论你怎么设置关键词,查找出的结果都混有其他元素.因此,通过select()方法返回的内容,是一个list。list的长度,等于你查找到的元素数量。如果你的查找结果是唯一的,那么list的长度就是1。然而他也有可能是34567.

使用"变量.select()"来从BeautifulSoup对象查找目标元素,返回的是一个list对象,组成这个list的元素是Tag对象.
这里的Tag对象,其本质是网页标签。如果是对象,就有方法和属性可供我们调用。
利用上表中的函数/方法,可以打印Tag对象,提取它的属性,提取属性的值,提取文本内容。

用str()函数把tag对象变成字符串后可以作为BeautifulSoup的参数,被再解析一次。可用在处理一些复杂页面时.

如果下载遇到乱码:
可能编码方式不同.比如网站是使用gbk编码的,而程序却默认使用了utf-8编码,把requests下载到的网页源代码,使用gbk进行decode解码即可.

xiazai = requests.get(finallink).content.decode('gbk')
#使用requests模块,拿到电影下载页的源代码。使用content方法,拿到bytes数据,再进行decode,此时xiazai是字符串。
bsxiazai = bs4.BeautifulSoup(xiazai,'html.parser')
#解析网页。因为此时的xiazai已经是字符串,所以不需要加text。

贴个完整代码:

import requests,bs4
#引用requests和bs4(BeautifulSoup4的缩写),如果没有安装bs4,可以使用pip install beautifulsoup4下载。 
from urllib.request import quote
#quote函数,可以帮我们把内容转为标准的url格式,作为网址的一部分打开。
movie = '水形物语'
gbkmovie=movie.encode('gbk')
#将汉字,用gbk格式编码,赋值给gbkmovie。
urlmovie = '.php?kwtype=0&searchtype=title&keyword='+quote(gbkmovie)
#将gbk格式的内容,转为url,然后和前半部分的网址拼接起来。
res =requests.get(urlmovie)
#下载水形物语的搜索页面
bsmovie = bs4.BeautifulSoup(res.text,'html.parser')
#解析网页。
link = bsmovie.select('.co_content8 b a')
#查找目标。
finallink = '' + link[0].get('href')
#得到电影下载页的地址。
xiazai = requests.get(finallink).content.decode('gbk')
#使用requests模块,拿到电影下载页的源代码。使用content方法,拿到bytes数据,再进行decode,此时xiazai是字符串。
bsxiazai = bs4.BeautifulSoup(xiazai,'html.parser')
#解析网页。因为此时的xiazai已经是字符串,所以不需要加text。
download = bsxiazai.select('table tbody tr a')
#查找目标。
print(download[0].get('href'))
print(download[1].get('href'))

更多推荐

大白话版爬虫原理html是啥以及requests/json/beautifulsoup咋用

本文发布于:2024-02-25 18:29:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1699899.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:大白话   爬虫   原理   html   咋用

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!