爬虫实例
爬虫实例
中国最好大学软科排名爬虫
这里我们结合前面学过的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语言的学习中再见叭
(`・ω・´)
那么今天,你学废了吗
- scrapy爬虫框架学习入门教程及实例
- python爬虫实例项目大全
- java爬虫Gecco工具抓取新闻实例
- Scrapy爬虫(八):中间件的使用实例
- Node.js环境下编写爬虫爬取维基百科内容的实例分享
- scrapy爬虫实例分享
- python实例2-写一个爬虫下载小功能
- Android利用爬虫实现模拟登录的实现实例
- python 爬虫005-爬虫实例
- SHELL网络爬虫实例剖析--转载
- Python爬虫实践(九):第一个爬虫实例(简书首页)
- 爬虫实例
- nodeJS实现简单网页爬虫功能的实例(分享)
- python爬虫实例项目大全
- Python爬虫之正则表达式基本用法实例分析
- scrapy框架爬虫,爬取腾讯职业实例
- Python爬虫DOTA排行榜爬取实例(分享)
- python爬虫实战:之爬取京东商城实例教程!(含源代码)
- 中国大学排名定向爬虫实例
- Python爬虫实例