您的位置:首页 > 其它

爬虫实例

2020-08-29 00:21 141 查看

爬虫实例

中国最好大学软科排名爬虫
这里我们结合前面学过的requests库和beautifulSoup4库来实现爬虫功能。
首先创建一个网页爬虫需要三个过程:
1.从网络上获取网页的内容
2.提取我们需要的数据存入数据结构中
3.按照我们的格式输出数据。

第一步可以通过requests库的get函数创建Response对象利用对象的属性获取。
第二步需要我们分析网页的源代码,从代码中读出我们需要的数据。因此需要我们从浏览器中获取爬取网页的源代码。
第三部就是调整输出的格式,符合我们的要求即可。

那么我们现在采用自顶向下的方法来设计程序。
首先需要一个函数来获取网页内容。需要一个函数来处理数据。
需要一个函数用于输出数据。

step1
获取网页内容

#设计getHtml函数用于获取网页的代码内容
def getHtml(url):
try:
r = requests.get(url, timeout=20)
r.raise_for_status()
r.encoding='gbk'
return r.text
except:
return ""

这里面需要注意的是:那个编码的使用会直接导致输出的汉字是不是乱码。我第一次设计的时候用的编码是’utf-8’编码,结果输出的汉字都是乱码。

当时觉得汉字的编码不都是utf-8吗。想到了前面提到过的两种编码形式:utf-8和gbk,然后我就把编码改为了gbk,然后那个输出结果他就好了。。。
获取网页内容这段代码之前我们也讲到过,这里就直接引用了哈
然后我们的step1就完成了哟

step2
处理网页内容

这里需要我们获取网页的源代码,可以直接在浏览器的工具栏里查看。
我用的是360浏览器

如图操作就可以获取网页的源代码了,一会我会把网页和源代码网址附在下面。
我们点进去源代码网页,一眼望去好多行代码。
这是我们来分析一波哈
我们需要提取的是中国大学的排名信息即:排名、学校名称、省市、总分、学校类型。所以我们就去找含有这些关键词的拿一部分代码,为了看着方便我把他们粘贴了出来,筛选了我想看到的代码如下图

一波分析发现与每个学校的信息相关的代码的开头都是标签 tr,都是以td为结尾。而且可以看出这些标签中嵌套的还有标签,因此我们可以采用beautifulSoup4库的find_all方法来找到所有的tr开头的标签。找到每个tr标签后,我们需要逐一访问他们后边的td标签,因为我们的信息在td标签后面。通过访问td标签来得到我们需要的信息。如果td标签的长度为0的话就说明他没有存内容,此时这里没有我们需要的信息,因此可以用if和continue进行判断是否需要存入信息。

allUniv=[]#设计一个列表用于存储总的数据
def deal(soup):
#找到所有的tr标签
data=soup.find_all('tr')
for tr in data:
#在每个tr标签中找到td标签
ltd=tr.find_all('td')
#如果td标签的长度为0说明不包含我们需要的信息,此时不需要将内容保存,此处进行判断。
if len(ltd)==0:
continue
#设计一个空列表用于存放每个tr标签后的td标签的内容
singleUniv=[]
for td in ltd:
singleUniv.append(td.string)
#将每个tr标签后的td标签的内容当作一个元素存入一个列表。
allUniv.append(singleUniv)

到这里我们的step2就完成啦,是不是没有那么复杂呢

step3
输出结果

这里的输出需要用到我们前面讲到的format的对齐方式,我自己的输出格式不是很美观,因此这里参考了书上的对齐格式,大家可以康康。

def print_result(number):
print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^10}{5:{0}^4}".format(chr(12288),"排名","学校名称","省市","类型","学校得分"))
for i in range(number):
u=allUniv[i]
print("{1:^4}{2:{0}^10}{3:{0}^5}{4:{0}^10}{5:{0}^8.1f}".format(chr(12288), u[0],u[1],u[2],u[3],eval(u[4])))

step4:
最后把我们的函数封装到一块就可以啦

def main(number):
url="https://www.dxsbb.com/news/44368.html"
html=getHtml(url)
soup=BeautifulSoup(html,features="html.parser")
deal(soup)
print_result(number)

这里需要明确每个函数需要的参数
getHtml函数需要我们传入一个网址,deal函数需要我们传入一个beautifulSoup的对象,因我们调用的方法和属性都是通过beautifulSoup对象调用的。
最后输出的结果可以根据我们想要获取多少名来进行输入。
我传入的参数是10,我们接下来看看完整的代码和运行效果

附:
中国大学排名的网址
排名源代码的网址

完整代码以及运行结果展示:

import requests
from bs4 import BeautifulSoup
allUniv=[]
#设计getHtml函数用于获取网页的代码内容
def getHtml(url):
try:
r = requests.get(url, timeout=20)
r.raise_for_status()
r.encoding='gbk'
return r.text
except:
return ""#设计deal函数处理得到的html的内容
def deal(soup):
#找到所有的tr标签
data=soup.find_all('tr')
for tr in data:
#在每个tr标签中找到td标签
ltd=tr.find_all('td')
#如果td标签的长度为0说明不包含我们需要的信息,此时不需要将内容保存,此处进行判断。
if len(ltd)==0:
continue
#设计一个空列表用于存放每个tr标签后的td标签的内容
singleUniv=[]
for td in ltd:
singleUniv.append(td.string)
#将每个tr标签后的td标签的内容存入一个列表。
allUniv.append(singleUniv)
def print_result(number):
print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^10}{5:{0}^4}".format(chr(12288),"排名","学校名称","省市","类型","学校得分"))
for i in range(number):
u=allUniv[i]
print("{1:^4}{2:{0}^10}{3:{0}^5}{4:{0}^10}{5:{0}^8.1f}".format(chr(12288), u[0],u[1],u[2],u[3],eval(u[4])))def main(number):
url="https://www.dxsbb.com/news/44368.html"
html=getHtml(url)
soup=BeautifulSoup(html,features="html.parser")
deal(soup)
print_result(number)main(10)

结果如下:

其实网络爬虫远不止这么简单,现在写的也只是入门而已,伴随着初级爬虫程序的完成,我的py初级学习笔记也就到此结束啦,感谢大家的陪伴。想要深入了解的小伙伴们可以查阅相关资料,我以后有一些新的见解也会及时整理更新。
又要说再见了呢,py的学习到这里就告一段落了,我们在c语言的学习中再见叭
(`・ω・´)
那么今天,你学废了吗

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: