早上好啊,大佬们。今天我们来讲讲爬虫中最重要的一部分——页面解析。
在之前我们向页面发起了请求,然后从中获取了一个内容,然后如果想要获取一批类似的内容该怎么做呢?
按照之前的方式,将每一个都单拎出来获取,这显然是不太现实。
那么我们就应该想想其它更好的方式,我们也提到了,想要获取的数据是一些类似的内容,那么对于它们的URL或者,内容的存储位置是否类似。
基于这个思路,我们就需要对页面进行解析,那么开干!!
页面解析
我们就来看看CSDN的主页吧~
右键,检查。然后点左上角的对应元素查找
然后在页面中选择你所需要的内容,例如说,我想要获取页面中的url跳转链接。
然后,我们发现每一个内容的存储格式都是一样的,然后再内层的跳转链接的存储格式也是一样的。
到这里,我们就得出了一个结论,对于CSDN中的每一个跳转链接的存储格式都是一样的。
不知道大家有没有对于一个页面进行过搜索。例如说,我们在CSDN的主页中按
Ctrl + F
搜索框中输入 学习 然后我们它会返回搜索结果,例如说,我现在搜出来3个。
通过这个进行引申,我们也同样可以在检查中进行搜索,然后假如说我们能够获取搜索结果,是不是就能够获取到我们所需要的内容。
Beautiful Soup
OK,针对上面的思路,再Python中的导入库中还真有这么个东西,而且还不少。
Beautiful Soup
XPath
正则表达式
诸如此类
那么我们今天这一期也不多讲,就先讲讲 —— Beautiful Soup
Bs4包安装
Win + R 输入 cmd 打开终端
然后输入下面这行代码
pip install bs4 lxml
因为我这边已经安装好了,所以显示是这样的。
语法规则
首先来讲讲它的语法规则。
【.】来索引 class
【#】来索引 id
【空格】 切换到下一层索引
索引规则是,从外到内,层层深入
实战 —— CSDN跳转链接获取
在检查中按 Ctrl + F 打开搜索框。
然后点对应对象,指向包含所有内容的部分,一般都是在内容的上一层,也就是图中页面里蓝色框。
就按照这样,一层层往里面深入。
在每一个class或者id 的内容中不能出现 空格。
这是我最后写出来的 Beautiful Soup 表达式 ——
div.Community div.active div.content a
由于中间一些大层中的索引对结果没有影响,所以我就没有加上。
但是对于我写的这个表达式并不十分完美,大家可以看一下下面,在同索引下,有不是我们所需要的内容。
但是,小白兔不会了,只能写到这里了,好在它是有规律的,它多了一倍,每一个都是作者的主页链接,然后两者是交相出现的,所以我们可以在代码中处理掉。
div.Community div.active div.content a
对于这个,希望大佬能帮小白兔优化一下表达式。
到这里,我们就完成了Beautiful Soup表达式,下面我们就开始爬取这个网页吧。
程序代码
首先是对页面请求响应。
import requests
from bs4 import BeautifulSoupurl = 'https://www.csdn.net/?spm=1011.2266.3001.4476'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
} #CSDN的网页只检查这个,所以加上这个就可以了html = requests.get(url,headers=headers)
后面我们就需要对页面进行解析
import requests
from bs4 import BeautifulSoupurl = 'https://www.csdn.net/?spm=1011.2266.3001.4476'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
} #CSDN的网页只检查这个,所以加上这个就可以了html = requests.get(url,headers=headers)
#这里我们就把网页爬取下来了。
#下面我们就需要用Bs4表达式来解析页面了。
soup = BeautifulSoup(html.text, 'lxml') #这里是解析页面urls = soup.select('div.Community div.active div.content a') #这里是在页面内容中搜索我们所需要的,也就是之前写的那个Bs4表达式
#print(urls)
#里面的内容对于每一个大内容是通过列表存储的,然后对于每个我们所需的内容是用字典存储的。for i in range(len(urls) // 2): #前面分析的时候,我们发现所获取的内容还有作者的主页链接,需要把它跳过print(urls[2*i].get('href')) #观察字典内容,我们可以发现存储url的key是href
然后我们就把我们所需的链接爬取下来了。
大家可以再试试把它们的标题内容爬取下来。
OK,大家先试试看,下面会提供解答。
CSDN标题获取
Bs4表达式
Bs4:div.Community div.active div.content p.Community-h-tag span.blog-text
Python代码
import requests
from bs4 import BeautifulSoupurl = 'https://www.csdn.net/?spm=1011.2266.3001.4476'
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
} #CSDN的网页只检查这个,所以加上这个就可以了html = requests.get(url,headers=headers)
#这里我们就把网页爬取下来了。
#下面我们就需要用Bs4表达式来解析页面了。
soup = BeautifulSoup(html.text, 'lxml') #这里是解析页面urls = soup.select('div.Community div.active div.content a') #这里是在页面内容中搜索我们所需要的,也就是之前写的那个Bs4表达式
#print(urls)
#里面的内容对于每一个大内容是通过列表存储的,然后对于每个我们所需的内容是用字典存储的。
titles = soup.select('div.Community div.active div.content p.Community-h-tag span.blog-text')for i in range(len(titles)):print(urls[2*i].get('href')) #观察字典内容,我们可以发现存储url的key是hrefprint(titles[i].text)
效果
注意点
我们下面来讲一下,获取标题时候遇到的一些容易错的地方。
首先是写Bs4表达式的时候,如果大家的表达式是这样的话
div.Community div.active div.content p.Community-h-tag span
你就会发现你所获取到的内容偏多了。因为在页面中的这个100.0元也是能通过这样搜索到的。
所以我们要更精细一点 ——
div.Community div.active div.content p.Community-h-tag span.blog-text
然后对于输出时,记住 titles 比 urls 少。
尾声
那么这一期的内容就这么多,相信大家很快就能掌握了。
然后,所有的学习都离不开一个东西 —— 练习。
所以,在这里,小白兔在这里给大家一个题目,可以回去尝试一下。
在百·度进行搜索,然后只获取 跳转链接urls 和 标题titles,大家可以把自己的结果分享在评论区,在评论区进行交流,大家一起互相交流学习。
那么 Bye~ Bye~