python 爬虫系列04 实战 中国天气网
2017-09-08 17:10
579 查看
本系列所有文章基于 python3.5.2
今天利用 系列02 和 系列03的知识完成一个小例子:
爬取中国天气网最近七天数据:
做爬虫需要几步呢? 概况来说需要两步:
第一步是从网络上获取数据(大部分是html)
第二步就是解析数据
header 的作用: requests模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的服务器获取界面,而浏览器在发送请求的时候会携带一些基本的信息作为 header 传递给服务器.服务器会根据 header 里的信息来判断如何返回数据,或者返回什么类型的数据,例如返回的数据是否可以压缩,是否返回移动端展示的界面.因此为了避免不必要的错误,在发送GET请求时,最好带上header.至于header的内容,可以通过浏览器调试,或者fiddler获取.
这时我们获得了想要的数据,可以用
当我们利用
2 数据解析前要自己查看网页源码,之后有一个大概的获取范围和思路
3 数据解析方法对应特定的数据格式,不通用.
4 有效代码只有30行,python 语音果真 是“优雅”.“明确”.“简单”
今天利用 系列02 和 系列03的知识完成一个小例子:
爬取中国天气网最近七天数据:
做爬虫需要几步呢? 概况来说需要两步:
第一步是从网络上获取数据(大部分是html)
第二步就是解析数据
1 从网站获取数据
这里我使用 requests 模块来代替内建模块 urllibimport 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)
header 的作用: requests模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的服务器获取界面,而浏览器在发送请求的时候会携带一些基本的信息作为 header 传递给服务器.服务器会根据 header 里的信息来判断如何返回数据,或者返回什么类型的数据,例如返回的数据是否可以压缩,是否返回移动端展示的界面.因此为了避免不必要的错误,在发送GET请求时,最好带上header.至于header的内容,可以通过浏览器调试,或者fiddler获取.
这时我们获得了想要的数据,可以用
print(req.text)查看
2 解析数据
我们用 bs4 的 BeautifulSoup 模块来解析获得的数据当我们利用
print(req.text)打印数据后,会发现整整有1000多行.其实这些数据就是在浏览器中查看网页源码的数据.为了方便的找到对我们有用的数据,我们需要 bs4 的 BeautifulSoup 类来完成.
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("_______________ 分割线 ____________________")
# 结果: 4日(今天) 晴间多云转晴转多云 33℃ 20℃ 微风 _______________ 分割线 ____________________ 25日(明天) 多云转晴 32℃ 19℃ 微风 _______________ 分割线 ____________________ 26日(后天) 多云转阵雨 29℃ 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>
3 总结
1 此网站获取数据还是很方便的,甚至可以不传header.2 数据解析前要自己查看网页源码,之后有一个大概的获取范围和思路
3 数据解析方法对应特定的数据格式,不通用.
4 有效代码只有30行,python 语音果真 是“优雅”.“明确”.“简单”
相关文章推荐
- 04精通Python网络爬虫——代理服务器的设置&DebuLog实战&URLError实战
- Python爬虫入门实战系列(一)--爬取网络小说并存放至txt文件
- python初级实战系列教程《一、爬虫之爬取网页、图片、音视频》
- python初级实战系列教程《二、爬虫之爬取网页小说》
- Python爬虫系列(二)Quotes to Scrape(谚语网站的爬取实战)
- 数据科学工程师面试宝典系列之一--Python爬虫实战
- 数据科学工程师面试宝典系列之一--Python爬虫实战
- python初级实战系列教程《三、爬虫之应对网页反爬虫》
- Python爬虫实战之爬取链家广州房价_04链家的模拟登录(记录)
- python爬虫实战(三)--------搜狗微信文章(IP代理池和用户代理池设定----scrapy)
- Python爬虫框架Scrapy实战之定向批量获取职位招聘信息
- Python 爬虫 —— 糗事百科爬虫实战
- python 爬虫实战(一)爬取豆瓣图书top250
- python爬虫"Hello World"级入门实例(二),使用json从中国天气网抓取数据
- python3 [爬虫入门实战]scrapy爬取盘多多五百万数据并存mongoDB
- Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息
- Python爬虫实战01:Requests+正则表达式爬取猫眼电影
- Python爬虫实战--(二)解析网页中的元素
- 聚沙成塔--爬虫系列(二)(python3基础语法)
- Python爬虫学习系列教程