数据采集技术第二次作业

作业①:

题目:中国气象网爬取给定城市集的7日天气预报,并保存在数据库中。输出信息如下:

序号 地区 日期 天气 温度
1 北京 7日(今天) 晴间多云 31℃/17℃
2 北京 8日(明天) 多云转晴 34℃/20℃
3 北京 9日(后天) 晴转多云 36℃/22℃
4 …… …… …… ……

完整代码:码云作业1

1.解题过程:

1.1:主函数部分

ws = WeatherForecast()
ws.process(["北京", "上海", "广州", "深圳"])
print("completed")

1.2:建立并保存数据库

class WeatherDB:
    #打开数据库
    def openDB(self):
        self.con=sqlite3.connect("weathers.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table weathers (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")

1.3:获取网页

class WeatherForecast:
    def __init__(self):
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre"}
        self.cityCode = {"北京": "101010100", "上海": "101020100", "广州": "101280101", "深圳": "101280601"}
    def forecastCity(self, city):
        url = "http://www.weather.com.cn/weather/" + self.cityCode[city] + ".shtml"
        try:
            req = urllib.request.Request(url, headers=self.headers)
            data = urllib.request.urlopen(req)#发送请求
            data = data.read().decode('utf-8')#解析代码
            soup = BeautifulSoup(data, "lxml")

1.4:根据网页信息编写爬取代码

for li in lis:
  try:
    date = li.select('h1')[0].text  #日期
    weather = li.select('p[class="wea"]')[0].text  # 天气
    temp = li.select('p[class="tem"] span')[0].text + "/" + li.select('p[class="tem"] i')[0].text #温度
    self.db.insert(city, date, weather, temp)
    #插入至数据库weathers.db

加入数据库代码如下:

#加入元组
def insert(self, city, date, weather, temp):
   try:
      self.cursor.execute("insert into weathers (wCity,wDate,wWeather,wTemp) values (?,?,?,?)",(city, date, weather, temp))
   except Exception as err:
      print(err)

1.5:输出信息

#打印数据
def show(self):
    self.cursor.execute("select * from weathers")
    rows = self.cursor.fetchall()
    i=1#序号
    tplt = "{:4}\t{:10}\t{:14}\t{:24}\t{:16}"
    print(tplt.format("序号","地区", "日期", "天气信息", "温度"))
    #输出格式
    for row in rows:
        print(tplt.format(i,row[0], row[1], row[2], row[3]))
        i+=1

 

 

2.心得体会

本实验让我进一步巩固了对BeautifulSoup库的理解和使用,并接触了数据库的建立和使用。

 

作业②:

题目:用requests和自选提取信息方法定向爬取股票相关信息,并存储在数据库中。

候选网站:东方财富网   新浪股票

技巧:在谷歌浏览器中进入F12调试模式进行抓包,查找股票列表加载使用的url,并分析api返回的值,并根据所要求的参数可适当更改api的请求参数。根据URL可观察请求的参数f1、f2可获取不同的数值,根据情况可删减请求的参数。参考链接

输出信息如下:

序号 股票代码 股票名称 最新报价 涨跌幅 涨跌额 成交量 成交额 振幅 最高 最低 今开 昨收
1 688093 N世华 28.47 62.22% 10.92 26.13万 7.6亿 22.3% 32.0 28.08 30.2 17.55
…… …… …… …… …… …… …… …… …… …… …… …… ……

完整代码:码云作业2

1.解题过程:

1.1:主函数部分

ws = share()
ws.process()
print("completed")

1.2:建立并保存数据库

class shareDB:
    #打开数据库
    def openDB(self):
        self.con=sqlite3.connect("share.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table share (daima varchar(10),name varchar(16),newvalue varchar(12),fu varchar(32),zhangtiee varchar(10),liang varchar(16),chengjiaoe varchar(16),zhengfu varchar(10),most varchar(10),least varchar(10),today varchar(10),tom varchar(10),constraint pk_weather primary key (daima,name))")
            #创建格式
        except:
            self.cursor.execute("delete from share")

1.3:获取网页

class share:
    def __init__(self):
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36"}
    def forecastCity(self):
        for i in range(1, 3):
            url = "http://84.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124028409701949327015_1634088183070&pn=" + str(i) + "&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&fields=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152&_=1634088183071"
            reponse = requests.get(url, headers=self.headers)#发送请求
            result = reponse.text

