zoukankan      html  css  js  c++  java
  • python beautifulsoup爬虫

    爬虫这个听起来很 hack 的名字,是我学习 python 的诱因.当 python 基础学习到一定程度(基本语法,数据类型掌握) 就可以开启自己的小爬虫了.毕竟实践才是提高的最快途径.废话说完了,下面直接开始: 
    廖凯峰的 python 基础教程

    做爬虫需要几步呢? 概况来说需要两步: 
    第一步是从网络上获取数据(大部分是html) 
    第二步就是解析数据

    1. 从网站获取数据

    这里我使用 requests 模块来代替内建模块 urllib

    import requests
    import random
    url = 'http://www.weather.com.cn/weather/101010100.shtml' # 数据地址,从浏览器copy
    header = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3226.400 QQBrowser/9.6.11681.400'
    }
    timeout = random.choice(range(80, 180)) # 超时时间
    req = requests.get(url, headers=header, timeout=timeout) 
    req.encoding = 'utf-8' # 防止中文乱码
    code = req.status_code # 返回状态,200代表OK
    print(code)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    header 的作用: requests模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的服务器获取界面,而浏览器在发送请求的时候会携带一些基本的信息作为 header 传递给服务器.服务器会根据 header 里的信息来判断如何返回数据,或者返回什么类型的数据,例如返回的数据是否可以压缩,是否返回移动端展示的界面.因此为了避免不必要的错误,在发送GET请求时,最好带上header.至于header的内容,可以通过浏览器调试,或者fiddler获取.

    这时我们获得了想要的数据,可以用 print(req.text)查看

    2. 解析数据

    我们用 bs4 模块来解析获得的数据 
    当我们利用 print(req.text) 打印数据后,会发现整整有1000多行.其实这些数据就是在浏览器中查看网页源码的数据.为了方便的找到对我们有用的数据,我们需要 bs4 的 BeautifulSoup 类来完成. 
    Beautiful Soup 中文文档

    from bs4 import BeautifulSoup
    soup = BeautifulSoup(req.text, 'html.parser')
    
    # 分析得 <ul class="t clearfix"> 标签下记录了我们想要的数据,因此只需要解析这个标签即可
    ul_tag = soup.find('ul', 't clearfix')  # 利用 css 查找
    print(ul_tag) # 取出七天数据
    
    
    # 打印每一天数据
    li_tag = ul_tag.findAll('li') 
    for tag in li_tag:
        print(tag.find('h1').string)  # 时间
        print(tag.find('p', 'wea').string)  # wea
        # 温度的tag格式不统一,做容错
       try:
            print(tag.find('p', 'tem').find('span').string)  # 高温
            print(tag.find('p', 'tem').find('i').string)  # 低温
        except:
            print('没有高温或低温数据')
            pass
        print(tag.find('p', 'win').find('i').string)  # win
        print("_______________ 分割线 ____________________")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    # 结果:
    4日(今天)
    晴间多云转晴转多云
    33℃
    20℃
    微风
    _______________ 分割线 ____________________
    25日(明天)
    多云转晴
    32℃
    19℃
    微风
    _______________ 分割线 ____________________
    26日(后天)
    多云转阵雨
    29℃
    18℃
    微风
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    # 部分网页源码
    <ul class="t clearfix">
    <li class="sky skyid lv2 on">
    <h1>24日(今天)</h1>
    <big class="png40 d00"></big>
    <big class="png40 n01"></big>
    <p class="wea" title="晴间多云转晴转多云">晴间多云转晴转多云</p>
    <p class="tem">
    <span>33℃</span>/
    <i>20℃</i>
    </p>
    <p class="win">
    <em>
    <span title="北风" class="N"></span>
    <span title="北风" class="N"></span>
    </em>
    <i>微风</i>
    </p>
    <div class="slid"></div>
    </li>
    <li class="sky skyid lv2">
    <h1>25日(明天)</h1>
    <big class="png40 d01"></big>
    <big class="png40 n00"></big>
    <p class="wea" title="多云转晴转晴">多云转晴</p>
    <p class="tem">
    <span>32℃</span>/
    <i>19℃</i>
    </p>
    <p class="win">
    <em>
    <span title="西风" class="W"></span>
    <span title="北风" class="N"></span>
    </em>
    <i>微风</i>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    3. 总结

    1 此网站获取数据还是很方便的,甚至可以不传header. 
    2 数据解析前要自己查看网页源码,之后有一个大概的获取范围和思路 
    3 数据解析方法对应特定的数据格式,不通用. 
    4 有效代码只有30行,python 语音果真 是“优雅”.“明确”.“简单”

    版权声明:本文为博主原创文章,可以转载。 https://blog.csdn.net/hepann44/article/details/77524782
  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/ruiy/p/8685824.html
Copyright © 2011-2022 走看看