Python3.x 爬虫 爬取中国天气网数据

爬虫这个听起来很 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)

header 的作用: requests模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的服务器获取界面,而浏览器在发送请求的时候会携带一些基本的信息作为 header 传递给服务器.服务器会根据 header 里的信息来判断如何返回数据,或者返回什么类型的数据,例如返回的数据是否可以压缩,是否返回移动端展示的界面.因此为了避免不必要的错误,在发送GET请求时,最好带上header.至于header的内容,可以通过浏览器调试,或者fiddler获取.

这时我们获得了想要的数据,可以用 print(req.text)查看

2. 解析数据

我们用 bs4 模块来解析获得的数据
当我们利用 print(req.text) 打印数据后,会发现整整有1000多行.其实这些数据就是在浏览器中查看网页源码的数据.为了方便的找

### 编写Python爬虫获取中国各地天气信息 为了实现这一目标,可以采用`requests`库来发起HTTP请求并接收服务器返回的数据。对于页内容的解析,则推荐使用`BeautifulSoup`或`lxml`这样的HTML/XML解析器。 #### 安装必要的依赖包 在开始之前,确保安装了所需的第三方模块: ```bash pip install requests beautifulsoup4 lxml pyecharts ``` #### 导入所需库 首先,在脚本顶部导入所有必需的库[^1]。 ```python import requests from bs4 import BeautifulSoup import json ``` #### 设置headers模拟浏览器访问 为了避免被站识别为自动化工具而阻止访问,设置合适的User-Agent是非常重要的[^2]。 ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } ``` #### 获取城市列表及其对应的URL地址 通常情况下,气象预报页面会按照不同的地区提供服务链接。因此,先要找到这些地区的入口址,并从中提取出各个城市的名称以及它们各自的查询路径。 ```python url_cities = "http://www.weather.com.cn/weather1d/" response = requests.get(url=url_cities, headers=headers).content.decode('utf-8') soup = BeautifulSoup(response, features='html.parser') city_dict = {} for city in soup.select('.conMidtab3 tr'): try: name = city.find_all('td')[1].text.strip() link = url_cities + str(city['id'])[:6]+'.shtml' city_dict[name] = {'link': link} except Exception as e: continue ``` #### 解析单个城市的具体天气详情 针对每一个具体的城市链接,再次发出GET请求以获得详细的天气状况描述。这里假设每个城市的天气API接口都遵循相同的结构化JSON格式输出。 ```python def get_weather_info(city_link): response = requests.get(url=city_link, headers=headers) data = json.loads(response.text) weather_data = [] for day in data["data"]["forecast"]: date = day["date"] high_temperature = day["high"] low_temperature = day["low"] condition = day["type"] info = f"{date}: {condition}, 高温:{high_temperature}°C, 低温:{low_temperature}°C" weather_data.append(info) return "\n".join(weather_data) ``` 请注意上述代码片段仅为示意性质,实际操作时可能需要根据目标站点的实际布局调整CSS选择器或其他参数配置。此外,考虑到环境的变化和服务端逻辑更新等因素的影响,建议定期维护和完善此段代码以便长期稳定运行。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值