1.4:根据网页信息编写爬取代码

for item in re.findall(r"\{\"f1(.*?)\}", result, re.S):
    sdaima = re.findall(r"f12\":\"(.*?)\"", item)#股票代码
    sname = re.findall(r"f14\":\"(.*?)\"", item)#股票名称
    snewvalue = re.findall(r"f2\":(.+?),", item)#最新报价
    sfu = re.findall(r"f3\":(.*?),", item)#涨跌幅
    szhangtiee = re.findall(r"f4\":(.*?),", item)#涨跌额
    sliang = re.findall(r"f5\":(.*?),", item)#成交量
    schengjiaoe = re.findall(r"f6\":(.*?),", item)#成交额
    zhengfu = re.findall(r"f7\":(.*?),", item)#振幅
    smost = re.findall(r"f8\":(.*?),", item)#最高
    sleast = re.findall(r"f9\":(.*?),", item)#最低
    stoday = re.findall(r"f10\":(.*?),", item)#今开
    stom = re.findall(r"f11\":(.*?),", item)#昨收
    self.db.insert(sdaima[0], sname[0], snewvalue[0], sfu[0]+"%", szhangtiee[0], str(round(float(sliang[0])/10000,2))+"万", str(round(float(schengjiaoe[0])/100000000,2))+"亿",szhengfu[0]+"%", smost[0], sleast[0], stoday[0], stom[0])
    #加入元组

1.5:输出信息

#打印数据
def show(self):
    self.cursor.execute("select * from share")
    rows = self.cursor.fetchall()
    i=1
    tplt = "{:4}\t{:8}\t{:8}\t{:8}\t{:8}\t{:8}\t{:8}\t{:8}\t{:8}\t{:8}\t{:8}\t{:8}\t{:8}"
    print(tplt.format("序号", "股票代码", "股票名称", "最新报价", "涨跌幅", "涨跌额", "成交量", "成交额", "振幅", "最高", "最低", "今开", "昨收"))
    #设置输出格式
    for row in rows:
        print(tplt.format(i,row[0], row[1], row[2], row[3],row[4], row[5], row[6], row[7],row[8], row[9], row[10], row[11],chr(12288)))
        i+=1

 2.心得体会

 本实验用f12获取股票这种动态数据的信息,与以往的在html中直接爬取都有所不同。

 

作业③:

题目:爬取中国大学2021主榜所有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中。

技巧:分析该网站的发包情况,分析获取数据的api。

输出信息如下:

排名 学校 总分
1 清华大学 969.2

完整代码:码云作业3

1.解题过程:

1.1:主函数部分

ws = school()
ws.process()
print("completed")

1.2:建立并保存数据库

class schoolDB:
    #打开数据库
    def openDB(self):
        self.con=sqlite3.connect("school.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table school (rate varchar(10),school varchar(10),score varchar(10),constraint pk_school primary key (rate))")
            # 创建格式
        except:
            self.cursor.execute("delete from school")

1.3:获取网页

class school:
    def fore(self):
        url = "https://www.shanghairanking.cn/_nuxt/static/1632381606/rankings/bcur/2021/payload.js"
        reponse = requests.get(url)  # 发送请求
        result = reponse.text

1.4:根据网页信息编写爬取代码

i=1
for item in re.findall(r"univUp(.*?)}", result, re.S):
   school = re.findall(r"univNameCn:\"(.*?)\"", item)
   score = re.findall(r"score:(.*?),", item)
   self.db.insert(i, school[0], score[0])#加入元组
   i+=1

1.5:输出信息

#打印数据
def show(self):
   self.cursor.execute("select * from school")
   rows = self.cursor.fetchall()
   tplt = "{0:^8}\t{1:{3}^15}\t{2:<15}"
   print(tplt.format("排名","学校", "总分",chr(12288)))
   #设置输出格式
   for row in rows:
       print(tplt.format(row[0], row[1], row[2],chr(12288)))

  2.心得体会

 本实验我进一步掌握f12抓包操作,而且在过程中要注意存入数据库的数据是否有缺少的值。

 

posted @ 2021-10-14 21:34  R-zhang  阅读(72)  评论(0编辑  收藏  举报