精华内容
下载资源
问答
  • 网络爬虫大作业
    千次阅读
    2022-01-21 15:48:39

    题目:天气数据的爬取和统计

    大作业题目思路引导:定时爬取每个地级市的实时天气状况、存入excel中、为每个城市生成html展示、历史excel文件以每日为单位归档到文件夹中。

    考察点:爬虫+文件读写+目录操作+pandas

    网址:首页

    每个地市(找数据接口):1.从网站上寻找所有的地市列表-->地市编码;2.根据地市编号,爬取该地的实时天气;

     

    '''
    大作业题目思路引导:
    题目1:定时爬取每个地级市的实时天气状况、存入excel中、为每个城市生成html展示、历史excel文件以每日为单位归档到文件夹中。
    考察点:爬虫+文件读写+目录操作+pandas
    网址:http://www.weather.com.cn/
    
    每个地市:
    1.从网站上寻找所有的地市列表-->地市编码(beautifulsoup解析页面)或(找数据接口)
    2.根据地市编号,爬取该地的实时天气(beautifulsoup解析页面)或(找数据接口)
    
    省份没什么用,我们只需要地级市的信息。
    '''
    from apscheduler.schedulers.background import BackgroundScheduler
    from apscheduler.schedulers.blocking import BlockingScheduler
    from datetime import datetime
    import requests as req
    import pandas as pd
    import threading
    import schedule
    import logging
    import json
    import time
    import os
    
    hds = {  # 全局变量:伪装为浏览器
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
    
    
    # demo1:获取所有地市信息(k:名、v:编码,放入dict中)
    def getAllCityInformation():
        # hds = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
        resp = req.get('https://j.i8tq.com/weather2020/search/city.js', headers=hds)
        ct = resp.content.decode('utf-8')
        ct = ct[ct.index('=') + 1:];  # dict格式的str->字符串切割,保留=后面的内容
        info = json.loads(ct);  # str转dict
        # print(info)
        # print(type(info))  # <class 'dict'>
        cityinfo = {};  # k:城市名、v:城市编码,将信息存储到dict中
        topcity = ['北京', '天津', '上海', '重庆'];  # 单独列出直辖市
        # 遍历字典
        for province, cities in info.items():  # 最外层:省份(所有省份)与直辖市(地级市)
            for cityname, areas in cities.items():  # 城市名与直辖市、遍历所有地级市
                # print(cityname)  # 北京、上海、天津、重庆、哈尔滨、齐齐哈尔、郑州、商丘...
                # print(areas[cityname]['AREAID'])  # 101010100、101020100...
                if cityname in topcity:  # 若是4个直辖市之一,拉取所有的数据【存储键值对-城市名:城市编码】
                    for k, v in areas.items():
                        cityinfo[k] = v['AREAID'];
                else:
                    cityinfo[cityname] = areas[cityname]['AREAID'];
        # print(len(cityinfo))  # 441
        # print(cityinfo)  # {'北京': '101010100', '海淀': '101010200', '朝阳': '101071201', '顺义': '101010400', '怀柔': '101010500', '通州': '101010600',
        return cityinfo;
    
    
    # demo2:根据城市编码爬取实时天气
    # '绍兴': '101210507', '台州': '101210601', '温州': '101210701'
    def loadWeather(cityname, code):
        # hds = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'}
        hds['Referer'] = 'http://www.weather.com.cn/';
        resp = req.get('http://d1.weather.com.cn/sk_2d/{}.html'.format(code), headers=hds)
        ct = resp.content.decode('utf-8')
        ct = json.loads(ct[ct.index('=') + 1:])
        # print(ct)  # {'nameen': 'shaoxing', 'cityname': '绍兴', 'city': '101210507', 'temp': '16', 'tempf': '60', 'WD': '东风', 'wde': 'E', 'WS': '1级', 'wse': '2km/h', 'SD': '48%', 'sd': '48%', 'qy': '1021', 'njd': '7km', 'time': '16:00', 'rain': '0', 'rain24h': '0', 'aqi': '84', 'aqi_pm25': '84', 'weather': '晴', 'weathere': 'Sunny', 'weathercode': 'd00', 'limitnumber': '', 'date': '01月19日(星期三)'}
        # print(cityname, ':')  # 1、城市名称
        # print(ct['temp'])  # 2、温度
        # print(ct['SD'])  # 3、湿度
        # print(ct['WD'], ct['WS'])  # 4、风力
        # print(ct['aqi'])  # 5、PM2.5
        # print(cityname, ':', ct['temp'], '、', ct['SD'], '、', ct['WD'], '、', ct['WS'], '、', ct['aqi'])
        return [cityname, ct['temp'], ct['SD'], ct['WD'] + ct['WS'], ct['aqi']]
    
    
    # demo3:利用以下demo,就可以生成所有城市的html天气展示。
    def generateHTML(ls):
        # demo = ['北京', '-4', '64%', '东方一级', '87']
        root = r'C:\Users\lwx\Desktop\weather';
        f = open(os.path.join(root, 'weatherTemplate.html'), 'r', encoding='utf-8')
        temp = f.read();
        f.close()
    
        # 生成存放HTML的文件夹
        root_excel = r'C:\Users\lwx\Desktop\weather\实时天气HTML页面';
        detailTime = str(datetime.now())[:13]  # 2022-01-19 20:53:35
        detailTime = detailTime.replace(' ', '--').replace(':', '-') + '点';  # 2022-01-19--20点
        dir_detailedTime = os.path.join(root_excel, detailTime);  # 文件夹路径
        if not os.path.exists(dir_detailedTime):  # 文件夹是否存在
            os.mkdir(dir_detailedTime);  # 创建文件夹
        # print(dir_detailedTime)  # C:\Users\lwx\Desktop\weather\实时天气HTML页面\2022-01-19-21-04-52
    
        f = open(os.path.join(dir_detailedTime, ls[0] + '.html'), 'w', encoding='utf-8')  # 生成HTML页面
        content = temp.format(ls[0], ls[0], ls[1], ls[2], ls[3], ls[4])
        f.write(content)
        f.close()
        # print(ls[0], end="")
        # print("——动态生成HTML页面完毕!")
        # loadweather('绍兴', '101210507');
    
    
    # demo4:生成Excel文件。1.数据导入Excel;2.Excel文件的命名;3.文件夹的自动创建。
    # demo4:以时间日期命名文件夹并将数据存入Excel
    # 二维列表or字典 ——> DataFrame ——> Excel
    def outputDataToExcel(bigList):
        # print(bigList)
        df = pd.DataFrame(bigList, columns=['城市名称', '实时温度', '相对湿度', '风力', '空气质量AQI']);  # 行名称
        root_excel = r'C:\Users\lwx\Desktop\weather\Excel_归档';
        day = str(datetime.date(datetime.now()));
        # print(day)  # 2022-01-19
        time = str(datetime.time(datetime.now()))[:5].replace(":", "时") + '分';
        # print(time)  # 17时18分
        # 归档
        dir_day = os.path.join(root_excel, day);  # 文件夹路径
        if not os.path.exists(dir_day):  # 文件夹是否存在
            os.mkdir(dir_day);  # 创建文件夹
        time_file = os.path.join(dir_day, time + '.xls');  # 生成Excel文件
        df.to_excel(time_file, index=False);  # False去除最左边的一列
        print("Excel-Over!")
    
    
    def main():
        bigList = [];  # 存放所有城市的信息,最后统一再将数据输出到Excel中
        # 遍历所有的城市,count用来计数与测试
        count = 0;
        cityinfo = getAllCityInformation();  # 字典存储城市信息
        for k, v in cityinfo.items():
            w = loadWeather(k, v);  # 根据城市编码爬取实时天气,得到列表
            # print(w)  # 打印天气信息列表
            generateHTML(w);  # 为每个城市生成HTML页面
            # count += 1;  # 取前5个城市的信息进行测试
            # if count == 5:
            #     break;
            temp = w.copy();  # 复制list
            bigList.append(temp);  # 将list存到bigList中
        # print(bigList)  # [['北京', '-1', '40%南风', '2级', '72'], ['海淀', '-1', '41%南风', '2级', '73'], ['朝阳', '-10', '39%东北风', '3级', '28'], ['顺义', '-2', '38%南风', '2级', '85']]
        # for i in bigList:
        #     print(i)
        outputDataToExcel(bigList);  # 以时间日期命名文件夹并将数据存入Excel
    
    
    # main();  # 调用主函数
    
    # while True:
    # sched = BlockingScheduler();
    # sched = BackgroundScheduler(timezone='Asia/Shanghai')
    # sched.add_job(main, 'interval', seconds=180);  # 每xxx分钟执行一次:minutes=60、seconds=1
    # sched.start(); # sched._logger = logging;
    sched = BlockingScheduler(timezone='MST')
    sched.add_job(main, 'interval', seconds=180)  # 180秒后第一次执行
    sched.start()
    更多相关内容
  • Python期末作业
  • python网络应用开发大作业报告-中国排名定向爬虫网络应用开发课程大作业爬虫,应付作业,课程设计偷懒必备,有需要的小伙伴快来下载吧
  • 本文章介绍了一个Python大作业(课程设计)-网络爬虫程序,爬取“Bangumi-我看过的动画”,文章详细展示了程序功能及程序代码。

    简介

    此程序是本人大三时期的Python大作业,初学Python后所编写的一个程序,是一个网络爬虫程序,可爬取指定网站的信息。

    本程序爬取的网站是Bangumi-我看过的动画Bangumi是一个专注于二次元的收视进度管理网站,在这里可以记录自己看过的动画和书籍、玩过的游戏、听过的音乐等等,本程序爬取的正是作者本人看过的所有动画,读者若想爬取自己看过的动画,可下载程序后,自行修改源代码中的相应网址。

    本程序使用Python编写,使用PyCharm进行开发,数据库使用MySQL数据库,程序可将“Bangumi-我看过的动画”中的所有动画信息爬取下来,并保存至数据库和Excel表格中,亦可将爬取的网站html源码保存至本地,作者还编写了一个JavaWeb程序,用网页的形式展示爬取到的所有动画信息。

    程序源代码及程序设计说明书可在下方GitHub链接处进行下载,供各位需要的人学习参考。

    GitHub链接:Python爬虫-Bangumi



    程序代码

    在此展示Python爬虫的完整代码,代码不多做介绍,详细请看代码注释或程序设计说明书,若读者对JavaWeb展示爬取数据感兴趣,可至文章开头处GitHub链接下载程序,进行了解。

    import re
    import ssl
    import xlwt
    import pymysql
    import urllib.request
    import urllib.error
    from bs4 import BeautifulSoup
    
    
    # 主函数
    def main():
        print("开始爬取网站")
        ssl._create_default_https_context = ssl._create_unverified_context  #全局取消证书验证
        baseurl = "https://bangumi.tv/anime/list/430090/collect"  #要爬取的网站-Bangumi我看过的动画
        pagecount = getPageCount(baseurl)  #获取要爬取的页面总数
        datalist = getData(baseurl, pagecount)  #爬取网页,获取网页数据,并解析数据
        saveDataToDatabase(datalist)  #将数据保存至数据库
        saveDataToExcel(datalist)  #将数据保存至excel表格
        print("网站爬取成功,完毕!!!")
    
    
    # 获取HTML页面内容
    def getHTML(url):
        print("正在获取页面 "+url+" ......")
        headers = {  #反反爬虫,模拟浏览器头部信息
            "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
        }
        request = urllib.request.Request(url, headers=headers)
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        print("页面获取成功")
        return html
    
    
    # 保存HTML页面
    def saveHTML(html, page):
        print("正在保存页面"+str(page)+"......")
        fileobj = open("lib/html/page"+str(page)+".html", "w", encoding="utf-8")
        fileobj.write(html)
        fileobj.close()
        print("页面"+str(page)+"保存成功")
    
    
    # 获取要爬取的页面总数
    def getPageCount(baseurl):
        pagecount = 0  #页面总数
        html = getHTML(baseurl)
        print("正在获取页面总页数......")
        soup = BeautifulSoup(html, "html.parser")
        ul = soup.find("ul", id="browserItemList")
        li = ul.find("li")
        if li is None:  #若ul标签里无li标签,则表示页面总数为0,即我看过的动画为0
            pagecount = 0
        else:
            div = soup.find("div", id="multipage")
            span = div.find("span", class_="p_edge")  #页面过多的话,div标签里会有一个span标签,网站会将“当前页数/总页数”放在此span标签中
            if span is not None:  #若有span标签,则可以直接获取页面总数
                result = re.findall(r'[0-9]+', span.string)
                pagecount = int(result[1])
            else:  #若无span标签,则需通过a标签获取页面总数
                alist = div.find_all("a")
                if len(alist) != 0:  #若有a标签,则倒数第二个a标签的内容即为总页数
                    pagecount = int(alist[len(alist) - 2].string)
                else:  #若无a标签,则表示页面总数为1
                    pagecount = 1
        print("页面总数获取成功,页面总数为{}页".format(pagecount))
        return pagecount
    
    
    # 将网页中的链接由相对路径改为绝对路径,或修改不符合要求的链接
    def changeLink(html):
        print("正在修改相关链接......")
        soup = BeautifulSoup(html, "html.parser")
        # 获取所有a标签,对不符合要求的进行修改
        a_list = soup.find_all("a")
        for i in a_list:  #对链接为相对路径的a标签进行修改
            if 'href' in i.attrs and re.match(r'/[^\s]*', i['href']) is not None:
                i['href'] = "https://bangumi.tv" + i['href']
        # 获取所有link标签,对不符合要求的进行修改
        link_list = soup.find_all("link")
        for i in link_list:  #对链接为相对路径的link标签进行修改
            if 'href' in i.attrs and re.match(r'/[^\s]*', i['href']) is not None:
                i['href'] = "https://bangumi.tv" + i['href']
        # 获取所有script标签,对不符合要求的进行修改
        script_list = soup.find_all("script")
        for i in script_list:  #对链接为相对路径的script标签进行修改
            if 'src' in i.attrs and re.match(r'/[^\s]*', i['src']) is not None:
                i['src'] = "https://bangumi.tv" + i['src']
        # 获取所有form标签,对不符合要求的进行修改
        form_list = soup.find_all("form")
        for i in form_list:  #对链接为相对路径的form标签进行修改
            if 'action' in i.attrs and re.match(r'/[^\s]*', i['action']) is not None:
                i['action'] = "https://bangumi.tv" + i['action']
        # 获取所有img标签,对不符合要求的进行修改
        img_list = soup.find_all("img")
        for i in img_list:  #为img标签的图片链接加上https:前缀
            if 'src' in i.attrs and re.match(r'//[^\s]*', i['src']) is not None:
                i['src'] = "https:" + i['src']
        # 发生未知错误,无法正确爬取获取该动画的img标签的src属性,实属无奈,故手动显式修改
        if soup.find("li", id="item_7157") is not None:
            img = soup.find("li", id="item_7157").find("img")
            img['src'] = "https://lain.bgm.tv/pic/cover/s/6e/01/7157_QV8Rz.jpg"
        # 特殊情况,为我的头像的图片链接加上https:前缀
        span = soup.find("span", class_="avatarNeue avatarSize75")
        span['style'] = re.sub(r'//[^\s]*', "https:" + re.search(r'//[^\s]*', span['style']).group(), span['style'])
        # 特殊情况,修改特定a标签链接
        div = soup.find("div", id="robot_speech")
        a = div.find("a", class_="nav")
        a['href'] = "https://bangumi.tv/" + a['href']
        print("相关链接修改成功")
        return soup.prettify()
    
    
    # 将网页改为本地,相关依赖使用本地资源,无需联网即可访问............ 暂不考虑实现
    def toLocal():
        pass
    
    
    # 爬取网页,获取网页数据,并解析数据
    def getData(baseurl, pagecount):
        datalist = []  #二维列表,用于存放所有我看过的动画
        for i in range(1, pagecount+1):  #遍历所有页面,一个一个爬取
            url = baseurl + "?page=" + str(i)
            html = getHTML(url)  #获取HTML页面内容
            html = changeLink(html)  #修改相关链接
            saveHTML(html, i)  #保存HTML页面
            print("开始爬取解析页面"+str(i))
            soup = BeautifulSoup(html, "html.parser")
            all_animation = soup.find("ul", id="browserItemList")  #该ul标签中存放了目标数据,即我看过的动画
            # 逐一解析数据
            for item in all_animation.find_all("li"):  #遍历一个个li标签,即遍历一部部我看过的动画,并获取数据
                data = []
                # 获取id
                idd = re.search(r'[0-9]+', item['id']).group()
                data.append(idd)
                print("正在解析动画(id:{})数据......".format(idd))
                # 获取中文名
                chinese_name = item.find("a", class_="l").string.strip()
                data.append(chinese_name)
                # 获取原名
                if item.find("small", class_="grey") is None:  #可能无原名
                    original_name = ""
                else:
                    original_name = item.find("small", class_="grey").string.strip()
                data.append(original_name)
                # 获取话数、放送开始时间、导演等人
                info = item.find("p", class_="info tip").string
                episodes = re.search(r'[0-9]+', info).group()
                if re.search(r'[\d]+年[\d]+月[\d]+日', info) is not None:  #有两种日期格式
                    broadcast_time = re.search(r'[\d]+年[\d]+月[\d]+日', info).group()
                    broadcast_time = re.sub(r'[^\d]+', "-", broadcast_time).strip("-")  #转换为xxxx-xx-xx的格式
                elif re.search(r'[\d]+-[\d]+-[\d]+', info) is not None:
                    broadcast_time = re.search(r'[\d]+-[\d]+-[\d]+', info).group()
                else:
                    broadcast_time = ""
                if re.search(r'日.+', info) is None:  #可能无导演等人
                    people = ""
                else:
                    people = re.search(r'日.+', info).group()
                    people = people[4:].strip()
                data.append(episodes)
                data.append(broadcast_time)
                data.append(people)
                # 获取收藏时间
                star_time = item.find("span", class_="tip_j").string.strip()
                data.append(star_time)
                # 获取个人评分
                score = item.find("span", class_="starlight")['class'][1]
                score = re.search(r'[0-9]+', score).group()
                data.append(score)
                # 获取个人标签
                if item.find("span", class_="tip") is None:  #可能无个人标签
                    tag = ""
                else:
                    tag = item.find("span", class_="tip").string
                    tag = tag.strip()[4:]
                data.append(tag)
                # 获取页面网址
                page_url = item.find("a", class_="l")['href']
                data.append(page_url)
                # 获取缩略封面图网址,并下载保存
                print("正在下载缩略封面图{}.jpg".format(idd))
                low_image_url = item.find("img", class_="cover")['src']
                data.append(low_image_url)
                low_image_path = "lib/image/low/" + idd + ".jpg"
                data.append(low_image_path)
                low_image_url = re.sub(r'lain.bgm', "bangumi", low_image_url)  #图片原链接不允许爬取下载,故需转换下链接
                urllib.request.urlretrieve(low_image_url, low_image_path)  #下载缩略封面图
                # 获取高清封面图网址,并下载保存
                print("正在下载高清封面图{}.jpg".format(idd))
                high_image_url = re.sub(r'/s/', "/l/", low_image_url)  #缩略图和高清图的网址仅有一字之差
                data.append(high_image_url)
                high_image_path = "lib/image/high/" + idd + ".jpg"
                data.append(high_image_path)
                #urllib.request.urlretrieve(high_image_url, high_image_path)  #下载高清封面图,文件较大且多,故很花时间
                datalist.append(data)
            print("页面{}爬取解析成功".format(str(i)))
        return datalist
    
    
    # 将数据保存至数据库
    def saveDataToDatabase(datalist):
        print("开始将数据保存至数据库")
        con = pymysql.connect(host="localhost", database="web_crawler", user="root", password="root")
        cur = con.cursor()
        sql = "insert into animation values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
        try:
            for data in datalist:
                print("正在保存动画(id:{})数据至数据库......".format(data[0]))
                cur.execute(sql, tuple(data))
            con.commit()
        except:
            con.rollback()  #发生错误时回滚
            print("数据保存失败")
        else:
            print("数据保存成功")
        cur.close()
        con.close()
    
    
    # 将数据保存至excel表格
    def saveDataToExcel(datalist):
        print("开始将数据保存至excel表")
        book = xlwt.Workbook(encoding="utf-8")  #创建一个workbook,并设置编码
        sheet = book.add_sheet("我看过的动画")
        colname = ("ID", "中文名", "原名", "话数", "放送开始时间", "导演/原作者/等制作人", "收藏时间", "个人评分", "个人标签", "页面网址", "缩略封面图网址", "缩略封面图本地路径", "高清封面图网址", "高清封面图本地路径")
        style = xlwt.easyxf('font: bold on')  #样式,为列名加粗
        for i in range(0, 14):  #添加列名
            sheet.write(0, i, colname[i], style)
        for i in range(0, len(datalist)):  #添加数据
            data = datalist[i]
            print("正在保存动画(id:{})数据至excel表......".format(data[0]))
            for j in range(0, 14):
                sheet.write(i + 1, j, data[j])
        book.save("lib/excel/Bangumi-我看过的动画.xls")  #保存excel表
        print("数据保存成功")
    
    
    if __name__ == "__main__":
        main()
    
    

    运行结果

    代码编写完成后运行程序,程序运行过程中会在控制台实时输出当前爬取进度
    控制台输出
    爬取完毕后,可看到成功导出html文件
    成功导出html文件
    成功下载封面图片
    成功下载封面图片
    信息成功保存至数据库
    成功保存至数据库
    成功保存至Excel表格
    成功保存至Excel表格
    最后JavaWeb程序也成功展示爬取的数据
    JavaWeb展示爬取数据

    后记

    本程序仅供学习和参考,请勿抄袭或另作他用。

    感谢观看,有什么问题可在下方评论区进行评论,若觉得本文章写得不错,还请点个赞呢。

    关注我,收看更多精彩!( • ̀ω•́ )✧求点赞、评论、收藏、关注

    展开全文
  • 基于python的网络爬虫爬取天气数据及可视化分析 python程序设计报告 源代码+csv文件+设计报告 python期末简单大作业(自己写的,重复率低) 利用python爬取了网站上的城市天气,并用利用可视化展示,有参考文献有...
  • python爬虫大作业

    千次阅读 2021-12-29 17:49:40
    Python爬虫大作业 一、大作业要求 结合所选专业方向(信息处理、嵌入式、人工智能、数据处理),用所学Python技术设计并实现一个与专业方向技术相关的、功能完整的系统,并撰写总结报告。 实现要求: (1)实现...

    Python爬虫大作业

    一、大作业要求

    结合所选专业方向(信息处理、嵌入式、人工智能、大数据处理),用所学Python技术设计并实现一个与专业方向技术相关的、功能完整的系统,并撰写总结报告。

    实现要求:
    (1)实现时必须涵盖以下技术:
    图形界面、
    多线程、
    文件操作、
    数据库编程、
    网页爬虫、
    异常处理。
    缺一不可。少一项则直接影响是否及格。
    同时还可结合具体系统功能,使用其它扩展库进行实现。如统计绘图、机器学习等。

    举例:
    A方向可侧重于应用系统,结合爬虫丰富系统功能,提升用户体验。
    B方向如果结合硬件有困难,可从上述方向中选择一个完成;否则可考虑实现物联网。
    C方向可侧重于爬取网站图片,并进行图形或图像识别。
    D方向可侧重于基于爬虫进行数据采集,并进行数据的统计分析。

    (2)系统要具有一定复杂度。应用系统的业务流程不能过于简单,数据库表不能少于5张表。爬取图片不能少于500张。采集数据不能少于1000条,统计分析的目标不能少于3个。

    (3)实现时要考虑模块化,不能将所有功能均在一个程序内实现。

    ♥♥♥下文以大数据D方向为例实现

    大作业报告要求~~
    (一)报告内容涵盖:
    (1)任务需求分析
    (2)设计方案(例如:设计用于数据采集的爬虫结构;存储数据方案,如数据库设计;数据分析方案,如从哪些角度分析采集到的数据)
    (3)实现细节(如界面实现、业务实现、爬虫实现、数据存储实现、分析实现等)
    (4)运行结果

    (二)报告格式要求:
    (1)正文小四字号,中文为宋体字体,英文数字均为Times New Roman字体。行间距18磅。每个段落首行缩进2字符。
    (2)各级标题四号黑体。
    (3)每个图要有标号和图名(例:图1 实现数据爬取的程序流程图),标号和图名在图下标识。每个表要有标号和表名(例:表1 Table表结构),标号和表名在表上方标注。
    (4)报告页数不能少于12页

    成绩评定标准:balabalabala

    二、设计方案

    1、设计对斗鱼主页进行爬虫,包括直播间封面,主播头像,直播分区。
    斗鱼主页https://www.douyu.com/directory/all
    斗鱼分区https://www.douyu.com/directory
    斗鱼热门视频https://v.douyu.com
    2、利用chromedriver.exe进行模拟手动翻页等操作(爬取安全但是速度特别慢 ),使用python3实现爬取数据,使用sqlite数据库进行数据存储,使用pandas模块进行数据分析,使用wxpython模块实现界面。
    三、作业软件选择
    win10系统,google浏览器,pycharm编译器,navicat数据库管理界面,sqlite数据库,python3.10,。
    四、作业实现成果
    共包含图形界面、多线程、文件操作、数据库编程、网页爬虫、统计分析并绘图(或数据挖掘)六项技术,

    共爬取1000余位主播信息。
    2000余张图片。
    代码在两个程序内实现。(一个图形实现界面,一个爬虫界面 )。
    建立五个sqlite分级表(有一个是master表不显示 )。
    从三个方向分析。
    图形界面
    在这里插入图片描述
    数据分析界面
    不同区块主播数量比例扇形图

    各个分区最高人气排行柱形图
    热度和订阅数量比例图
    引用文献:~~~~~~~~~~~~

    上述大作业报告下载链接:https://download.csdn.net/download/m0_57832412/72373924
    上述大作业报告+代码实现下载链接:
    https://download.csdn.net/download/m0_57832412/72374454
    上述代码完全可用,将谷歌驱动放在c盘代码即可运行

    有大量需求的,或者想要其他的报告可以私信获取,接受挑选但是无法接受定制
    价格和上述一致,量大可以略微打折

    展开全文
  • 爬虫大作业

    2019-09-26 07:08:03
    解决办法应该是安装Microsoft Visual C++ 14.0,但是文件比较,没有进行过尝试,所以使用方法二 执行二方法: 可以看到wordCloud已经安装到 中,如果在这之后没有在pycharm File-setting-proje-Project ...

    一、主题 :

              爬取博客园博问上160页每页25条帖子标题,利用jieba分词生成词云进行分析

    二、python爬取数据

            博问主页:https://q.cnblogs.com/list/unsolved?page=1 

            第二页:https://q.cnblogs.com/list/unsolved?page=2     以此类推……

            可得160页bkyUrl地址

    for i in range(1,161):
        bkyUrl = "https://q.cnblogs.com/list/unsolved?page={}".format(i)

         通过浏览器查看博问主页元素:

      观察可得在主体div类为.left_sidebar标签下有25个标签h2、h2标签内a标签文本即为各博问贴子标题

      因此可得getpagetitle函数获取每页25条博问贴子标题:

    def getpagetitle(bkyUrl):
        time.sleep(1)
        print(bkyUrl)
        res1 = requests.get(bkyUrl)  # 返回response对象
        res1.encoding = 'utf-8'
        soup1 = BeautifulSoup(res1.text, 'html.parser')
        item_list = soup1.select(".left_sidebar")[0]
        for i in item_list.select("h2"):
           title = i.select("a")[0].text

    将上述操作整合一起,获取160 * 25 条博问标题

    import requests
    import time
    
    from bs4 import BeautifulSoup
    
    def addtitle(title):
        f = open("F:/study/大三/大数据/title.txt","a",encoding='utf-8')
        f.write(title+"\n")
        f.close()
    
    def getpagetitle(bkyUrl):
        time.sleep(1)
        print(bkyUrl)
        res1 = requests.get(bkyUrl)  # 返回response对象
        res1.encoding = 'utf-8'
        soup1 = BeautifulSoup(res1.text, 'html.parser')
        item_list = soup1.select(".left_sidebar")[0]
        for i in item_list.select("h2"):
           title = i.select("a")[0].text
           addtitle(title)
    
    for i in range(160,161):
        bkyUrl = "https://q.cnblogs.com/list/unsolved?page={}".format(i)
        getpagetitle(bkyUrl)

    保存标题title.txt文本:

     三、生成词云:

    将文本中标题信息以string类型读取出来,利用jieba进行分词,去除一些标点符号和无用词(这里做的不够细致),生成字典countdict:

    def gettitle():
        f = open("F:/study/大三/大数据/title.txt","r",encoding='utf-8')
        return f.read()
    
    str1 = gettitle()
    stringList =list(jieba.cut(str1))
    delset = {"","","","","",""," ","","",""}
    stringset = set(stringList) - delset
    countdict = {}
    for i in stringset:
        countdict[i] = stringList.count(i)
    print(countdict)

    进行文本分析生词词云:

    from PIL import Image,ImageSequence
    import numpy as np
    import matplotlib.pyplot as plt
    from wordcloud import WordCloud,ImageColorGenerator
    graph = np.array(countdict)
    font = r'C:\Windows\Fonts\simhei.ttf'
    backgroud_Image = plt.imread("F:\study\大三\大数据\\background.jpg")
    wc = WordCloud(background_color='White',max_words=500,font_path=font, mask=backgroud_Image)
    wc.generate_from_frequencies(countdict)
    plt.imshow(wc)
    plt.axis("off")
    plt.show()

    这里使用background.jpg作为背景图:

     

    生成词云图如下:

     

    从词云图就能很直观的看出博问上锁提出问题大部分集中在数据库、python、C#和Java.

    四、爬取数据过程中遇到的问题:

    爬取标题数据信息的过程比较顺利,主要问题出现在wordCloud的安装过程中:

    安装worldCloud有两种方式:

    一是在pycharm中进入File-setting-proje-Project Interpreter、通过install worldCloud 安装包

    二是在

    https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 中下载对应python版本和window 32/64位版本

    我的python版本是3.6,win10 64位系统,所以下载

    这里把下载文件放在F盘

    cmd命令行进入对应wordcloud安装路径,我是放在F盘,所以进入F:

    输入 pip install  wordcloud‑1.4.1‑cp36‑cp36m‑win_amd64.whl  即可成功导入

     

    但是在执行方法一的时候总会出现这个错误提示:  

    解决办法应该是安装Microsoft Visual C++ 14.0,但是文件比较大,没有进行过尝试,所以使用方法二

    执行二方法:

    可以看到wordCloud已经安装到

    中,如果在这之后没有在pycharm File-setting-proje-Project Interpreter看到wordCloud包,就需要手动在上图路径中找到wordCloud,复制到C:\User\  -  \PycharmProjects\**\verv\lib 中即可,(**表示自己创建的项目名字)

     

     五、总结

        利用python爬取数据生成词云的过程还是很有趣的,本来想通过python爬取博客园各博主圆龄,但必须要登录博客园后才能进入各博主主页,目前所学还没办法做到以用户身份爬取数据,此后会继续学习研究~!!

     

    转载于:https://www.cnblogs.com/Ming-jay/p/8906596.html

    展开全文
  • [答案][南开大学]2021春《网络爬虫与信息提取》在线作业.doc[答案][南开大学]2021春《网络爬虫与信息提取》在线作业.doc[答案][南开大学]2021春《网络爬虫与信息提取》在线作业.doc[答案][南开大学]2021春《网络爬虫...
  • 网络爬虫作业练习
  • 爬虫综合大作业

    千次阅读 2020-12-04 10:46:44
    url :目标网页的 url 返回:目标网页的 html 内容 ''' # headers是为了把爬虫程序伪装成浏览器 headers = { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'...
  • 一、大作业要求 结合所选专业方向(信息处理、嵌入式、人工智能、数据处理),用所学Python技术设计并实现一个与专业方向技术相关的、功能完整的系统,并撰写总结报告。 实现要求: (1)实现涵盖以下技术: 图形...
  • 网络应用开发》股票数据爬虫大作业报告.doc 计算机专业,软件工程专业,通信工程大学生课程设计 自己大三的时候写的 适合大家做课程设计,写毕业设计也可以参考 基于爬虫的课程设计
  • 南开大学《网络爬虫技术》在线作业9.pdf南开大学《网络爬虫技术》在线作业9.pdf南开大学《网络爬虫技术》在线作业9.pdf南开大学《网络爬虫技术》在线作业9.pdf南开大学《网络爬虫技术》在线作业9.pdf南开大学《网络...
  • python网络应用开发大作业报告-中国排名定向爬虫网络应用开发课程大作业爬虫,应付作业,课程设计偷懒必备,有需要的小伙伴快来下载吧
  • 期末将近,python也要结课了,老师要求我们写一个关于爬虫的程序作为大作业单纯的爬虫自然没有意思,那我们肯定需要将爬取到的数据进行展示以及分析处理由于自己自学了数据库方面的内容,所以也尝试着将数据库结合到...
  • 这是一个使用爬虫实现的音乐播放软件,使用数据库实现登陆注册功能,并对爬取数据实现可视化分析
  • 实验作业7:设计一个网络爬虫的算法,动态获取全国新型冠状肺炎疫情。 实验作业8:提交一篇与实验作业7相对应的网络爬虫实验报告。
  • 21春学期《网络爬虫与信息提取》在线作业ABB.pdf
  • 南开20秋学期《网络爬虫与信息提取》在线作业参考答案.pdf南开20秋学期《网络爬虫与信息提取》在线作业参考答案.pdf南开20秋学期《网络爬虫与信息提取》在线作业参考答案.pdf南开20秋学期《网络爬虫与信息提取》在线...
  • # False去除最左边的一列 Process finished with exit code 0 ''' # demo4:以时间日期命名文件夹并将数据存入Excel 大作业题目思路引导: 题目1:定时爬取每个地级市的实时天气状况、存入excel中、为每个城市生成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,269
精华内容 3,307
关键字:

网络爬虫大作业