一、设计任务

目标:用Python设计一个数据抓取程序,达到以下基本要求:

  • 数据抓取任务自拟,如电子商务交易数据、客户评论、新闻、图片等。
  • 获取的数据存储为数据文件,或sqlite数据库。

程序有适当的注释,有完整的说明文件。

二、数据来源

本爬虫程序爬取的数据均来自于中国天气网城市首页的72小时天气预报(日期、天气现象、气温及空气质量)及某时刻实时天气实况,具体网址如下:

http://www.weather.com.cn/weather1d/101280101.shtml#dingzhi_first%EF%BC%89

打开网址,查询:甘肃-酒泉-酒泉,可得如下界面:

我的设想,就是从这个界面中,爬取酒泉72小时天气预报(日期、天气现象、气温及空气质量)及某时刻实时天气实况。

三、爬取工具和环境配置

Python环境安装配置:安装Python所需要的环境,使用python3.9版本.

需要使用到的库:urllib.request、csv以及BeautifulSoup

BeautifulSoup库需要手动安装,BeautifulSoup是一个网页解析库,它支持很多解析器,不过最主流的有两个。一个是python标准库,一个是lxml HTML 解析器。两者的使用方法相似:

from bs4 import BeautifulSoup

# Python的标准库

BeautifulSoup(html, 'html.parser')

# lxml

BeautifulSoup(html, 'lxml')

四、分析过程

1.查看网页源代码

下面我给出了网页源代码的头部,我们需要分析的关键信息是找出想爬取信息对应的代码。

<!DOCTYPE html>

 

<html>

 

<head>

 

<link rel="dns-prefetch" href="http://i.tq121.com.cn">

 

<meta charset="utf-8" />

 

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

 

<title>酒泉天气预报,酒泉7天天气预报,酒泉15天天气预报,酒泉天气查询 - 中国天气网</title>

 

<meta http-equiv="Content-Language" content="zh-cn">

 

<meta name="keywords" content="酒泉天气预报,jqtq,酒泉今日天气,酒泉周末天气,酒泉一周天气预报,酒泉15日天气预报,酒泉40日天气预报" />

 

<meta name="description" content="酒泉天气预报,及时准确发布中央气象台天气信息,便捷查询北京今日天气,酒泉周末天气,酒泉一周天气预报,酒泉15日天气预报,酒泉40日天气预报,酒泉天气预报还提供酒泉各区县的生活指数、健康指数、交通指数、旅游指数,及时发布酒泉气象预警信号、各类气象资讯。" />

 

<!-- 城市对比上线

 

<link type="text/css" rel="stylesheet" href="http://c.i8tq.com/cityListCmp/cityListCmp.css?20191230" />

 

<link type="text/css" rel="stylesheet" href="http://c.i8tq.com/cityListCmp/weathers.css?20191230" /> -->

 

<style>

可以看出此网站的天气有wea、tem、win三个属性,均写在p标签里,没有定义父标签,可单独直接抓取。

2.爬虫的编写

(1)相关包的导入

import csv

import urllib.request

from  bs4 import BeautifulSoup

(2)模拟浏览器得到数据

url = "http://www.weather.com.cn/weather/101270101.shtml"

header = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36")  # 设置头部信息

opener = urllib.request.build_opener()  # 修改头部信息

opener.addheaders = [header]         #修改头部信息

request = urllib.request.Request(url)   # 制作请求

response = urllib.request.urlopen(request)   #  得到请求的应答包

html = response.read()   #将应答包里面的内容读取出来

html = html.decode('utf-8')    # 使用utf-8进行编码,不重新编码就会成乱码

(3)查找要爬取的部分

在页面上找到所需要的信息部分,需要日期、天气以及温度。

# 以上部分的代码如下:

final = []   #初始化一个空的list,我们为将最终的的数据保存到list

bs = BeautifulSoup(html,"html.parser")   # 创建BeautifulSoup对象

body = bs.body  # 获取body部分

data = body.find('div',{'id':'7d'})  # 找到id为7d的div

之后再往下看,所需要的信息都存在ul标签中,我们需要查找ul标签

ul = data.find('ul')  # 获取ul部分,由于ul标签只有一个  我们使用find()函数,如果有多个我们使用find_all()

