Python爬虫大作业+数据可视化分析(抓取python职位)

目录

一、抓取并解析数据

1.导入相关库

2、获取网页信息

3.数据清洗

4.爬取结果:

  二、保存数据

1.保存到excel中

2.保存到数据库中

 3.调用

三、使用flask,实现可视化

1.主函数

2.可视化界面:

2.1职位信息展示+分页

2.2使用echars制作图标 

2.3导入地图 

 2.4制作词云

 三.总结


一、获取数据

运用正则表达式,找到相对应的数据,然后对数据进行清洗,最后保存数据,保存为excel文件和保存到数据库中。(这里用的是sqlite数据库)

1.导入相关库

import re  # 正则表达式,进行文字匹配
from urllib.request import Request
from urllib.request import urlopen  # 制定URL,获取网页数据
from urllib.error import URLError as error
import json
import xlwt
import sqlite3

2、获取网页信息

爬取到的信息是很多,需要用正则表达式进行匹配,一个工作岗位有:8个属性,我只爬取职位名称、公司名称、公司链接、工资、工作地点、是否是实习、员工待遇。

def main():
    baseurl = "https://search.51job.com/list/000000,000000,0000,00,9,99,python,2,{}.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="
    # 1.爬取网页
    datalist = getData(baseurl)
    savepath = "51job.xls"
    jobpath = "newjob.db"
    # 保存数据到表格
    saveData(datalist, savepath)
    # 保存数据到数据库
    saveData2DB(datalist, jobpath)


# 爬取网页
def getData(baseurl):
    datalist = []
    for page in range(0, 30):
        url1 = baseurl.format(page + 1)
        html = askURL(url1)  # 保存获取到的网页源码
        # 2.逐一解析数据
        html_data = re.findall('window.__SEARCH_RESULT__ =(.*?)</script>', html, re.S)
        html_data = ''.join(html_data)
        infodict = json.loads(html_data)  # 将str类型的数据转换为dict类型
        engine_jds = infodict['engine_jds']
        for item in engine_jds:
            data = []
            job_href = item["job_href"]  # 工作链接
            name = item['job_name']

            temp1 = re.sub('\t', '', name)
            # 去掉括号中的内容,英文的括号要加反斜杠
            temp2 = re.sub('\(.*?\)', '', temp1)
            # 去掉括号中的内容,中文括号
            job_name = re.sub('(.*?)', '', temp2)

            job_company = item['company_name']
            job_salary1 = item['providesalary_text']
            if job_salary1:
                job_salary = get_avgsalary(job_salary1)
            else:
                job_salary = ""
            area = item["workarea_text"]  # 工作地点
            newarea = re.findall('(.*?)-', area, re.S)
            job_area = ''.join(newarea)
            demand = item['attribute_text'][1:]
            job_requirements = ' '.join(demand)
            if job_requirements.find(' ') != -1:
                job_experience, job_education = job_requirements.split(' ')
            else:
                job_experience = job_requirements
            job_fuli = item['jobwelf'] if item['jobwelf'] else '无'
            if job_salary == "" or job_area == "" or job_education == "":
                continue
            else:
                data.append(job_href)
                data.append(job_name)
                data.append(job_company)
                data.append(job_salary)
                data.append(job_area)
                # data.append(job_requirements)
                data.append(job_experience)
                data.append(job_education)
                data.append(job_fuli)
                datalist.append(data)
        # print(datalist)
    return datalist

3.数据清洗

主要对薪资进行清洗,统一以万/月为单位,并取区间平均值。

# 对薪资进行数据清洗
def get_avgsalary(salary):
    global avg_salary
    if '-' in salary:  # 针对10-20千/月或者10-20万/年的情况,包含-
        low_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0]
        high_salary = re.findall(re.compile('(\d?\.?\d+)'), salary)[1]
        avg_salary = (float(low_salary) + float(high_salary)) / 2
        avg_salary = ('%.2f' % avg_salary)
        if u'万' in salary and u'年' in salary:  # 单位统一成万/月的形式
            avg_salary = float(avg_salary) / 12
            avg_salary = ('%.2f' % avg_salary)  # 保留两位小数
        elif u'千' in salary and u'月' in salary:
            avg_salary = float(avg_salary) / 10
    else:  # 针对20万以上/年和100元/天这种情况,不包含-,取最低工资,没有最高工资
        avg_salary = re.findall(re.compile('(\d*\.?\d+)'), salary)[0]
        if u'万' in salary and u'年' in salary:  # 单位统一成万/月的形式
            avg_salary = float(avg_salary) / 12
            avg_salary = ('%.2f' % avg_salary)
        elif u'千' in salary and u'月' in salary:
            avg_salary = float(avg_salary) / 10
        elif u'元' in salary and u'天' in salary:
            avg_salary = float(avg_salary) / 10000 * 21  # 每月工作日21天

    avg_salary = str(avg_salary) + '万/月'  # 统一薪资格式
    return avg_salary

