2023数据采集与融合技术实践作业2

2023数据采集与融合技术实践作业2

目录

作业1

要求:在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。

Gitee 文件夹链接
https://gitee.com/zhoujingyang0509/crawl_project/tree/master/作业2

(1)代码

1.1发送请求

复制代码
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

打开网页可看到每天的天气数据都在ul下的li

1.2解析数据

python 复制代码
soup = BeautifulSoup(data, "lxml")
li_list = soup.select("ul[class='t clearfix'] li")
for li in li_list:
    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

1.3创建数据库

python 复制代码
class WeatherDB:
    #创建数据库
    def openDB(self):
        self.con = sqlite3.connect("weathers.db")#打开一个到 SQLite数据库文件database的链接,如果给定的数据库名称filename不存在,则该调用将创建一个数据库。
        self.cursor = self.con.cursor()#创建 cursor光标
        try:
            self.cursor.execute(#执行 SQL 语句。
                "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 closeDB(self):
        self.con.commit()
        self.con.close()

    #向数据库插入数据
    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)

    #从数据库读出内容
    def show(self):
        self.cursor.execute("select * from weathers")
        rows = self.cursor.fetchall()
        print("%-16s%-16s%-32s%-16s" % ("city", "data", "weather", "temp"))
        for row in rows:
            print("%-16s%-16s%-32s%-16s" % (row[0], row[1], row[2], row[3]))

1.4数据入库

python 复制代码
self.db.insert(city, date, weather, temp)

查看weathers数据库中的内容

(2)心得体会

这次作业是对之前作业的复现,只不过这次要把数据保存在数据库中,学会了如何将爬取到的数据保存在sqlite数据库中,并且将数据库中的数据在pycharm中可视化。

作业2

要求:用requests和BeautifulSoup库方法定向爬取股票相关信息,并存储在数据库中

Gitee 文件夹链接:
https://gitee.com/zhoujingyang0509/crawl_project/tree/master/作业2

(1)代码

抓包,找到数据对应的数据包

2.1发送请求

获取json数据

python 复制代码
url='http://21.push2delay.eastmoney.com/api/qt/clist/get?cb=jQuery112408395754169788474_1696658950571&pn=1&pz=100&po=1&np=1&ut=bd1d9ddb04089700cf9c27f6f7426281&fltt=2&invt=2&wbp2u=|0|0|0|web&fid=f3&fs=m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048&fields=f2,f3,f4,f5,f6,f7,f12,f14,f15,f16,f17,f18&_=1696658950639'
resp =self.requests.get(url=url,headers=self.headers,params=params).text
# 发送请求
response = resp[len("jQuery112406415601187449365_1697203051878("):len(resp) - 2]
#获取json数据
resp_json = json.loads(response)

2.2解析json数据

获取名称、代码、最新价等数据

python 复制代码
    def parse_data(self, data):
        data1={}
        for x in data['data']['diff']:
            data1['代码'] = x['f12'],
            data1['名称'] = x['f14'],
            data1['最新价'] = x['f2'],
            data1['涨跌幅'] = x['f3'],
            data1['跌涨额'] = x['f4'],
            data1['成交量'] = x['f5'],
            data1['成交额'] = x['f6'],
            data1['振幅'] = x['f7'],
            self.save_data(data1)

2.3连接数据库

连接数据库,创建test2表

python 复制代码
class test(object):

    #连接数据库
    def __init__(self):
        self.db  = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')
        self.youbaio = self.db.cursor()
        self.requests = requests
        self.json = json
        self.url = ''
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
        }


    # 2、要预创建一个表方法:存入信息
    def create_table(self):
        sql = '''
        CREATE TABLE IF NOT EXISTS test2(
        序号 int primary key auto_increment not null,
        代码 VARCHAR(10) NOT NULL, 
        名称 VARCHAR(10) NOT NULL, 
        最新价 VARCHAR(10) NOT NULL, 
        涨跌幅 VARCHAR(10) NOT NULL, 
        跌涨额 VARCHAR(10) NOT NULL, 
        成交量 VARCHAR(10) NOT NULL, 
        成交额 VARCHAR(10) NOT NULL, 
        振幅 VARCHAR(10) NOT NULL)
       '''
        #id每加入一条数据就自动加一

        try:
            self.youbaio.execute(sql)
            print("CREATE TABLE SUCCESS.")
        except Exception as ex:
            print(f"CREATE TABLE FAILED,CASE:{ex}")

2.4数据入库

python 复制代码
    # 数据入库:
    def save_data(self, data1):
        sql = 'INSERT INTO test2(序号, 代码, 名称, 最新价,涨跌幅,跌涨额,成交量,成交额,振幅) values(%s, %s, %s, %s, %s, %s, %s, %s, %s)'

        try:
            self.youbaio.execute(sql, (0,data1["代码"], data1["名称"], data1["最新价"],data1["涨跌幅"],data1["跌涨额"],data1["成交量"],data1["成交额"],data1["振幅"]))
            self.db.commit()
            print('插入成功')
        except Exception as er:
            print('插入失败')
            self.db.rollback()

查看数据库中的数据

(2)心得体会

1、掌握了json的格式,知道了获取json中的数据和操作字典一样

2、使用python类的方式组织代码,原以为导入了相应的库就可以直接使用,原来还得在类中定义了才能使用,而且在类中操作变量或方法都得带上self

3、这次数据库连接的是mysql,学会了在pycharm中如何连接mysql数据库并将表中的数据可视化,也掌握了如何将数据保存在mysql中

4、清楚了抓包流程,查看每一个包再预览响应数据来查看该包中有没有需要的数据

