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中executemany和序列的使用方法
Aug 12 Python
python实现感知器
Dec 19 Python
利用Anaconda简单安装scrapy框架的方法
Jun 13 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
Apr 26 Python
python爬虫租房信息在地图上显示的方法
May 13 Python
PyQt5固定窗口大小的方法
Jun 18 Python
python被修饰的函数消失问题解决(基于wraps函数)
Nov 04 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
python字符串,元组,列表,字典互转代码实例详解
Feb 14 Python
500行python代码实现飞机大战
Apr 24 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
PHP array 的加法操作代码
2010/07/24 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
利用python求积分的实例
2019/07/03 Python
Python实现微信表情包炸群功能
2021/01/28 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
留学自荐信
2013/10/10 职场文书
中学生在校期间的自我评价分享
2013/11/13 职场文书
销售经理工作职责范文
2013/12/03 职场文书
关于工资低的辞职信
2014/01/14 职场文书
幼儿教师考核制度
2014/01/25 职场文书
志愿者服务感言
2014/02/27 职场文书
学习十八大报告感言
2014/02/28 职场文书
大学班级计划书
2014/04/29 职场文书
学习张林森心得体会
2014/09/10 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
电气工程师岗位职责
2015/02/12 职场文书