美文网首页Python网络爬虫与信息提取
(一)爬取中国大学排名(BeautifulSoup库)|Pyth

(一)爬取中国大学排名(BeautifulSoup库)|Pyth

作者: 努力奋斗的durian | 来源:发表于2018-01-15 20:30 被阅读271次

    1.爬取网页的步骤
    2.爬取网页的代码及显示结果
    3.自定义getHTMLText函数代码存在的知识点
    4.自定义fillUnivList函数代码存在的知识点
    5.自定义printUnivList函数代码存在的知识点
    以下内容是看了【Python网络爬虫与信息提取】.MOOC. 北京理工大学 的视频,自己整理并分析的结果。
    最近更新:2018-01-15
    视频原链接:https://www.bilibili.com/video/av9784617/index_22.html#page=32

    1.爬取网页的步骤

    • 步骤1:确认是否安装requests库,BeautifulSoup4库;
      安装方法参考:Windows系统的cmd,以requests为例,输入:pip install requests
    • 步骤2:打开软科中国最好大学排名2016网页链接。
      http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
    • 步骤3:在网页右击鼠标右键,选择““查看源代码””,查看代码是否为html代码中,如是则可以用requests,BeautifulSoup4库可以提取相关的信息。如不是,则不可以。
    • 步骤4:查看该网站的Robots协议。(该网站无Robots)。
    • 步骤5:确认爬取资料的目的,撰写代码,并进行爬取数据。
      a)输入:大学排名URL链接;
      b)输出:大学排名信息的排名(排名,大学名称,总分);
      c)技术路线:requests-bs4;
      d)定向爬虫:仅对输入URL进行定向爬取,不扩展爬取。

    2.爬取网页的代码及显示结果

    2.1爬取网页的代码

    #CrawUnivRankingB.py
    import requests
    from bs4 import BeautifulSoup
    import bs4
    
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ""
    
    def fillUnivList(ulist, html):
        soup = BeautifulSoup(html, "html.parser")
        for tr in soup.find('tbody').children:
            if isinstance(tr, bs4.element.Tag):
                tds = tr('td')
                ulist.append([tds[0].string, tds[1].string, tds[3].string])
    
    def printUnivList(ulist, num):
        tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
        print(tplt.format("排名","学校名称","总分",chr(12288)))
        for i in range(num):
            u=ulist[i]
            print(tplt.format(u[0],u[1],u[2],chr(12288)))
        
    def main():
        uinfo = []
        url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
        html = getHTMLText(url)
        fillUnivList(uinfo, html)
        printUnivList(uinfo, 20) # 20 univs
    main()
    

    2.2 代码显示的结果


    大学排名.png

    3.自定义getHTMLText函数代码存在的知识点

    def getHTMLText(url):
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ""
    

    3.1自定义getHTMLText函数的理解
    从网络上获取大学排名网页内容
    3.2 requests.get的理解

     r = requests.get(url, timeout=30)
    #requests.get(url, params=None,**kwarge)#
    

    timeout设定超时时间,以秒为单位

    4.自定义fillUnivList函数代码存在的知识点

    def fillUnivList(ulist, html):
        soup = BeautifulSoup(html, "html.parser")
        for tr in soup.find('tbody').children:
            if isinstance(tr, bs4.element.Tag):
                tds = tr('td')
                ulist.append([tds[0].string, tds[1].string, tds[3].string])
    

    4.1自定义fillUnivList函数的理解
    提取网页内容中信息到合适的数据结构

    4.2 Beautiful Soup库的解析器是

    soup = BeautifulSoup('<html>data</html>','html.parser')
    
    soup = BeautifulSoup(html, "html.parser")
    

    这里的代码中的html是跟解释器中的“标签树”相对应。

    4.3 Beautiful Soup标签树的下行遍历

    soup.find('tbody').children:
    
    • find()意思是搜索且返回一个结果是字符串类型,同.find_all()参数。
    • .childreny意思是字节点迭代类型,与.contents类似,用于循环遍历儿子节点。其他扩展:
      .contents子节点的列表,将<tag>所有儿子节点存入列表;
      .descendans子节点的迭代类型,包含所有的子孙节点,用于循环遍历。

    4.4标签的过滤

    if isinstance(tr, bs4.element.Tag):
    

    这里isinstance检测出tbody儿子中的标签类,过滤掉非标签类。

    5.自定义printUnivList函数代码存在的知识点

    def printUnivList(ulist, num):
        tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
        print(tplt.format("排名","学校名称","总分",chr(12288)))
        for i in range(num):
            u=ulist[i]
            print(tplt.format(u[0],u[1],u[2],chr(12288)))
    

    5.1 自定义printUnivList函数的理解
    利用数据结构展示并输出结果 。

    5.2 format知识点

    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    

    format知识点
    请参考此博文:https://www.jianshu.com/p/e6912942f3f4

    5.2解决中文对齐问题
    采用中文字符的空格填充 chr(12288)。

    相关文章

      网友评论

        本文标题:(一)爬取中国大学排名(BeautifulSoup库)|Pyth

        本文链接:https://www.haomeiwen.com/subject/jqedoxtx.html