作业3

要求:爬取中国大学2021主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所有院校信息,并存储在数据库中,同时将浏览器F12调试分析的过程录制Gif加入至博客中。

Gitee 文件夹链接:

https://gitee.com/zhoujingyang0509/crawl_project/tree/master/作业2

GIF

(1)代码

3.1发送请求

python 复制代码
    def get_data(self):

        url = 'https://www.shanghairanking.cn/_nuxt/static/1697106492/rankings/bcur/2021/payload.js'
        response = requests.get(url=url, headers=self.headers)
        response.encoding = 'utf-8'
        page_text = response.text
        data_regex = r'univData:(.*?),indList'
        data = re.findall(data_regex, page_text, re.S)[0]

        return data

3.2解析数据

使用正则表达式解析数据

复制代码
names = re.findall("univNameCn:(.*?),univNameEn:", data)
scores = re.findall("score:(.*?),ranking", data)
univCategory = re.findall("univCategory:(.*?),province", data)
# print(univCategory)
province = re.findall("province:(.*?),score", data)

但此时获取的省份和学校类型还不是我们最终想要的,观察网页的结构,找了很久才发现了这里就是头尾的键值对的对应。

然后我们需要抓取这里的信息,然后构造键值对,由于省份和学校类型不太多,所以我手动构造键值对。

复制代码
        province_map = {
            'k': '江苏', 'n': '山东', 'o': '河南', 'p': '河北', 'q': '北京', 'r': '辽宁', 's': '陕西', 't': '四川', 'u': '广东',
            'v': '湖北', 'w': '湖南', 'x': '浙江', 'y': '安徽', 'z': '江西', 'A': '黑龙江', 'B': '吉林', 'C': '上海', 'D': '福建',
            'E': '山西',
            'F': '云南', 'G': '广西', 'I': '贵州', 'J': '甘肃', 'K': '内蒙古', 'L': '重庆', 'M': '天津', 'N': '新疆', 'Y': '海南'
        }

        univ_map = {
            'f': '综合',
            'e': '理工',
            'h': '师范',
            'm': '农业',
            'T': '林业',
        }

3.3连接数据库

连接数据库,创建test3

复制代码
class test(object):

    def __init__(self):
        self.db  = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')
        self.youbaio = self.db.cursor()
        self.requests = requests
        self.re=re
        self.url = ''
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
        }


    # 2、要预创建一个表方法:存入信息
    def create_table(self):
        sql = '''
        CREATE TABLE IF NOT EXISTS test3(
        排名 int  not null,
        学校名称 VARCHAR(10) primary key NOT NULL, 
        省份 VARCHAR(10) NOT NULL, 
        类型 VARCHAR(10) NOT NULL, 
        总分 float NOT NULL)
       '''

        try:
            self.youbaio.execute(sql)
            print("CREATE TABLE SUCCESS.")
        except Exception as ex:
            print(f"CREATE TABLE FAILED,CASE:{ex}")

3.4数据入库

python 复制代码
    def save_data(self, data1):
        print(data1[0])
        sql = 'INSERT INTO test3(排名, 学校名称, 省份, 类型,总分) values(%s, %s, %s, %s, %s)'

        try:
            self.youbaio.execute(sql, (data1[0], data1[1], data1[2],data1[3],data1[4]))
            self.db.commit()
            print('插入成功')
        except Exception as er:
            print('插入失败')
            self.db.rollback()

查看数据库中的内容

(2)心得体会

1、使用正则表达式解析数据时发现(.*?)很好用,可以提取我想要的数据

2、第一次见头尾的键值对的对应的这种网页结构,长见识了。

3、响应的数据不是json格式的,但我想构造json格式的数据,这样可以像第二问那样方便提取学校信息,但是它的键有些不是字符串型的,于是我使用正则表达式把想把键都加上双引号,但由于正则表达式掌握的还不是很深入,一直出现bug,于是直接使用正则表达式提取了学校信息。

相关推荐
xinxinhenmeihao1 天前
爬虫如何使用代理IP才能不被封号?有什么解决方案?
爬虫·网络协议·tcp/ip
鲁邦通物联网2 天前
工业物联网架构:基于边缘计算的OEE数据采集与预处理实践
边缘计算·数据采集·工业数据采集·边缘网关·边缘计算网关·5g数采
捷米特网关模块通讯2 天前
串口无线数传模块:实现汽车零部件厂房 PLC 与触摸屏 300 米稳定交互
数据采集·无线通讯·工业自动化·无线数传模块·工业无线网桥
捷米特网关模块通讯2 天前
Profibus DP 转 Modbus TCP:协议转换模块破解异构网络通讯难题
上位机·数据采集·工业自动化·工业智能网关·网关模块·profibus dp总线
御控工业物联网2 天前
工业网关新玩法:手机变“移动触摸屏”,局域网内远程操控PLC
物联网·智能手机·自动化·数据采集·plc·远程控制·远程操控plc
2501_938810112 天前
什么IP 适用爬虫 采集相关业务
爬虫·网络协议·tcp/ip
第二只羽毛2 天前
主题爬虫采集主题新闻信息
大数据·爬虫·python·网络爬虫
御控工业物联网2 天前
码垛机数据采集物联网解决方案:驱动智能制造的“数字引擎”
物联网·边缘计算·数据采集·mqtt协议·工业智能网关·plc远程调试
0***h9422 天前
初级爬虫实战——麻省理工学院新闻
爬虫
是有头发的程序猿2 天前
Python爬虫实战:面向对象编程在淘宝商品数据抓取中的应用
开发语言·爬虫·python