4.爬取结果:

  二、保存数据

1.保存到excel中

def saveData(datalist, savepath):
    print("sava....")
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建work对象
    sheet = book.add_sheet('python', cell_overwrite_ok=True)  # 创建工作表
    col = ("工作链接", "工作名称", "公司", "薪资", "工作地区", "工作经验", "学历", "员工福利")
    for i in range(0, 8):
        sheet.write(0, i, col[i])  # 列名
    for i in range(0, 1000):
        # print("第%d条" %(i+1))
        data = datalist[i]
        for j in range(0, 8):
            sheet.write(i + 1, j, data[j])  # 数据

    book.save(savepath)  # 保存数据

结果显示:

2.保存到数据库中

# 创建数据表 (表名为newjob)
def init_job(jobpath):
    sql = '''
        create table newjob
        (
        id integer primary key autoincrement,
        job_href text,
        job_name varchar,
        job_company varchar,
        job_salary text ,
        job_area varchar ,
        job_experience text,
        job_education text,
        job_fuli text
        )

    '''  
    conn = sqlite3.connect(jobpath)
    cursor = conn.cursor()
    cursor.execute(sql)
    conn.commit()
    conn.close()

#将数据保存到数据库中
def saveData2DB(datalist, jobpath):
    init_job(jobpath)
    conn = sqlite3.connect(jobpath)
    cur = conn.cursor()

    for data in datalist:
        for index in range(len(data)):
            data[index] = '"' + str(data[index]) + '"'
        sql = '''
                insert into newjob (
                job_href,job_name,job_company,job_salary,job_area,job_experience,job_education,job_fuli) 
                values(%s)''' % ",".join(data)
        # print(sql)
        cur.execute(sql)
        conn.commit()
    cur.close()
    conn.close()

 3.调用

在main函数中

    # 保存数据到表格
    saveData(datalist, savepath)
    # 保存数据到数据库
    saveData2DB(datalist, jobpath)

三、使用flask,实现可视化

1.主函数

实现绘图、分词、连接数据库导入数据、制作词语等

import jieba  # 分词作用
from matplotlib import pyplot as plt  # 绘图作用,数据可视化
from wordcloud import WordCloud  # 词云
from PIL import Image  # 图片处理
import numpy as np  # 矩阵运算
import sqlite3  # 数据库

# 准备词云所需要的词
con = sqlite3.connect("newjob.db")
cur = con.cursor()
sql = "select job_name from newjob"
data = cur.execute(sql)
test = ""
for item in data:
    test = test + item[0]
# print(test)
cur.close()
con.close()

# 分词
cut = jieba.cut(test)
string = " ".join(cut)
print(len(string))

img = Image.open(r'static\assets\img\demo.png')  # 打开图片
img_array = np.array(img)  # 将图片转化为二维数组
wc = WordCloud(
    background_color="white",
    mask=img_array,
    font_path="msyh.ttc"  # 字体所在位置  c:\windows\fonts
)
wc.generate_from_text(string)

# 绘制图片
fip = plt.figure(1)
plt.imshow(wc)
plt.axis("off")  # 是否显示坐标轴
# plt.show()  #显示生成的词云图片

#输出词云图片到文件
plt.savefig(r'static\assets\img\demo1.jpg')

2.可视化界面:

2.1职位信息展示+分页

2.2使用echars制作图标 

2.3导入地图 

 2.4制作词云

import jieba  # 分词作用
from matplotlib import pyplot as plt  # 绘图作用,数据可视化
from wordcloud import WordCloud  # 词云
from PIL import Image  # 图片处理
import numpy as np  # 矩阵运算
import sqlite3  # 数据库

# 准备词云所需要的词
con = sqlite3.connect("newjob.db")
cur = con.cursor()
sql = "select job_name from newjob"
data = cur.execute(sql)
test = ""
for item in data:
    test = test + item[0]
# print(test)
cur.close()
con.close()

