作业一

  • 要求:在中国气象网(http://www.weather.com.cn)给定城市集的7日天气预报,并保存在数据库。
  • 输出信息:Gitee文件夹链接

实验过程

  1. 准备工作:定义对表weather的打开、关闭、插入、查询操作
点击查看代码
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")

    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", "date", "weather", "temp"))
        for row in rows:
            print("%-16s%-16s%-32s%-16s" % (row[0], row[1], row[2], row[3]))
  1. http://www.weather.com.cn/weather1d/101230101.shtml的网页显示福州的天气预报,其中101230101是福州的代码,每个城市或者地区都有一个代码。

  2. 准备爬取北京、上海、广州、深圳等城市的天气预报数据,将它们的代码写入字典并拼接成url

点击查看代码
self.cityCode = {"北京": "101010100", "上海": "101020100", "广州": "101280101", "深圳": "101280601"}
if city not in self.cityCode.keys():
    print(city + " code cannot be found")
    return
url = "http://www.weather.com.cn/weather/" + self.cityCode[city] + ".shtml"`<details>
  1. 通过分析网页源代码,利用BeautifulSoup爬取数据并插入数据库的表中
点击查看代码
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(city, date, weather, temp)
        self.db.insert(city, date, weather, temp)
  1. 将表weather中的数据输出打印在控制台

  2. 查看表数据

心得体会

  1. 接触并学习了在Pycharm中使用SQLite创建表、插入数据等操作;
  2. 学习了在设置不同请求参数访问不同网页(不同城市的天气预报)。

作业二

  • 要求:用requests和自选提取信息方法定向爬取股票相关信息,并存储在数据库中。
  • 候选网站:东方财富网:https://www.eastmoney.com/ 新浪股票:http://finance.sina.com.cn/stock/
  • 技巧:在谷歌浏览器中进入F12调试模式进行抓包,查找股票列表加载使用的url,并分析api返回的值,并根据所要求的参数可适当更改api的请求参数。根据URL可观察请求的参数f1、f2可获取不同的数值,根据情况可删减请求的参数。
  • 输出信息:Gitee文件夹链接
  1. 通过preview查找网页

  2. 分析各股票的url

    该网页显示上证A股的股票信息,分析url,pn=i表示页码,而每种股票有特定代码,通过拼接可以得出各股票信息网页的url。

  3. 定义股票的代码字典

点击查看代码
cmd = {
        "上证指数":"C.1",
        "深圳指数":"C.5",
        "沪深A股":"C._A",
        "上证A股":"C.2",
        "深圳A股":"C._SZAME",
        "新股":"C.BK05011",
        "中小板":"C.13",
        "创业板":"C.80"
    }
  1. 拼接后的url
点击查看代码
url = "http://61.push2.eastmoney.com/api/qt/clist/get?cb=jQuery1124014269895100741348_1634088828614&pn="\
          +str(page)+"&cmd="+cmd+"&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"
  1. 使用正则表达式爬取信息
点击查看代码
r = requests.get(url)
data = re.compile('"diff":\[(.*?)\]',re.S).findall(r.text)
  1. 得到diff内的文本内容后,由于需要提取的字段在特定的f后(例如"f12:"后的信息为股票代码),因此先将字符串转化为字典,以fi(i为数字)为健,提取字段信息,并将信息存入stocks数据库的stock_table表中
点击查看代码
def getOnePageStock(cmd,page):
    data = getHtml(cmd,page)
    datas = data[0].split('},')
    datax=[]
    for datai in datas:
        if datai[-1]!='}':
            datai +='}'
            datax.append(json.loads(datai))
    stocks = []
    for stock in datax:
        cursor.execute("insert into stock_table (股票代码,股票名称,最新价格,涨跌额,涨跌幅,成交量,成交额,振幅,最高,最低,今开,昨收) values (?,?,?,?,?,?,?,?,?,?,?,?)",
                       (stock['f12'],stock['f14'],stock['f2'],stock['f3'],stock['f4'],stock['f5'],stock['f6'],stock['f7'],stock['f15'],stock['f16'],stock['f17'],stock['f18']))
    return stocks
  1. 查看stock_table表中的数据

心得体会

  1. 学会了使用f12抓包得到网页信息,可以通过设置url的请求参数来爬取不同网页信息(如该题爬取不同股票网页),有时也可以删除一些请求参数(如该题中的url可以删除末尾的数字部分);
  2. 巩固了正则表达式的用法;
  3. 巩固了字典的用法,通过键值对的形式提取所需字段;
  4. 学习了将数据存入excel表的用法(df.to_excel(),由于该题未涉及,故只在代码注释部分中体现出来)

作业三

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

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

  • 输出信息:Gitee文件夹链接

  • 实验过程

  1. f12调试,查看url,将将浏览器F12调试分析的过程录制并转为GIF格式
  • 转GIF
点击查看代码
import moviepy.editor as mpy
movie=mpy.VideoFileClip(r"C:\Users\19259\university_rank.mp4")
movie.write_gif("university_rank.gif")
  • GIF

  • 获取url

  1. 分析网页信息,可以得出所需信息的位置

  2. 使用正则表达式爬取信息,并将信息存入university_rank数据库的university_rank表中

点击查看代码
def getinfo(html):
    names=re.findall("univNameCn:(.*?)univNameEn",html)
    scores=re.findall("score:(.*?)ranking",html)
    for i in range(len(names)):
        cursor.execute(
            "insert into univercity_rank(学校,总分) values (?,?)",
            (names[i].replace('"','').replace(',','')[0:],scores[i].replace(",","")[1:]))
  1. 查看表university_rank

心得体会

  1. 学会了利用Python将MP4文件转为GIF文件;
  2. 对于用f12调试得到的request url爬取的网页信息,使用re库能十分方便、快速地匹配字段。

Gitee文件夹链接:https://gitee.com/jmssj/pythonProject/tree/master

 posted on 2021-10-14 18:52  金木s  阅读(56)  评论(0编辑  收藏  举报