数据采集与融合技术第二次大作业

作业①

1.实验内容

  • 要求:在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。
  • 输出信息:
序号 地区 日期 天气信息 温度
1 北京 7日(今天) 晴间多云,北部山区有阵雨或雷阵雨转晴转多云 31℃/17℃
2 北京 8日(明天) 多云转晴,北部地区有分散阵雨或雷阵雨转晴 34℃/20℃
3 北京 9日(后台) 晴转多云 36℃/22℃
4 北京 10日(周六) 阴转阵雨 30℃/19℃
5 北京 11日(周日) 阵雨 27℃/18℃
6......
  • 运行结果截图:


2.心得体会

(1)作业①的代码为2.6实践项目的复现,其中的城市码可以自己指定。在网页中搜索福建沿海地区城市的7日天气预报可得网址:

于是对CityCode进行修改:

(2)以福州为例打开相应网页进行元素审查,发现七日天气的信息都存放在

    于是利用BeautifulSoup库中的CSS语言对七日天气信息进行爬取:lis = soup.select("ul[class='t clearfix'] li")

    (3)根据爬取的内容建立数据库并创建表对数据进行存储

    def openDB(self): # 打开数据库,如果没有直接创建
        self.con=sqlite3.connect("weathers.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table weathers (wNo int(32),wCity varchar(16),wDate varchar(16),wWeather varchar(64),
    wTemp varchar(32),constraint pk_weather primary key (wCity,wDate))")
        except:
            self.cursor.execute("delete from weathers")
    

    (4)编写show()函数检查是否将数据成功插入数据库中

    def show(self): # 在控制台打印数据库
        self.cursor.execute("select * from weathers")
        rows = self.cursor.fetchall()
        print("{:^10}\t{:^10}\t{:^10}\t{:^10}\t{:^20}".format("序号", "地区","日期", "天气信息", "温度",chr(12288)))
        for row in rows:
            print("{:^10}\t{:^10}\t{:^10}\t{:^5}\t{:>20}".format(row[0], row[1], row[2], row[3], row[4],chr(12288)))
    

    作业②

    1.实验内容

    序号 股票代码 股票名称 最新报价 涨跌幅 涨跌额 成交量 成交额 振幅 最高 最低 今开 昨收
    1 688093 N世华 28.47 62.22% 10.92 26.13万 7.6亿 22.34 32.0 28.08 30.2 17.55
    2......
    • 运行结果部分截图:

    2.心得体会

    (1)打开指定网址在国内股市沪深个股中找到沪深A股

    (2)利用浏览器F12调试分析对沪深A股进行抓包并选择Preview进行查看是否查找正确

    (3)找到后在Headers的Request URL获取网页元素连接

    (4)对网页进行翻页处理,检查每页的Request URL可以发现每页除pn为页数以外都相同

    于是对url进行循环处理:

    total=3
    for i in range(total):
        url = "http://31.push2.eastmoney.com/api/qt/clist/getcb=jQuery112404944788859198004_1634123014402&pn{0}&pz=20&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23".format(i + 1)
    
    

    (5)打开第一页网页内容发现要爬取部分在"[]"之间

    为了避免与前面"{}"混淆,现将"[]"的内容进行提取并利用正则表达式将"{}"的内容进行提取

    text = r.text[r.text.index("["):] # 寻找需要爬取的内容
    datas = re.findall("{.*?}", text) # 利用正则表达式将{}的全部内容提取
    

    (6)利用json将各数据解析成字典方便提取

    for j in range(len(datas)):
        data = json.loads(datas[j]) # 将数据解析成字典
    

    (7)根据爬取的内容建立数据库并创建表对数据进行存储

    def openDB(self): # 打开数据库,如果没有直接创建
        self.con=sqlite3.connect("shares.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table sha (Sno int (16),Scode varchar (64),Sname varchar (64),Snewprice float (32),Sup float (32),Sdown float (32),
    Snum float (32),Scount float (32),Sswing float (32),Shigh float (32),Slow float (32),Stoday float (32),Syes float(32),constraint sh primary key (Scode))")
        except:
            self.cursor.execute("delete from sha")
    

    (8)编写show()函数检查是否将数据成功插入数据库中

    def show(self): # 在控制台打印数据库
        self.cursor.execute("select * from sha")
        rows = self.cursor.fetchall()
        print("{:<3}\t{:}\t{:^10}\t{:^10}\t{:}\t{:<5}\t{:^8}\t{:>9}\t{:>6}\t{:>6}\t{:>6}\t{:>6}\t{:>6}".format(
                "序号", "股票代码", "股票名称", "最新报价", "涨跌幅", "涨跌额", "成交量", "成交额", "振幅", "最高", "最低", "今开", "昨收",chr(12288)))
        for row in rows:
            print("{:<3}\t{:^12}\t{:<8}\t{:>10}\t{:^10}\t{:<5}\t{:<15}\t{:^10}\t{:<4}\t{:<5}\t{:<4}\t{:<5}\t{:<5}"
                      .format(row[0], row[1], row[2],row[3],row[4],row[5],row[6],row[7],row[8],row[9],row[10],row[11],row[12],chr(12288)))
    

    作业③

    1.实验内容

    排名 学校 总分
    1 清华大学 969.2
    • 运行结果部分截图:

    2.心得体会

    (1)利用浏览器F12进行调试分析(gif展示操作过程)

    (2)打开Request URL发现中文乱码现象

    于是在request访问时进行解码操作:r.encoding = r.apparent_encoding # 解码

    (3)利用正则表达对学校名称和总分进行爬取,总分为浮点数。

    schools = re.findall(r'univNameCn:"(.*?)"', html)  # 用正则表达找到全部学校
    scores = re.findall(r'score:(\d*?.\d*?),', html)  # 用正则表达式匹配全部总分,存在有小数的情况
    

    (4)根据爬取的内容建立数据库并创建表对数据进行存储

    def openDB(self): # 打开数据库,如果没有直接创建
        self.con=sqlite3.connect("ranks.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table schoolranks (Rank int(16),School varchar(32),Score float(16),constraint rk primary key (School))")
        except:
            self.cursor.execute("delete from schoolranks")
    

    (5)编写show()函数检查是否将数据成功插入数据库中

    def insert(self, rank, school, score): # 插入数据
        try:
            self.cursor.execute("insert into schoolranks (Rank,School,Score) values (?,?,?)",
                                    (rank, school, score))
        except Exception as err:
            print(err)
    
posted @ 2021-10-16 11:16  imperceptibly  阅读(36)  评论(0编辑  收藏  举报