www.cnblogs.com/ruiyqinrui

开源、架构、Linux C/C++/python AI BI 运维开发自动化运维。 春风桃李花 秋雨梧桐叶。“力尽不知热 但惜夏日长”。夏不惜,秋不获。@ruiY--秦瑞

python爬虫,C编程,嵌入式开发.hadoop大数据,桉树,onenebula云计算架构.linux运维及驱动开发.

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

爬虫这个听起来很 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
posted on 2018-04-01 10:14  秦瑞It行程实录  阅读(328)  评论(0编辑  收藏  举报
www.cnblogs.com/ruiyqinrui