Advertisement

使用python获取天气网页上的内容,并存入数据库

阅读量:

使用python获取天气网站中的内容,并存入数据库
例如:获取 http://api.help.bj.cn/api/?id=53 中的城市,lever,quality,pm2.5 中的内容
**

网站是这样的:
在这里插入图片描述
网站源码:
在这里插入图片描述

python代码:

复制代码
    import requests,ast,hashlib,os,mysql.connector,re
    from bs4 import BeautifulSoup
    conn=mysql.connector.connect(user="root",password="自己的数据库密码",host="localhost")  #连接到本地数据库
    cursor=conn.cursor()
    cursor.execute("CREATE DATABASE IF NOT EXISTS pm25")  #创建数据库pm25
    conn=mysql.connector.connect(user="root",password="自己的数据库密码",host="localhost",database="pm25")  #连接到数据库pm25
    cursor=conn.cursor()   #创建一个cursor对象,以便用它的方法运行sql代码
    cursor.execute("CREATE TABLE IF NOT EXISTS table_pm25 (no smallint PRIMARY KEY  NOT NULL ,sitename char(20) not null ,level varchar(10) ,quality char(4),pm25 double)")  #执行sql代码,创建一个喊有no,sitename等字段的表
    conn.commit()  #刷新
    
    url="http://api.help.bj.cn/api/?id=53"        #确定要爬取数据的网站
    htmltext=requests.get(url).text.encode("utf-8-sig")   #获取源码,并制定编码格式
    md5=hashlib.md5(htmltext).hexdigest()                 #获取判断该网站是否更新的md5编码
    if not os.path.exists("pm25.txt"):                    #如果当前文件所在的目录不存在pm25.txt 文本文件,则创建一个(用来存储md5编码)
    f=open("pm25.txt","w")                              #
    f.write(md5)                                        #在文本文件中写入md5
    f.close()                                           #
    else:
    with open("pm25.txt","r")as f:                  #如果存在pm25.txt文件,则读取其中的上次存入的md5码,并存入新的md5码
        old_md5=f.read()
        f=open("pm25.txt","w")
        f.write(md5)
        f.close()
    
    if md5 != old_md5:                                  #比较新旧md5码,如果不同,则表示网页已更新
    print("old_md5={}".format(old_md5))
    print("new_md5={}".format(md5))
    print("数据已更新,正在获取.....")
    cursor.execute("delete from table_pm25")        #删除数据表中所有数据
    conn.commit()
    sp=BeautifulSoup(htmltext,"html.parser") 
    content=sp.text                                 #获取所有HTML标签内的内容(不包括标签)
    content=re.findall(r"aqidata[^$]+字段说明",content)     #用排除法[^$] 获取固定字符间的内容
    strs=re.findall(r"{[^$]+}",str(content))                #因为该源码内容较复杂,所以要用正则表达式多进行几次内容的筛选
    strs=re.findall(r"{[^'^{^}^]+}",str(strs))              #最后得到的内容恰好是符合python的字典类型的数据
    n=1                                                     #作为对每行数据的编号
    for str in strs:                                        #获取每一行的数据,
        jor=ast.literal_eval(str)                           #转变为自典型
        print("城市:{}      lever:{}    quality:{}    pm2.5:{}" .format(jor["city"],jor["level"],jor["quality"],jor["pm2_5"]))   #输出,并将其插入到表中
        sql="insert into table_pm25 values(%d,'%s','%s','%s',%f)"
        cursor.execute(sql %(n,jor["city"],jor["level"],jor["quality"],jor["pm2_5"]))
        n+=1
    conn.commit()
    else:                                                       #如果网页未更新,则取出之前存储的数据,并输出
    print("数据未更新....")
    cursor.execute("select * from table_pm25")
    jor=cursor.fetchall()
    for str in jor:
        print("城市:{}      lever:{}    quality:{}    pm2.5:{}" .format(str[1],str[2],str[3],str[4]))
    cursor.close()
    conn.close()

最后的输出结果:
在这里插入图片描述
插入在数据库中的内容:
在这里插入图片描述

为了做这个任务,还特意去学了学数据库,一步一个坑。万事开头难,刚开始啥都不懂,光是连接数据库就耗了半天,后来慢慢找教程,思路渐渐就开始清晰了。个人感觉搞清楚连接数据库和sql语句的基本用法后,实验就完成了一半了,剩下就是爬取网站啊,获取指定的字符这些。因为不同的网页架构不一样,有些网页的代码简洁漂亮,爬起来那叫个欢畅,有些网页的就…比如这次这个算是比较乱的,所以想要排除掉其他的多余字符 ,获取自己想要的那部分还是花了我很大一部分时间。

复制代码

全部评论 (0)

还没有任何评论哟~