美文网首页python
Python爬虫学习笔记 1

Python爬虫学习笔记 1

作者: 小新_XX | 来源:发表于2019-07-24 17:12 被阅读15次

    本篇笔记主要基于莫烦老师的python爬虫入门教程:https://morvanzhou.github.io/tutorials/data-manipulation/scraping/
    本片笔记的完整代码见

    I. 认识网页构成

    1.1 HTML

    HTML即超文本标记语言(Hyper Text Markup Language),制作网页的一种标记语言(Markup Language),不是一种编程语言。
    1.1.1 HTML的结构:HTML中每个实体都用tag框住,从而可以被展示为不同的形式或功能。爬虫:根据tag来找到合适的信息。
    (1)header:存放网元信息,即给浏览器看的内容;
    (2)body:存放网页信息,即显示给用户的内容,如视频,图片,文字等。

    1.2 Python的网页操作

    1.2.1 用python登录网页并打印网页信息

    from urllib.request import urlopen
    # if has Chinese, apply decode()
    html = urlopen("https://morvanzhou.github.io/static/scraping/basic-structure.html").read().decode('utf-8')
    print(html)
    

    输出:

    <!DOCTYPE html>
    <html lang="cn">
    <head>
    <meta charset="UTF-8">
    <title>Scraping tutorial 1 | 莫烦Python</title>
    <link rel="icon" href="https://morvanzhou.github.io/static/img/description/tab_icon.png">
    </head>
    <body>
    <h1>爬虫测试1</h1>
    <p>
    这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
    <a href="https://morvanzhou.github.io/tutorials/data-manipulation/scraping/">爬虫教程</a> 中的简单测试.
    </p>
    </body>
    </html>

    1.2.2用Python的正则表达式匹配网页信息

    import re
    res = re.findall(r'<p>(.*?)</p>',html, flags=re.DOTALL)
    print('\nPage paragraph is ',res[0])
    

    输出:

    Page paragraph is
    这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
    <a href="https://morvanzhou.github.io/tutorials/data-manipulation/scraping/">爬虫教程</a> 中的简单测试.

    res = re.findall(r'href="(.*?)"',html)
    print('\nAll links: ')
    for r in res:
        print(r)
    

    输出:

    All links:
    https://morvanzhou.github.io/static/img/description/tab_icon.png
    https://morvanzhou.github.io/
    https://morvanzhou.github.io/tutorials/data-manipulation/scraping/

    II. 用BeautifulSoup解析网页

    2.1 BeautifulSoup简介

    Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,它代替了正则表达式来选取HTML中的tag等相关信息。
    使用Beautiful Soup爬取网站信息的步骤:

    1. 选取网址(url)
    2. 使用python登录该网址(uropen等)
    3. 读取网页信息(read()等)
    4. 将读取的信息放入Beautiful Soup
    5. 使用Beautiful Soup选取tag信息等
    2.2应用实例
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, features='lxml')
    print(soup.h1)
    print(soup.p)
    all_href = soup.find_all('a')
    print(all_href)
    all_href = [item['href'] for item in all_href]
    print(all_href)
    

    输出:

    <h1>爬虫测试1</h1>
    <p>
    这是一个在 <a href="https://morvanzhou.github.io/">莫烦Python</a>
    <a href="https://morvanzhou.github.io/tutorials/data-manipulation/scraping/">爬虫教程</a> 中的简单测试.
    </p>
    [<a href="https://morvanzhou.github.io/">莫烦Python</a>, <a href="https://morvanzhou.github.io/tutorials/data-manipulation/scraping/">爬虫教程</a>]
    ['https://morvanzhou.github.io/', 'https://morvanzhou.github.io/tutorials/data-manipulation/scraping/']

    III. Beautiful Soup和CSS

    层叠样式表(Cascading Style Sheets,CSS)是一种用来表现HTML或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。简单来说,CSS是用来装饰HTML的。

    3.1 CSS的Class

    CSS 在装饰每一个网页部件的时候, 都会给它一个名字。 而且一个类型的部件, 名字都可以一样。

    from bs4 import BeautifulSoup
    from urllib.request import urlopen
    html = urlopen('https://morvanzhou.github.io/static/scraping/list.html').read().decode('utf-8')
    print(html)
    

    输出:
    <!DOCTYPE html>
    <html lang="cn">
    <head>
    <meta charset="UTF-8">
    <title>爬虫练习 列表 class | 莫烦 Python</title>
    <style>
    .jan {
    background-color: yellow;
    }
    .feb {
    font-size: 25px; }
    .month {
    color: red;
    }
    </style>
    </head>
    <body>
    <h1>列表 爬虫练习</h1>
    <p>这是一个在 <a href="https://morvanzhou.github.io/" >莫烦 Python</a> 的 <a href="https://morvanzhou.github.io/tutorials/data-manipulation/scraping/" >爬虫教程</a>
    里无敌简单的网页, 所有的 code 让你一目了然, 清晰无比.</p>
    <ul>
    <li class="month">一月</li>
    <ul class="jan">
    <li>一月一号</li>
    <li>一月二号</li>
    <li>一月三号</li>
    </ul>
    <li class="feb month">二月</li>
    <li class="month">三月</li>
    <li class="month">四月</li>
    <li class="month">五月</li>
    </ul>
    </body>
    </html>

    提取所有month的信息

    soup = BeautifulSoup(html, features='lxml')
    month = soup.find_all('li', {'class':'month'})
    for m in month:
    print(m.get_text())
    

    输出:
    一月
    二月
    三月
    四月
    五月

    提取所有月份+日期的信息

    jan = soup.find('ul', {"class":"jan"})
    d_jan = jan.find_all('li')
    for d in d_jan:
        print(d.get_text())
    

    输出:
    一月一号
    一月二号
    一月三号

    3.2 正则表达式匹配网页
    from bs4 import BeautifulSoup
    from urllib.request import urlopen
    html = urlopen("https://morvanzhou.github.io/static/scraping/table.html").read().decode('utf-8')
    print(html)
    #找出所有图片的链接
    import re
    soup = BeautifulSoup(html, features='lxml')
    img_links = soup.find_all("img", {"src": re.compile('.*?\.jpg')})
    for link in img_links:
        print(link['src'])
    #输出
    #https://morvanzhou.github.io/static/img/course_cover/tf.jpg
    #https://morvanzhou.github.io/static/img/course_cover/rl.jpg
    #https://morvanzhou.github.io/static/img/course_cover/scraping.jpg
    
    #找出所有课程的链接:以https://morvan开头
    course_links = soup.find_all('a', {'href':re.compile('https://morvan.*')})
    for link in course_links:
        print(link['href'])
    #输出:
    #https://morvanzhou.github.io/
    #https://morvanzhou.github.io/tutorials/data-#manipulation/scraping/
    #https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/
    #https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/
    #https://morvanzhou.github.io/tutorials/data-manipulation/scraping/
    

    IV. 练习:用BeautifulSoup爬取百度百科

    from bs4 import BeautifulSoup
    from urllib.request import urlopen
    import re
    import random
    base_url = "https://baike.baidu.com"
    his = ["/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711"]
    for i in range(20):
        url = base_url + his[-1]
        html = urlopen(url).read().decode('utf-8')
        soup = BeautifulSoup(html, features='lxml')
        print(i, soup.find('h1').get_text(), ' url: https://baike.baidu.com'+his[-1])
    #     print(' url', his[-1])
        sub_urls = soup.find_all("a", {"target":"_blank", "href":re.compile("^/item/(%.{2})+$")})
        if len(sub_urls)!=0:
            his.append(random.sample(sub_urls, 1)[0]['href'])
        else:
            his.pop()
    #输出:
    0 网络爬虫  url: [https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711](https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711)
    1 深度优先策略  url: [https://baike.baidu.com/item/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E7%AD%96%E7%95%A5](https://baike.baidu.com/item/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E7%AD%96%E7%95%A5)
    2 网络爬虫  url: [https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB](https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB)
    3 斯坦福大学  url: [https://baike.baidu.com/item/%E6%96%AF%E5%9D%A6%E7%A6%8F](https://baike.baidu.com/item/%E6%96%AF%E5%9D%A6%E7%A6%8F)
    4 欧洲  url: [https://baike.baidu.com/item/%E6%AC%A7%E6%B4%B2](https://baike.baidu.com/item/%E6%AC%A7%E6%B4%B2)
    5 义项  url: [https://baike.baidu.com/item/%E4%B9%89%E9%A1%B9](https://baike.baidu.com/item/%E4%B9%89%E9%A1%B9)
    6 保尔·柯察金  url: [https://baike.baidu.com/item/%E4%BF%9D%E5%B0%94%C2%B7%E6%9F%AF%E5%AF%9F%E9%87%91](https://baike.baidu.com/item/%E4%BF%9D%E5%B0%94%C2%B7%E6%9F%AF%E5%AF%9F%E9%87%91)
    7 神父  url: [https://baike.baidu.com/item/%E7%A5%9E%E7%88%B6](https://baike.baidu.com/item/%E7%A5%9E%E7%88%B6)
    8 北京大学  url: [https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6](https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6)
    9 基础学科拔尖学生培养试验计划  url: [https://baike.baidu.com/item/%E5%9F%BA%E7%A1%80%E5%AD%A6%E7%A7%91%E6%8B%94%E5%B0%96%E5%AD%A6%E7%94%9F%E5%9F%B9%E5%85%BB%E8%AF%95%E9%AA%8C%E8%AE%A1%E5%88%92](https://baike.baidu.com/item/%E5%9F%BA%E7%A1%80%E5%AD%A6%E7%A7%91%E6%8B%94%E5%B0%96%E5%AD%A6%E7%94%9F%E5%9F%B9%E5%85%BB%E8%AF%95%E9%AA%8C%E8%AE%A1%E5%88%92)
    10 中华人民共和国教育部  url: [https://baike.baidu.com/item/%E6%95%99%E8%82%B2%E9%83%A8](https://baike.baidu.com/item/%E6%95%99%E8%82%B2%E9%83%A8)
    11 厦门大学  url: [https://baike.baidu.com/item/%E5%8E%A6%E9%97%A8%E5%A4%A7%E5%AD%A6](https://baike.baidu.com/item/%E5%8E%A6%E9%97%A8%E5%A4%A7%E5%AD%A6)
    12 吴宣恭  url: [https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD](https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD)
    13 经济学动态  url: [https://baike.baidu.com/item/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8A%A8%E6%80%81](https://baike.baidu.com/item/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8A%A8%E6%80%81)
    14 吴宣恭  url: [https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD](https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD)
    15 经济学动态  url: [https://baike.baidu.com/item/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8A%A8%E6%80%81](https://baike.baidu.com/item/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8A%A8%E6%80%81)
    16 吴宣恭  url: [https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD](https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD)
    17 五个一工程  url: [https://baike.baidu.com/item/%E4%BA%94%E4%B8%AA%E4%B8%80%E5%B7%A5%E7%A8%8B](https://baike.baidu.com/item/%E4%BA%94%E4%B8%AA%E4%B8%80%E5%B7%A5%E7%A8%8B)
    18 河北省委宣传部  url: [https://baike.baidu.com/item/%E6%B2%B3%E5%8C%97%E7%9C%81%E5%A7%94%E5%AE%A3%E4%BC%A0%E9%83%A8](https://baike.baidu.com/item/%E6%B2%B3%E5%8C%97%E7%9C%81%E5%A7%94%E5%AE%A3%E4%BC%A0%E9%83%A8)
    19 五个一工程  url: [https://baike.baidu.com/item/%E4%BA%94%E4%B8%AA%E4%B8%80%E5%B7%A5%E7%A8%8B](https://baike.baidu.com/item/%E4%BA%94%E4%B8%AA%E4%B8%80%E5%B7%A5%E7%A8%8B)
    

    相关文章

      网友评论

        本文标题:Python爬虫学习笔记 1

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