使用python爬取全国天气数据并导入MySQL数据库表
文章目录
-
- 解析网页内容
-
- 完成网页解析后,进入编码阶段:
-
- 实施MySQL建表流程
-
- 进行数据导入操作
-
- 制定完整的编码方案:
-
- 遇到的技术挑战
1、分析网页
首先启动对要获取的网页进行调查(此处为国家气象局中国天气网提供的信息): 这属于华北地区气象预报的内容。

网址为:http://www.weather.com.cn/textFC/hb.shtml
切换到东北地区后:

可以看出 url 只是 textFC/ 后面的部分发生了变化 hb 代表华北 db 则象征着东北 因此我们可以创建一个 url 列表 通过遍历此列表 即可轻松获取各个地区的天气预报网站链接 因为港澳台网页的结构相对复杂 在此不做详细处理

为获取所需天气信息而定义get_temperature函数,并通过该函数调用获取所需数据;随后设置headers字段以携带必要的请求头信息,并发起请求.get()操作;接着通过BeautifulSoup库解析网页内容以提取所需信息。

使用浏览器右键点击目标元素进行定位并查看其所在位置;通过分析网页架构,能够发现或识别包含所有城市及其对应的城市天气信息。
在label中分别包含两个城市信息label(即分别为city1 label和city2 label)。而每个conMidtab2 label中的内容则为该地区各个省的预测结果(即为weather prediction detail)。

该省各城市当天的天气数据位于conMidTab2标签下的表格结构中,在tbody节点下的tr元素内部各个td单元格中进行存储。其中包含该省及其直辖市当天天气数据的真实记录从第3个tr元素开始。每个记录对应的城市及其所属省份(直辖市)的信息都包含在其对应的td单元格中。

2、分析完毕,开始编写代码:


3、使用MySQL创建数据库跟表


4、导入数据
打开数据库连接,并使用cursor()建立一个游标对象:

利用 cursor.execute() 函数将数据导入新建的表中:

最后,使用commit( ) 将所写的数据提交入数据库即可

然后再使用命令select * from 表名;查看数据是否导入成功。

5、完整代码:
#导入模块
from bs4 import BeautifulSoup
import requests
import pymysql
#打开数据库连接,并使用cursor()建立一个游标对象
conn=pymysql.connect(host='localhost',user='root',passwd='niechaogang',db='ncg',port=3306,charset='utf8')
cursor=conn.cursor()
#创建request对象,指定url和请求头(user-agent),目的是为了更真实的模拟浏览器
def get_temperature(url):
urls=['http://www.weather.com.cn/textFC/hb.shtml',
'http://www.weather.com.cn/textFC/db.shtml',
'http://www.weather.com.cn/textFC/hd.shtml',
'http://www.weather.com.cn/textFC/hz.shtml',
'http://www.weather.com.cn/textFC/hn.shtml',
'http://www.weather.com.cn/textFC/xb.shtml',
'http://www.weather.com.cn/textFC/xn.shtml']
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
} # 设置头文件信息
response = requests.get(url, headers=headers).content # 提交requests.get请求,传递url和headers
soup = BeautifulSoup(response, "lxml") # 用Beautifulsoup 进行解析
conmid = soup.find('div', class_='conMidtab')
conmid2 = conmid.findAll('div', class_='conMidtab2')
for info in conmid2:
tr_list = info.find_all('tr')[2:] # 使用切片取到第三个tr标签
for index, tr in enumerate(tr_list): # enumerate可以返回元素的位置及内容
td_list = tr.find_all('td')
if index == 0:
province_name = td_list[0].text.replace('\n', '') # 取每个标签的text信息,并使用replace()函数将换行符删除
city_name = td_list[1].text.replace('\n', '')
weather = td_list[5].text.replace('\n', '')
wind = td_list[6].text.replace('\n', '')
max = td_list[4].text.replace('\n', '')
min = td_list[7].text.replace('\n', '')
print(province_name)
else:
city_name = td_list[0].text.replace('\n', '')
weather = td_list[4].text.replace('\n', '')
wind = td_list[5].text.replace('\n', '')
max = td_list[3].text.replace('\n', '')
min = td_list[6].text.replace('\n', '')
print(city_name, weather, wind, max, min)
sql = "INSERT INTO tqyb(city, weather, wind, max, min) VALUES ('%s', '%s', '%s', %s, %s)" % (city_name, weather, wind, max, min)
cursor.execute(sql)
if __name__=='__main__':
for url in urls:
get_temperature(url)
conn.commit()
6、遇到的问题
在导入数据时出现错误,在导入数据时出现错误的情况下,请按照以下步骤操作:
1)、确认数据库连接是否正常以及SQL插入语句是否存在语法错误
2)、查看日志文件中是否有相关的错误信息
3)、检查是否有权限问题以及表结构是否正确
4)、尝试使用不同的数据库驱动版本或者修改数据库配置参数
5)、如果以上方法无效,请查阅相关技术文档或者联系技术支持获取进一步帮助
参考文章:[参考文章:https://www.runoob.com/python/python-mysql.html]

检查数据库的编码格式时,请确保它与导入数据所使用的编码格式一致。

3)、删除数据库表中的数据:
第一种:delete from tablename where 1=1;
第二种:truncate table tablename;
第二种方法对于清理数据库表数据更加迅速,并且清理速度极快能够很快地释放数据库表空间;此外无需记录删除操作,并且自增字段仍依照其创建时设定的初始值进行初始化
请注意以下操作:使用DROPTABLE语句来删除指定的表时,请确保其包含的内容完整无误地被消去(包括该表中存储的所有数据、该表本身的结构信息以及所涉及的数据库空间资源)。
