数据采集第二次大作业

数据采集第二次大作业

作业①

序号 地区 日期 天气信息 温度
1 北京 七日(今天) 晴间多云,北部山区有阵雨或雷阵雨转晴转多云 31℃/17℃
2 北京 八日(明天) 多云转晴,北部地区有分散阵雨或雷阵雨转晴 34℃/20℃
...

一.实现过程

  • 1.打开网址,分析要爬取的信息,可以找到要爬取信息对应的属性。
  • 2.使用CSS进行页面解析,并获取和打印需要的信息
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()
            dammit = UnicodeDammit(data, ["utf-8", "gbk"])
            data = dammit.unicode_markup
            soup = BeautifulSoup(data, "lxml")
            lis = soup.select("ul[class='t clearfix'] li")
            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
                    print('{:^20}{:^20}{:^20}{:^20}'.format(city, date, weather, temp))
                    self.db.insert(city, date, weather, temp)
                except Exception as err:
                    pass
                    #print(err)
        except Exception as err:
            print(err)
  • 3 导入sqlite3包,创建数据库以及实现插入爬取的数据
    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")
    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)
  • 4.运行结果如下

-5.下载SQLitStudio来打开创建的数据库weather.db,并查看表weather,截图如下

二.心得体会

  • 初步学习了如何使用sqlite包进行数据库的相关操作。
  • 加深了对bs4的掌握

作业②

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

一.实现过程

  • 1.打开东方财富网,按下f12查看页面源代码,在network中寻找包含股票信息的js包,找到其头部url信息。

  • 2.通过分析包信息构建正则表达式
f2 = '"f2":(.*?),'
f14 = '"f14":(.*?),'
f3 = '"f3":(.*?),'
f4 = '"f4":(.*?),'
f5 = '"f5":(.*?),'
f12 = '"f12":(.*?),'
f6 = '"f6":(.*?),'
f7 = '"f7":(.*?),'
f15 = '"f15":(.*?),'
f16 = '"f16":(.*?),'
f17 = '"f17":(.*?),'
f18 = '"f18":(.*?),'
  • 3.结果print输出以及存储到数据库中
while i<20:
   cursor.execute("insert into stock (sorder ,sno,sname ,snewprice,sincreaserate ,sincreasenum ,sdealcount ,sdealnum ,schangerate ,smax ,smin ,stodayprice ,syesterday) values (?,?,?,?,?,?,?,?,?,?,?,?,?)",(i,list2[i],list3[i],list4[i],list5[i],list6[i],list7[i],list8[i],list9[i],list10[i],list11[i],list12[i],list13[i]))
   print('{:^20}{:^20}{:^20}{:^20}{:^20}{:^20}{:^20}{:^20}{:^20}{:^20}{:^20}{:^20}{:^20}'.format(i,list2[i],list3[i],list4[i],list5[i],list6[i],list7[i],list8[i],list9[i],list10[i],list11[i],list12[i],list13[i]))
   i = i+1
  • 4.结果截图

二.心得体会

  • 加深了对sqlite3包的使用
  • 了解并尝试了通过抓包爬取数据。

作业③

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

一.实现过程

  • 1.打开要爬取的网站,按下f12,寻找要爬取信息对应的js包,以下为f12调试过程gif动图。

  • 2.得到js包的URL地址后,对其进行解析

url = 'https://www.shanghairanking.cn/_nuxt/static/1632381606/rankings/bcur/2021/payload.js'
req = urllib.request.Request(url)
data = urllib.request.urlopen(req)
data = data.read()
dammit = UnicodeDammit(data,["utf-8",'gbk'])
data=dammit.unicode_markup
  • 3.构造正则表达式
s1='univNameCn:"(.*?)"'
#匹配大学名称
s2=',score:(.*?),'
#匹配总分
name = re.findall(s1,data)
score = re.findall(s2,data)
  • 4.输出结果即将数据插入数据库
    cursor.execute("insert into ranking.ranking (rno,rname,rscore) values (?,?,?)",(i+1,name[i],score[i]))
    print('{:^20}{:^20}{:^20}'.format(i+1,name[i],score[i]))
  • 5.结果截图

二.心得体会

  • 加深巩固了通过抓包进行爬取数据的方法,感觉简便很多
  • 更加熟练正则表达式的构造
posted @ 2021-10-14 18:49  haizaizuiying  阅读(16)  评论(0编辑  收藏  举报