本帖最后由 牵手丶若相惜 于 2020-11-12 17:05 编辑
中国天气网的robots协议 允许所有爬虫爬取数据
______________________
爬取中国气象网的每个地区七天的天气
但是我只爬取了每个城市的最低温度 没去爬取最高温度
最高温度留给你们 学习爬虫的可以试着添加一下
刚学习爬虫的可以参考一下 还可以优化
源码如下:
[Python] 纯文本查看 复制代码
import requests
from bs4 import BeautifulSoup
# 浏览器代{过}{滤}理
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"
}
# 获取该url地址下的源码
def get_url(url):
data = requests.get(url, headers=headers).content.decode("utf-8")
# 使用html5lib 容错率较高
soup = BeautifulSoup(data, "html5lib")
return soup
# 通过网页源码匹配该地区的七天天气的html源码
def gain_data(soup):
hanmls = soup.find("div", class_="hanml")
# 匹配到存放所有天数温度的div标签下的数据
conmidtabs = hanmls.find_all("div", class_="conMidtab")
return conmidtabs
# 通过网页源码匹配是哪七天
def gain_day():
url = "http://www.weather.com.cn/textFC/hb.shtml"
soup = get_url(url)
day = []
days = list(soup.find("ul", class_="day_tabs").stripped_strings)
for Current in days:
day.append(Current)
return day
# 获取每天的数据
def gain_table(conmidtab):
tabs = conmidtab.find_all("table")
# 用来存放遍历的数据
y = {}
# 遍历当天该地区的所有城市
for tab in tabs:
# 因为前两个是表头 所以从第三个获取每个省的城市的名字和温度
trs = tab.find_all("tr")[2:]
for tr in trs:
# 提取城市name
citys = list(tr.find("td", width="83").stripped_strings)[0]
# 提取城市min_tmparetrue
tmps = list(tr.find("td", width="86").stripped_strings)[0]
# 把城市名作为key,温度作为value
y[citys] = int(tmps)
# 把字典y中的数据存放到该数组中
return y
# 把数据到本地
def write_file(regions, lis1_index):
lis1 = ["华北", "东北", "华东", "华中", "华南", "西北", "西南", "港澳台"]
with open("d:/中国天气1.txt", "a", encoding="utf-8") as fp:
# 把日期写到最前面
fp.write(("地区:" + lis1[lis1_index] + "\n"))
# 遍历regions,keys为当前日期,values是当前地区的所有市的名字和最低气温
for keys, values in regions.items():
fp.write((keys + "\n"))
# 遍历values,key为城市名称,value为该城市的最低温度
for key, value in values.items():
fp.write((key + ":" + str(value) + "\t"))
fp.write("\n\n")
if __name__ == '__main__':
# 用来存放该地区七天的温度
current_temperature = []
partitions = ["hb", "db", "hd", "hz", "hn", "xb", "xn", "gat"]
prefix = "http://www.weather.com.cn/textFC/"
# 获取七天的日期 days是个列表
days = gain_day()
# 用来存放该地区每天的温度
regions = {}
# 用来作为write_file函数里的lis1的下标
lis1_index = 0
# 遍历 所有的地区 华北,华东等等
for partition in partitions:
url = prefix + partition + ".shtml"
# 调用get_url获取源码
soup = get_url(url)
# 调用gain_data 获取到七天天气的源码
conmidtabs = gain_data(soup)
# 作为days数组的下标
day_index = 0
# 把七天的数据依次传递 获取每天的数据
for conmidtab in conmidtabs:
data = gain_table(conmidtab)
# 日期为key 当前地区的所有城市和最低温度为value
regions[days[day_index]] = data
day_index += 1
# 调用写入的函数把 regions 里的数据写到本地
write_file(regions, lis1_index)
# 每更换一个地区下标加1
lis1_index += 1 |