Python 爬虫的学习以及实践

BeautifulSoup 库是学习python的一个用来进行解析,遍历,维护html,xml文档的第三方库。
学习本内容需有基础的 html 知识。

BeautifulSoup 库也叫BeautifulSorp4 或者bs4 ,主要调用BeautifulSoup类。
引用方式:

import bs4from bs4 import BeautifulSoup

- BeautifulSoup库的基本元素


  • BeautifulSoup 库的解析器

这里写图片描述

  • BeautifulSoup 类的基本元素

这里写图片描述

接下来使用BeautifulSoup 先尝试一下。

import requests
from bs4 import BeautifulSoup

url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)      # 请求网页信息
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")   # 将网页源代码解析
print(Beaful_text.prettify())
  • prettify() 方法的使用

使用BeautifulSoup 中的 prettify 方法,需要建立BeautifulSoup 类的对象。

Beaful_text = BeautifulSoup(demo,"html.parser")      #  建立了一个BeautifulSoup类对象
print(Beaful_text.prettify())               #  使用prettify 方法输出网页源代码
print(type(Beaful_text))                   #  <class 'bs4.BeautifulSoup'>
  • Tag 标签的使用

    这里写图片描述

html 与xml 文档就是由最基本的元素——标签组成。分别用“<>”和”<反斜杠>”标记开头与结尾
// 因为csdn的创作窗口也是html格式,所以/ 不能包含在<>内,还请见谅。。

Tag 的 name(名字)

url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.name)                #  获取标签a的上一层标签的名字
print(Beaful_text.a.parent.name)         #  获取便签a的名字

Tag 的 attrs(属性)

url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.attrs)             #  获取标签a的属性
print(Beauful_text.a.attrs['href'])
'''
 {'href': 'http://news.baidu.com', 'name': 'tj_trnews', 'class': ['mnav']}
 http://news.baidu.com
'''

Tag 的 NavigableString

标签内非属性字符串,标签中字符串,格式:<标签>.string

url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)
r.encoding = r.apparent_encoding        #  将编码格式进行转化    
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.string)        # 获取<>..</> 中的字符串

Tag 的 Comment (注释)

# html注释格式为 <!--注释内容-->
url = "http://www.baidu.com"
r = requests.get(url,timeout = 30)
r.encoding = r.apparent_encoding
demo = r.text
Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.comment)           #  获取注释内容

标签树的遍历

我们学习了BeautifulSoup库的基本知识点后,进行进一步的深入学习。

上面提到,html 与 xml 文档是由标签组成了,而标签中存在着的逻辑关系就像一棵大树,最底层是Document ,再往下是html或者xml,再往下是headbody······
这些东西构成了我们所看见的网页。为了得到想要的信息,我们有时候寻找的标签很多,因此便需要相应的遍历算法来解决这一问题。

BeautifulSoup库中提供三种遍历方法:上行遍历,平行遍历,下行遍历
这里写图片描述

  • 下行遍历
    这里写图片描述
Beaful_text = BeautifulSoup(demo,"html.parser")
print(len(Beaful_text.head.contents))          #  统计树的成熟
print(Beaful_text.head.contents[1])         #  输出第一个层标签的信息

#  使用for循环下行遍历节点
for i in Beaful.head.children:         #  遍历儿子节点
    print(i)

for i in Beaful.head.descendants:      #  遍历子孙节点
    print(i)
  • 上行遍历

这里写图片描述

Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.title.parent)         #  输出上一层标签的信息

#  使用for循环上行遍历节点
for i in Beauful.title.parents:
    if i is None:        #  遍历所有节点,包括soup本身
        print(i)
    else:
        print(i.name)
  • 平行遍历
    这里写图片描述

平行遍历发生在同一个父节点下,不同父节点下不能使用平行遍历。

Beaful_text = BeautifulSoup(demo,"html.parser")
print(Beaful_text.a.next_siblings)

#  使用for循环平行遍历节点
forsibling insoup.a.next_sibling:   #  遍历后续节点
    print(sibling)

forsibling insoup.a.previous_sibling:   #  遍历前续节点
    print(sibling)

实例

在学习** BeautifulSoup 和 **requests 库后,我们选取一个网页进行爬虫训练。

选取了新东方留学频道里面的一篇文章,我们要爬取网页中展示的大学,并进行排序。
这里写图片描述

import requests
from bs4 import BeautifulSoup

tem = "a"           #  定义tem 全局变量

def Get_webtext(url):     #  获取网页源代码
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        soup = BeautifulSoup(r.text, 'html.parser')
        return soup
    except:
        return "Erro"

def Get_information(web_text):      #  从源代码中获取需要的信息
    count = 0                         #  大学排名计数器
    for i in web_text.body.descendants:
        if i.name =="span":           #  获取标签“span”的信息
            if tem == str(i.string):              #  判断上一条span信息与这一条是否相同
                continue
            if  Judge(str(i.string)) !=" ":       #  判断span的信息是否符合要求
                count += 1
                print("{}  {}".format(count, i.string))    #  输出排名
        tem = str(i.string)

def Judge(information):               #  判断span信息是否符合要求
    '''
    若信息中有“大学”或者“学院”,则返回信息,否则返回空格
    '''
    if "大学" in information: 
        return information            
    elif "学院" in information:
        return information
    else:
        return " "

if __name__ == '__main__':
    url = "http://goabroad.xdf.cn/201711/10729693.html"
    web_text = Get_webtext(url)
    Get_information(web_text)

运行结果

'''
1  斯坦福大学 Stanford University
2  麻省理工学院 Massachusetts Institute of Technology
3  牛津大学 University of Oxford
4  苏黎世联邦理工学院 ETH Zurich – Swiss Federal Institute of Technology Zurich
5  剑桥大学 University of Cambridge
6  加州理工学院 California Institute of Technology
7  卡内基梅隆大学 Carnegie Mellon University
8  佐治亚理工学院 Georgia Institute of Technology
9  帝国理工学院 Imperial College London
10  洛桑联邦理工学院 École Polytechnique Fédérale de Lausanne
11  哈佛大学 Harvard University
12  普林斯顿大学 Princeton University
13  新加坡国立大学 National University of Singapore
14  爱丁堡大学 University of Edinburgh
15  康奈尔大学 Cornell University
16  慕尼黑理工大学 Technical University of Munich
17  华盛顿大学 University of Washington
18  哥伦比亚大学 Columbia University
19  清华大学 Tsinghua University
'''

这里写图片描述

一天的工作终于完了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值