python爬取哈尔滨天气信息


Posted in Python onJuly 14, 2018

本文实例为大家分享了python爬取哈尔滨天气信息的具体代码,供大家参考,具体内容如下

环境:

windows7

python3.4(pip install requests;pip install BeautifulSoup4)

代码: (亲测可以正确执行)

# coding:utf-8
"""
总结一下,从网页上抓取内容大致分3步:
1、模拟浏览器访问,获取html源代码
2、通过正则匹配,获取指定标签中的内容
3、将获取到的内容写到文件中
"""
import requests # 用来抓取网页的html源代码
import csv # 将数据写入到csv文件中
import random # 取随机数
import time # 时间相关操作
import socket # 用于异常处理
import http.client # 用于异常处理
from bs4 import BeautifulSoup # 用来代替正则式取源码中相应标签中的内容


# 获取网页中的html代码
def get_content(url, data=None):
  header = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
  }
  timeout = random.choice(range(80, 180)) # timeout是设定的一个超时时间,取随机数是因为防止被网站认定为网络爬虫
  while True:
    try:
      rep = requests.get(url, headers=header, timeout=timeout)
      rep.encoding = 'utf-8' # rep.encoding = ‘utf-8'是将源代码的编码格式改为utf-8
      break
    except socket.timeout as e:
      print('3:', e)
      time.sleep(random.choice(range(8, 15)))

    except socket.error as e:
      print('4:', e)
      time.sleep(random.choice(range(20, 60)))

    except http.client.BadStatusLine as e:
      print('5:', e)
      time.sleep(random.choice(range(30, 80)))

    except http.client.IncompleteRead as e:
      print('6:', e)
      time.sleep(random.choice(range(5, 15)))

  return rep.text


# 获取html中我们所需要的字段
def get_data(html_text):
  final = []
  bs = BeautifulSoup(html_text, "html.parser") # 创建BeautifulSoup对象
  body = bs.body # 获取body部分
  data = body.find('div', {'id': '7d'}) # 找到id为7d的div
  ul = data.find('ul') # 获取ul部分
  li = ul.find_all('li') # 获取所有的li

  for day in li: # 对每个li标签中的内容进行遍历
    temp = []
    date = day.find('h1').string # 找到日期
    temp.append(date) # 添加到temp中
    inf = day.find_all('p') # 找到li中的所有p标签
    temp.append(inf[0].string, ) # 第一个p标签中的内容(天气状况)加到temp中
    if inf[1].find('span') is None:
      temperature_highest = None # 天气预报可能没有当天的最高气温(到了傍晚,就是这样),需要加个判断语句,来输出最低气温
    else:
      temperature_highest = inf[1].find('span').string # 找到最高温
      temperature_highest = temperature_highest.replace('℃', '') # 到了晚上网站会变,最高温度后面也有个℃
    temperature_lowest = inf[1].find('i').string # 找到最低温
    temperature_lowest = temperature_lowest.replace('℃', '') # 最低温度后面有个℃,去掉这个符号
    temp.append(temperature_highest) # 将最高温添加到temp中
    temp.append(temperature_lowest) # 将最低温添加到temp中
    final.append(temp) # 将temp加到final中

  return final


# 写入文件csv
def write_data(data, name):
  file_name = name
  with open(file_name, 'a', errors='ignore', newline='') as f:
    f_csv = csv.writer(f)
    f_csv.writerows(data)


if __name__ == '__main__':
  url = 'http://www.weather.com.cn/weather/101050101.shtml'
  html = get_content(url)
  result = get_data(html)
  write_data(result, 'weather.csv')

讲解:

python标准库-----内置函数open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None...)

函数作用:打开一个文件并返回文件对象。如果文件不能打开,抛出异常OSError。

file:是一个字符串的文件名称,或者是一个数组表示的文件名称。文件名称可以是相对当前目录的路径,也可以是绝对路径表示。