所需要的信息在ul标签里面的li标签内部,而且不止一个,所以我们需要使用find_all()方法

li = ul.find_all('li')  # 获取所有的li     返回的是list对象

(4)对查找到部分进行数据的爬取

我们最后将所有的数据保存在list之中在进行写入文件。

日期在li标签的h1标签之中。

天气在li标签的第一个p标签之中。

温度在第二个p标签之中的span标签之中。

i = 0

for day in li:  # 对每个li标签中的内容进行遍历

if i < 7:

temp = []

date = day.find('h1').string # 找到日期

#         print (date)

temp.append(date)  # 添加到temp中

#     print (temp)

inf = day.find_all('p')  # 找到li中的所有p标签

#     print(inf)

#     print (inf[0])

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.append(temperature_lowest)

final.append(temp)  # 将每一次循环的list的内容都插入最后保存数据的list

i = i +1

(5)写入文件

with open('天气.txt', 'a', errors='ignore', newline='') as f:

f_csv = csv.writer(f)

f_csv.writerows(final)

五、爬取效果展示

1.源代码截图

2.运行效果截图

3.数据文件存储截图

六、完整代码

# !/usr/bin/env python3

# -*- coding: utf-8 -*-

import requests

from bs4 import BeautifulSoup

import time

def getINFO(city='jiuquan'):

url = 'https://m.tianqi.com/{}/'.format(city)

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.64 Safari/537.36'}

r = requests.get(url, headers=headers, timeout=30)

r.raise_for_status()

r.encoding = r.apparent_encoding

html = r.text

soup = BeautifulSoup(html,'html.parser')

# 获取当前位置

getLocation = soup.find('h2').text

print(getLocation)

# 获取更新时间

getUpdatetime = soup.find(id='nowHour').text

getUpdatetime = '更新时间 ' + getUpdatetime

print(getUpdatetime)

# 获取当前温度

getWeather_now = soup.find(class_='now').text

getWeather_now = '现在温度 ' + getWeather_now

print(getWeather_now)

# 获取当天天气

getWeather = soup.find('dd', class_='txt').text

getWeather = '今日天气 ' + getWeather

print(getWeather)

# 获取当天空气质量

getAir = soup.find(class_='b1').text

getAir = '空气质量 ' + getAir

print(getAir)

# 获取当前湿度

getWet = soup.find(class_='b2').text

print(getWet)

# 获取当前风力

getWind = soup.find(class_='b3').text

print(getWind)

print('\n' + '-'*10 + '\n')

# 把多个天气信息组合成一个文本

weather_info = getLocation + '\n' + getUpdatetime + '\n' + getWeather_now + '\n' + getWeather + '\n' + getAir + '\n' + getWet + '\n' + getWind

# print(weather_info)

Temperature = ''

# 获取未来几天的天气

getTemperature = soup.find(class_='weather_week')

# 筛选未来3天天气并对格式做调整,合并为一个文本

for i in getTemperature.find_all('dl')[:3]:

i = i.text

li = i.split('\n')

li[7] = '空气质量 ' + li[7]

li = li[2:8]

li = ' '.join(li)

Temperature = Temperature + li + '\n'

print(Temperature)

result_info = weather_info + '\n' + '-'*40 + '\n' + Temperature

# print(result_info)

return result_info

# 写到本地

def saveFile(text):

with open("./天气.txt", "w", encoding='utf-8') as f:

f.write(text)

if __name__ == "__main__":

while True:

city=input("输入查询城市的拼音(如酒泉输入jiuquan):")

result_info = getINFO(city)

saveFile(result_info)

answer=input("是否继续查询? y/n")

if answer=="y" or answer=="Y":

continue

else:

break

# 循环一小时更新

for second in range(3600,-1,-1):

time.sleep(1)

print('天气更新倒计时:' + "%02d:%02d"%(second // 60,second % 60), end='\r\b')

一个简单的爬虫例子-天气相关推荐

  1. Python网络爬虫 - 一个简单的爬虫例子

    下面我们创建一个真正的爬虫例子 爬取我的博客园个人主页首页的推荐文章列表和地址 scrape_home_articles.py from urllib.request import urlopen f ...

  2. python网页爬虫例子_Python网络爬虫 - 一个简单的爬虫例子

    下面我们创建一个真正的爬虫例子 爬取我的博客园个人主页首页的推荐文章列表和地址 scrape_home_articles.py from urllib.request importurlopenfro ...

  3. python爬虫入门教程(二):开始一个简单的爬虫

    2019/10/28更新 使用Python3,而不再是Python2 转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329 爬 ...

  4. mvc登录实例 mysql_spring mvc + mybatis + mysql 调整的一个简单的登录例子

    spring mvc + mybatis + mysql 整合的一个简单的登录例子 今天用spring跟mybatis整合写了一个简单的登录例子,第一次整合,给自己做个笔记,可能注释写的有点少,做的不 ...

  5. $python爬虫系列(1)——一个简单的爬虫实例

    本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容: 分析html ...

  6. boost::log模块实现一个简单日志的例子

    boost::log模块实现一个简单日志的例子 实现功能 C++实现代码 实现功能 boost::log模块实现一个简单日志的例子 C++实现代码 #include <boost/log/tri ...

  7. 轻松创建nodejs服务器(1):一个简单nodejs服务器例子

    这篇文章主要介绍了一个简单nodejs服务器例子,本文实现了一个简单的hello world例子,并展示如何运行这个服务器,需要的朋友可以参考下 我们先来实现一个简单的例子,hello world. ...

  8. 一个简单的CORBA例子

    因为对CORBA分析的需要,这里写一个简单的CORBA例子.从JDK1.2开始,JDK中集成了ORB的实现,本例子使用了JDK1.7,对于JDK1.2+应该都没有问题.这个例子实现一个简单的加减乘除的 ...

  9. 使用Multiplayer Networking做一个简单的多人游戏例子-1/3(Unity3D开发之二十五)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51006463 ...

  10. 网络爬虫笔记 :一个简单的爬虫框架

    学了两节课的 Python 爬虫,也算是入门了吧.敲了两天的案例代码之后,我突然发现,这些代码虽然功能不同,写法各异,但是终归是有章可循的,整体框架是一致的.所以我自己整理了一个简单的爬虫框架,适合初 ...

最新文章

  1. 【玩转server 2019系列】Windows server 2019打开windows defender提示“需要新应用打开windows defender”的解决方法
  2. R语言--如何退出terminal下的环境
  3. Python之日志处理(logging模块)
  4. 5W+人的公司怎么把总部和分部网络连接起来?
  5. Magento学习手记(第十天)
  6. 【设计模式:单例模式】单例模式02:懒汉模式
  7. SCPPO(八):登录实现逻辑
  8. Java 并发:volatile 关键字解析
  9. 1950 - Computing Machinery and Intelligence(计算机器与智能,又译作:机器能思考么?)
  10. RTP直播分发服务器集群方案
  11. Snapchat三类广告形式及收益提升技巧详解
  12. mac上的kindle打开mobi文件的方式
  13. XUPT 寒假算法集训第一周
  14. 关于前端的CSS命名
  15. excel制作跨职能流程图_如何绘制泳道图(跨职能流程图)
  16. 如何用计算机做字库,如何自己制作字体:手写体中文字体自动生成系统(来自北京大学计算机科学技术研究所)...
  17. 下载USGS的地物光谱数据库的网址
  18. 一个SEO主管在SEO团队会议上的发言
  19. 一步一步教你如何利用虚拟机软件安装ubuntu
  20. 掌上快递 APP 项目之概述篇

热门文章

  1. 倪海厦天纪笔记16_倪海厦-天纪16
  2. 使用RamDiskNT虚拟软盘后vmware无法识别
  3. Linux系统关闭virbr0
  4. php-模板方式模式实现
  5. DSPE;CAS:1069-79-0 ;二硬脂酰基磷脂酰乙醇胺;功能化磷脂
  6. html图片闪动效果,用CSS制造出光泽一闪而过的图片效果
  7. iOS 安装包瘦身(下篇)
  8. CDlinux wifi密码破解(pin码枚举)
  9. VS2008显示当前页面的脚本发生错误的处理方法
  10. Centos 7.2 安装Docker CE实践并配置加速器