• 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
  • 相关阅读:
    Java项目中加载properties文件的方式
    第十一篇 JVM之运行时数据区<7>: 本地方法栈
    第十七篇 JVM之运行时数据区<13>: 字符串常量池
    第十四篇 JVM之运行时数据区<10>: 对象分配过程
    基于zxing工具生成二维码
    第十八篇 JVM之运行时数据区<14>: 方法区的垃圾收集
    第十六篇 JVM之运行时数据区<12>: 方法区
    第十二篇 JVM之运行时数据区<8>: Java堆
    圣诞
    LeetCode 748 最短补全词
  • 原文地址:https://www.cnblogs.com/ruiy/p/8685824.html
Copyright © 2020-2023  润新知