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

作业1
1)在中国气象网(http://www.weather.com.cn)给定城市集"北京", "上海", "广州", "深圳"的7日天气预报,并保存在数据库。

"""天气信息爬取类"""
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):
        """获取特定城市的天气预报信息"""
        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"
        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(city, date, weather, temp)
                    self.db.insert(city, date, weather, temp)
                except Exception as err:
                    print(err)
        except Exception as err:
            print(err)

    def process(self, cities):
        """处理多个城市天气预报的方法,包括打开数据库、获取每个城市天气预报、关闭数据库"""
        self.db = WeatherDB()
        self.db.openDB()
        for city in cities:
            self.forecastCity(city)
        self.db.closeDB()

实验结果:


2)实验心得
通过对中国气象网的访问和数据抓取,我学会了如何使用urllib.request库发送请求并获取网页内容。同时,利用BeautifulSoup库对 HTML 页面进行解析,能够准确地提取出所需的天气预报信息。这个过程中,需要仔细分析网页结构,找到包含天气预报数据的特定标签和属性,以便准确地提取信息。

作业2
1)用 requests 和 BeautifulSoup 库方法定向爬取股票相关信息,并存储在数据库中。

"""股票数据爬取类"""
class StockCrawler:
    
    def __init__(self):
        """初始化方法,设置请求头信息"""
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.47',
            'cookie': 'qgqp_b_id=a7c5d47be8ad882fee56fc695bab498d; st_si=17803153105309; st_asi=delete; HAList=ty-0-300045-%u534E%u529B%u521B%u901A; st_pvi=56620321867132; st_sp=2023-10-07%2015%3A19%3A51; st_inirUrl=https%3A%2F%2Fwww.eastmoney.com%2F; st_sn=52; st_psi=20231007155656228-113200301321-9129123788'
        }

    def crawl_stocks(self):
        """爬取股票数据的方法"""
        # keypage 固定为 1
        keypage = 1
        searchlist = [keypage]
        for page in searchlist:
            response = requests.get(url=f'http://76.push2.eastmoney.com/api/qt/clist/get?cb=jQuery112405166990298085778_1696666115151&pn={page}&pz=20&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=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&_=1696666115152', headers=self.headers)
            data = response.text
            start = response.text.find('(')
            end = response.text.rfind(')')
            data = response.text[start + 1:end]
            data = json.loads(data)
            data = data['data']['diff']

            plist = ['f12', 'f14', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f15', 'f16', 'f17', 'f18', 'f10', 'f8', 'f9', 'f23']


    def process(self):
        """处理股票数据的方法,包括打开数据库、爬取数据、展示数据和关闭数据库"""
        self.db = StockDB()
        self.db.openDB()
        self.crawl_stocks()
        self.db.show()
        self.db.closeDB()

实验结果:


2)实验心得
使用requests库发送 HTTP 请求非常方便,可以轻松获取网页内容。结合BeautifulSoup库对返回的 HTML 进行解析,能够提取出所需的股票相关信息。在这个过程中,需要深入了解网页的结构和数据的组织方式,以便准确地定位和提取信息。通过分析股票网站的 API 返回值,我学会了如何根据需求调整请求参数,获取更有针对性的数据。

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

"""大学数据爬取类"""
class UniversityCrawler:
   
    def __init__(self):
        """初始化方法,设置爬取的 URL 和请求头信息"""
        self.url = 'https://www.shanghairanking.cn/_nuxt/static/1728872418/rankings/bcur/2020/payload.js'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36'
        }

    def crawl_universities(self):
        """爬取大学数据的方法"""
        response = requests.get(self.url, headers=self.headers).text
        # 使用正则表达式提取大学名称和分数信息
        name_pattern = r'univNameCn:"(.*?)"'
        score_pattern = r'score:(.*?),'
        name = re.findall(name_pattern, response, re.S)
        score = re.findall(score_pattern, response, re.S)
        universities_data = []
        for i in range(len(name)):
            try:
                score_value = float(score[i])
                # 将大学名称和分数组成元组添加到列表中
                universities_data.append((name[i], score_value))
            except ValueError:
                continue
        return universities_data

    def process(self):
        """处理大学数据的方法,包括打开数据库、爬取数据、插入数据、展示数据和关闭数据库"""
        self.db = UniversityDB()
        self.db.openDB()
        universities_data = self.crawl_universities()
        for uni_data in universities_data:
            self.db.insert(uni_data)
        self.db.show()
        self.db.closeDB()

实验结果:

浏览器F12调试分析的过程

2)实验心得
通过分析中国大学排名网站的发包情况和使用浏览器的 F12 调试工具,我学会了如何找到获取数据的 API,并理解了数据在网络传输中的形式。使用requests库发送请求并获取 API 返回的数据,然后利用BeautifulSoup库或其他数据解析工具对数据进行解析,提取出所需的大学信息。这个过程需要仔细观察网页的请求和响应,了解数据的结构和格式。

posted @ 2024-10-20 19:18  许煊宇  阅读(12)  评论(0编辑  收藏  举报