【python爬虫】爬取全国天气数据并存入数据库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、导包
  • 二、代码
    • 1.连接数据库
    • 2.爬虫
  • 总结
    • 最后


前言

爬取的网站:http://www.weather.com.cn/textFC
采用BeautifulSoup库爬取数据和pymysql导入数据库

一、导包

import requests
from bs4 import BeautifulSoup
import pymysql

二、代码

1.连接数据库

代码如下(示例):

conn = pymysql.connect(host='localhost', user='root', passwd='密码', db='weather', port=3306, charset='utf8')
cursor = conn.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS tianqi")
# 使用预处理语句创建表
cursor.execute("CREATE TABLE tianqi "
               "(city varchar(20) not null , weather varchar(20), wind varchar(20), wind_power varchar(20), max varchar(10), min varchar(10))")
conn.commit()

2.爬虫

代码如下(示例):

# 定义一个函数解析网页
def parse_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',
    }

    response = requests.get(url, headers=headers)

    # print(response.content.decode('utf-8'))  # 解决乱码,打印网页源码
    text = response.content.decode('utf-8')
    # 网页解析
    soup = BeautifulSoup(text, 'html5lib')

    ## 1. 找网页元素conMidtab
    conMidtab = soup.find('div', class_='conMidtab')
    # print(conMidtab)

    ## 2.找table标签, find_all返回一个列表
    tables = conMidtab.find_all('table')

    # 遍历table标签,找出需要的标签,以网页源码为准
    for table in tables:
    ## 3. 找tr标签,过滤掉前两个tr标签
        trs = table.find_all('tr')[2:]

        #  enumerate()会返回2个值:1)索引;2)索引对应元素。
        for index, tr in enumerate(trs):
    ## 4. 找td标签,
            tds = tr.find_all('td')
            city_td = tds[0]  # 城市
            if index == 0:
                city_td = tds[1]
            # stripped_strings:获取一个标签下面子孙节点的文本信息,返回的是生成器对象,要转化为list
            city = list(city_td.stripped_strings)[0]  # 只要文本
            # print(city)

            weather_td = tds[1]  # 天气现象
            if index == 0:
                weather_td = tds[2]
            weather = list(weather_td.stripped_strings)[0]
            # 风向
            wind_td = tds[2].find_all('span')
            if index == 0:
                wind_td = tds[3].find_all('span')
            wind_span = wind_td[0]
            wind = list(wind_span.stripped_strings)[0]
            # 风力
            wind_power_sp = wind_td[1]
            wind_power = list(wind_power_sp.stripped_strings)[0]
            # print(wind, wind_power)

            temp_max_td = tds[-5]
            temp_max = list(temp_max_td.stripped_strings)[0]
            # print(temp_max)

            temp_min_td = tds[-2]  # 最低温度
            temp_min = list(temp_min_td.stripped_strings)[0]
            # print(temp_min)

            print(city, weather, temp_max + '℃', temp_min + '℃', wind, wind_power)
            cursor.execute('insert into tianqi(city,weather,wind,wind_power,max,min) values(%s,%s,%s,%s,%s,%s)',
                   (city, weather, wind, wind_power, temp_max, temp_min))
            conn.commit()

main函数传入url,并关闭数据库连接与游标

def main():

    # lst = []
    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/xn.shtml',  # 西南
    'http://www.weather.com.cn/textFC/xb.shtml',  # 西北
    'http://www.weather.com.cn/textFC/gat.shtml']  # 港澳台地区

    for url in urls:
    # 调用函数
        parse_page(url)

    cursor.close()
    conn.close()
    
if __name__ == '__main__':
    main()

总结

注意观察原网站的源代码,此次爬虫遇到港澳台页面与其他的html代码有些不同,需要特殊处理。在td标签中获取城市名称时,每个省或直辖市的table里的tr标签里的第一个td标签都不是城市名,而是省份或者直辖市的名称,采用enumerate()方法返回index,从而解决该问题。

最后

文章内容有些还自己改的,有些是参考了其他大佬的代码,写的还是有些冗余,不精简,望各位大佬批评指正。

你可能感兴趣的:(python,mysql,爬虫)