# 分词
cut = jieba.cut(test)
string = " ".join(cut)
print(len(string))

img = Image.open(r'static\assets\img\demo.png')  # 打开图片
img_array = np.array(img)  # 将图片转化为二维数组
wc = WordCloud(
    background_color="white",
    mask=img_array,
    font_path="msyh.ttc"  # 字体所在位置  c:\windows\fonts
)
wc.generate_from_text(string)

# 绘制图片
fip = plt.figure(1)
plt.imshow(wc)
plt.axis("off")  # 是否显示坐标轴
# plt.show()  #显示生成的词云图片

#输出词云图片到文件
plt.savefig(r'static\assets\img\demo1.jpg')

 三.总结

第一次写项目总结,笔记还不太完善,只是做了一个很简单的框架,简单记录一下!(需要完整项目工程文件,可以私信或留言)

  • 67
    点赞
  • 596
    收藏
    觉得还不错? 一键收藏
  • 111
    评论
### 回答1: Python 爬虫获取的数据可以通过数据可视化技术进行展示,常用的数据可视化库有 Matplotlib、Seaborn、Plotly 等。使用这些库可以绘制各种图表,如柱状图、折线图、散点图、饼图、热力图等,使数据更加直观易懂。 例如,使用 Matplotlib 绘制柱状图可以使用以下代码: ``` python import matplotlib.pyplot as plt # 数据 x = ['A', 'B', 'C', 'D', 'E'] y = [20, 35, 30, 25, 40] # 绘制柱状图 plt.bar(x, y) # 设置图表标题和坐标轴标签 plt.title('Sales') plt.xlabel('Product') plt.ylabel('Amount') # 显示图表 plt.show() ``` 使用该代码可以绘制出一张柱状图,横轴为产品名称,纵轴为销售额。 ### 回答2: Python爬虫是一种用于从网页上自动提取数据的技术,而数据可视化是将这些提取的数据通过图表、图形等方式展示出来,使得数据更具有直观性和易读性。 使用Python爬虫可以获取各种类型的数据,例如股票行情、天气预报、新闻资讯等。而通过数据可视化,可以将这些数据以直观的方式展示出来,帮助用户更好地理解数据,发现数据中的规律和趋势。 Python中有许多数据可视化的库可以使用,例如Matplotlib、Seaborn和Plotly等。这些库提供了各种绘图函数和工具,能够快速生成各种类型的图表和图形,如折线图、柱状图、散点图、饼图等。 在数据爬取后,我们可以使用Python爬虫库中的数据处理工具,对数据进行清洗和整理,然后传递给数据可视化库进行绘图。可以根据数据的特点选择合适的图表类型,例如使用折线图展示股票的走势,使用柱状图比较不同城市的人口数量等。 通过数据可视化,我们可以更好地理解数据,从而发现数据中的规律和趋势,为决策和分析提供科学依据。此外,通过将数据以图表和图形的形式展示出来,还可以使得数据更具有说服力和易读性,方便与他人进行共享和交流。 总之,Python爬虫数据可视化是将通过Python爬虫获取的数据通过合适的图表和图形展示出来,帮助用户更好地理解数据和发现数据中的规律。这为决策和分析提供了科学依据,并提升了数据的可读性和说服力。 ### 回答3: Python爬虫数据可视化是指使用Python编写爬虫程序,从互联网上抓取所需数据,并利用数据可视化工具对抓取到的数据进行可视化展示。 爬虫是一种自动化的数据采集技术,利用它可以在网页上获取各种形式的数据,如文本、图片、音频、视频等。Python是一种功能强大、易学易用的编程语言,通过Python编写爬虫程序可以更高效地提取所需数据。 数据可视化是将抓取到的数据通过图表、图形、地图等形式进行可视化展示的一种方式。Python中有许多强大的数据可视化工具,比如Matplotlib、Seaborn、Plotly等,它们可以帮助我们将数据变得更加易于理解和分析。 使用Python爬虫进行数据可视化有很多应用场景。比如,在金融领域,我们可以利用爬虫抓取股票市场数据,并通过可视化工具绘制出K线图、趋势图等,帮助投资者进行股票分析与决策;在新闻媒体领域,我们可以通过爬虫获取新闻数据,并通过可视化展示出新闻热点、舆情分布等,帮助新闻编辑做出更好的报道策略。 总之,Python爬虫数据可视化是一个非常有用的技术,可以帮助我们更好地理解和分析抓取到的数据,提高数据分析的效率和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 111
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值