收款定制开发Python爬虫大作业+数据可视化分析(抓取python职位)

目录


一、获取数据

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

1.收款定制开发导入相关库

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

2、获取网页信息

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

  1. def main():
  2. 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="
  3. # 1.爬取网页
  4. datalist = getData(baseurl)
  5. savepath = "51job.xls"
  6. jobpath = "newjob.db"
  7. # 保存数据到表格
  8. saveData(datalist, savepath)
  9. # 保存数据到数据库
  10. saveData2DB(datalist, jobpath)
  11. # 爬取网页
  12. def getData(baseurl):
  13. datalist = []
  14. for page in range(0, 30):
  15. url1 = baseurl.format(page + 1)
  16. html = askURL(url1) # 保存获取到的网页源码
  17. # 2.逐一解析数据
  18. html_data = re.findall('window.__SEARCH_RESULT__ =(.*?)</script>', html, re.S)
  19. html_data = ''.join(html_data)
  20. infodict = json.loads(html_data) # 将str类型的数据转换为dict类型
  21. engine_jds = infodict['engine_jds']
  22. for item in engine_jds:
  23. data = []
  24. job_href = item["job_href"] # 工作链接
  25. name = item['job_name']
  26. temp1 = re.sub('\t', '', name)
  27. # 去掉括号中的内容,英文的括号要加反斜杠
  28. temp2 = re.sub('\(.*?\)', '', temp1)
  29. # 去掉括号中的内容,中文括号
  30. job_name = re.sub('(.*?)', '', temp2)
  31. job_company = item['company_name']
  32. job_salary1 = item['providesalary_text']
  33. if job_salary1:
  34. job_salary = get_avgsalary(job_salary1)
  35. else:
  36. job_salary = ""
  37. area = item["workarea_text"] # 工作地点
  38. newarea = re.findall('(.*?)-', area, re.S)
  39. job_area = ''.join(newarea)
  40. demand = item['attribute_text'][1:]
  41. job_requirements = ' '.join(demand)
  42. if job_requirements.find(' ') != -1:
  43. job_experience, job_education = job_requirements.split(' ')
  44. else:
  45. job_experience = job_requirements
  46. job_fuli = item['jobwelf'] if item['jobwelf'] else '无'
  47. if job_salary == "" or job_area == "" or job_education == "":
  48. continue
  49. else:
  50. data.append(job_href)
  51. data.append(job_name)
  52. data.append(job_company)
  53. data.append(job_salary)
  54. data.append(job_area)
  55. # data.append(job_requirements)
  56. data.append(job_experience)
  57. data.append(job_education)
  58. data.append(job_fuli)
  59. datalist.append(data)
  60. # print(datalist)
  61. return datalist

3.数据清洗

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

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

4.爬取结果:

  二、保存数据

1.保存到excel中

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

结果显示:

2.保存到数据库中

  1. # 创建数据表 (表名为newjob)
  2. def init_job(jobpath):
  3. sql = '''
  4. create table newjob
  5. (
  6. id integer primary key autoincrement,
  7. job_href text,
  8. job_name varchar,
  9. job_company varchar,
  10. job_salary text ,
  11. job_area varchar ,
  12. job_experience text,
  13. job_education text,
  14. job_fuli text
  15. )
  16. '''
  17. conn = sqlite3.connect(jobpath)
  18. cursor = conn.cursor()
  19. cursor.execute(sql)
  20. conn.commit()
  21. conn.close()
  22. #将数据保存到数据库中
  23. def saveData2DB(datalist, jobpath):
  24. init_job(jobpath)
  25. conn = sqlite3.connect(jobpath)
  26. cur = conn.cursor()
  27. for data in datalist:
  28. for index in range(len(data)):
  29. data[index] = '"' + str(data[index]) + '"'
  30. sql = '''
  31. insert into newjob (
  32. job_href,job_name,job_company,job_salary,job_area,job_experience,job_education,job_fuli)
  33. values(%s)''' % ",".join(data)
  34. # print(sql)
  35. cur.execute(sql)
  36. conn.commit()
  37. cur.close()
  38. conn.close()

 3.调用

在main函数中

  1. # 保存数据到表格
  2. saveData(datalist, savepath)
  3. # 保存数据到数据库
  4. saveData2DB(datalist, jobpath)

三、使用flask,实现

1.主函数

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

  1. import jieba # 分词作用
  2. from matplotlib import pyplot as plt # 绘图作用,数据可视化
  3. from wordcloud import WordCloud # 词云
  4. from PIL import Image # 图片处理
  5. import numpy as np # 矩阵运算
  6. import sqlite3 # 数据库
  7. # 准备词云所需要的词
  8. con = sqlite3.connect("newjob.db")
  9. cur = con.cursor()
  10. sql = "select job_name from newjob"
  11. data = cur.execute(sql)
  12. test = ""
  13. for item in data:
  14. test = test + item[0]
  15. # print(test)
  16. cur.close()
  17. con.close()
  18. # 分词
  19. cut = jieba.cut(test)
  20. string = " ".join(cut)
  21. print(len(string))
  22. img = Image.open(r'static\assets\img\demo.png') # 打开图片
  23. img_array = np.array(img) # 将图片转化为二维数组
  24. wc = WordCloud(
  25. background_color="white",
  26. mask=img_array,
  27. font_path="msyh.ttc" # 字体所在位置 c:\windows\fonts
  28. )
  29. wc.generate_from_text(string)
  30. # 绘制图片
  31. fip = plt.figure(1)
  32. plt.imshow(wc)
  33. plt.axis("off") # 是否显示坐标轴
  34. # plt.show() #显示生成的词云图片
  35. #输出词云图片到文件
  36. plt.savefig(r'static\assets\img\demo1.jpg')

2.可视化界面:

2.1职位信息展示+分页

2.2使用echars制作图标 

2.3导入地图 

 2.4制作词云

  1. import jieba # 分词作用
  2. from matplotlib import pyplot as plt # 绘图作用,数据可视化
  3. from wordcloud import WordCloud # 词云
  4. from PIL import Image # 图片处理
  5. import numpy as np # 矩阵运算
  6. import sqlite3 # 数据库
  7. # 准备词云所需要的词
  8. con = sqlite3.connect("newjob.db")
  9. cur = con.cursor()
  10. sql = "select job_name from newjob"
  11. data = cur.execute(sql)
  12. test = ""
  13. for item in data:
  14. test = test + item[0]
  15. # print(test)
  16. cur.close()
  17. con.close()
  18. # 分词
  19. cut = jieba.cut(test)
  20. string = " ".join(cut)
  21. print(len(string))
  22. img = Image.open(r'static\assets\img\demo.png') # 打开图片
  23. img_array = np.array(img) # 将图片转化为二维数组
  24. wc = WordCloud(
  25. background_color="white",
  26. mask=img_array,
  27. font_path="msyh.ttc" # 字体所在位置 c:\windows\fonts
  28. )
  29. wc.generate_from_text(string)
  30. # 绘制图片
  31. fip = plt.figure(1)
  32. plt.imshow(wc)
  33. plt.axis("off") # 是否显示坐标轴
  34. # plt.show() #显示生成的词云图片
  35. #输出词云图片到文件
  36. plt.savefig(r'static\assets\img\demo1.jpg')

 三.总结

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

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发