mode:是指打开文件的模式。

  1)‘r'表示打开文件只读,不能写。

  2)‘w'表示打开文件只写,并且清空文件。

  3)‘x'表示独占打开文件,如果文件已经存打开就会失败。

  4)‘a'表示打开文件写,不清空文件,在文件后尾追加的方式写入。

  5)‘b'表示二进制的模式打开文件。

  6)‘t'表示文本模式,默认情况下就是这种模式。

  7)‘+'打开文件更新(读取或写入)。

  8)缺省时的模式就相当于'rt'。比如'w+b'就是打开文件进入读写,把文件清空;'r+b'打开文件,但不把文件  清空。

参数buffering是一个可选的参数,用来表示缓冲区的策略选择。设置为0时,表示不使用缓冲区,直接读写,仅在二进制模式下有效。设置为1时,表示在文本模式下使用行缓冲区方式。设置为大于1时,表示缓冲区的设置大小。如果参数buffering没有给出,使用默认时,会采用下面策略来选择:

1)对于二进制文件模式时,采用固定块内存缓冲区方式,内存块的大小根据系统设备的分配的磁盘块来决定,如果获取系统磁盘块的大小失败,就使用内部常量io.DEFAULT_BUFFER_SIZE定义的大小。一般的操作系统上,块的大小是4096或者8192字节大小。

2)对于交互的文本文件(采用isatty()判断为True)时,采用一行缓冲区的方式。其它文本文件使用跟二进制一样的方式。

参数encoding是指明对文件编码,仅适用于文本文件。如果不明编码方式,默认是使用locale.getpreferredencoding()函数返回的编码方式。

参数errors是用来指明编码和解码错误时怎么样处理。不能在二进制的模式下使用。

1)当指明为'strict'时,编码出错则抛出异常ValueError。

2)当指明为'ignore'时,忽略错误。

3)当指明为'replace'时,使用某字符进行替代模式,比如使用'?'来替换出错的。

4)其它相应还有surrogateescape/xmlcharrefreplacs/backslashreplace。

参数newline是用来控制文本模式之下,一行的结束字符。可以是None,'',\n,\r,\r\n等。

1)当在读取模式下,如果新行符为None,那么就作为通用换行符模式工作,意思就是说当遇到\n,\r或\r\n都可以作为换行标识,并且统一转换为\n作为文本输入的换行符。当设置为空''时,也是通用换行符模式工作,但不作转换为\n,输入什么样的,就保持原样全输入。当设置为其它相应字符时,就会判断到相应的字符作为换行符,并保持原样输入到文本。

2)当在输出模式时,如果新行符为None,那么所有输出文本都是采用\n作为换行符。如果设置为''或者\n时,不作任何的替换动作。如果是其它字符,会在字符后面添加\n作为换行符。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
python中引用与复制用法实例分析
Jun 04 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
python3大文件解压和基本操作
Dec 15 Python
详解tensorflow载入数据的三种方式
Apr 24 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
python数据类型之间怎么转换技巧分享
Aug 20 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 Python
Django展示可视化图表的多种方式
Apr 08 Python
Python for循环中的陷阱详解
Jul 13 #Python
Python框架Flask的基本数据库操作方法分析
Jul 13 #Python
Python使用pickle模块实现序列化功能示例
Jul 13 #Python
mac下如何将python2.7改为python3
Jul 13 #Python
Python面向对象程序设计之继承与多继承用法分析
Jul 13 #Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 #Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 #Python
You might like
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
simplehtmldom Doc api帮助文档
2012/03/26 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
php制作简单模版引擎
2016/04/07 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
[05:06]2017亚洲邀请赛DAC回顾片
2017/04/19 DOTA
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
Python threading多线程编程实例
2014/09/18 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
python实现学生管理系统
2018/01/11 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
python 接收处理外带的参数方法
2018/12/03 Python
python字典改变value值方法总结
2019/06/21 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
Python对wav文件的重采样实例
2020/02/25 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
客服专员岗位职责范本
2013/11/29 职场文书
高中毕业自我鉴定
2013/12/22 职场文书
主持词开场白
2014/03/17 职场文书
婚假请假条怎么写
2014/04/10 职场文书
毕业赠语大全
2015/06/23 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis