第一部分(数据获取)
1.数据库表创建
首先通过python的sqlalchemy模块,来新建一个表。
creat_tables.py(配置好自己的数据库连接和密码)
from sqlalchemy import create_engine, Integer,String,Floatfrom sqlalchemy.orm import sessionmakerfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column#创建数据库的连接engine = create_engine("mysql+pymysql://root:123456@localhost:3306/spiders?charset=utf8mb4")#操作数据库,需要我们创建一个sessionSession = sessionmaker(bind=engine)#声明一个基类Base = declarative_base()class tencenttables(Base):##表名称__tablename__ = 'job51_data2'#岗位,设置为主键id = Column(Integer,primary_key=True,autoincrement=True)# 岗位名称positionName = Column(String(length=50), nullable=False)# 工作年限workYear = Column(String(length=200), nullable=False)# 公司名字companyFullName = Column(String(length=200),nullable=False)# 学历education = Column(String(length=200), nullable=False)# 城市city = Column(String(length=10), nullable=True)# 业务方向industryField = Column(String(length=300), nullable=True)# 薪资salary = Column(String(length=200), nullable=False)# 公司福利标签companyLabelList = Column(String(length=200), nullable=True)# 公司规模companySize = Column(String(length=30), nullable=True)# 公司类型financeStage = Column(String(length=300), nullable=True)# 公司详情页url_href = Column(String(length=100),nullable=False)# 抓取日期crawl_date = Column(String(length=200), nullable=False)if __name__ == '__main__':#创建数据表tencenttables.metadata.create_all(engine)
首先在mysql里面新建spiders数据库,然后运行查看查看已经创建好的字段
2.数据爬取入库
爬取思路,通过selenium自动化模拟人工浏览网站,下载html然后通过解析数据插入到数据库中
以下是爬取代码(小部分):
for page in range(1,20):print(f'=======正在爬取第{page}页数据内容=======')time.sleep(5)url = f'/list/000000,000000,0000,00,9,99,python,2,{page}.html'response = requests.get(url=url,headers=headers)##获取数据print(response.text)##解析数据html_data = re.findall('window.__SEARCH_RESULT__ = (.*?)</script>',response.text)[0]print(html_data)json_data = json.loads(html_data)engine_jds = json_data['engine_jds']print(engine_jds)item = {}
爬取成功后查看数据库
3.数据存储与查询
思路:利用session对象的query方法,可以过滤查询想要的数据。
session.query(Lagoutables.workYear).filter(Lagoutables.crawl_date==self.date).all()
........def query_salary_result(self):info = {}# 查询今日抓取到的薪资数据result = self.mysql_session.query(tencenttables.salary).filter(tencenttables.crawl_date==self.date).all()# 处理原始数据result_list1 = [x[0] for x in result]# 计数,并返回# print(result_list1)result_list2 = [x for x in Counter(result_list1).items() if x[1]>1]result = [{"name": x[0], "value": x[1]} for x in result_list2]name_list = [name['name'] for name in result]info['x_name'] = name_listinfo['data'] = resultreturn info........
第二部分(前端展示)
简单查看一下前端代码结构:
第三部分(flask web应用)
使用flask将index.html转化为web应用
run.py
from flask import Flask, render_template, jsonifyfrom lagou_spider.handle_insert_data import lagou_mysql# 实例化flaskapp = Flask(__name__)# 注册路由# @app.route("/")# def index():#return "Hello World"@app.route("/get_echart_data")def get_echart_data():info = {}# 行业发布数量分析info['echart_1'] = lagou_mysql.query_industryfield_result()# print(info['echart_1'] )# 薪资发布数量分析info['echart_2'] = lagou_mysql.query_salary_result()# 岗位数量分析,折线图info['echart_4'] = lagou_mysql.query_job_result()#工作年限分析info['echart_5'] = lagou_mysql.query_workyear_result()#学历情况分析info['echart_6'] = lagou_mysql.query_education_result()#融资情况info['echart_31'] = lagou_mysql.query_financestage_result()#公司规模info['echart_32'] = lagou_mysql.query_companysize_result()#岗位要求info['echart_33'] = lagou_mysql.query_jobNature_result()#各地区发布岗位数info['map'] = lagou_mysql.query_city_result()return jsonify(info)@app.route("/",methods=['GET','POST'])def lagou():# 库内数据总量,今日抓取量result = lagou_mysql.count_result()return render_template('index.html',result=result)if __name__ == '__main__':# 启动flaskapp.run()
思路:
(1)首先需要通过编写JS文件,将几个图的数据放在一个方法里提高聚合,抽取出来提高可复用性。
(2)然后通过拼接把获取到的JSON格式的数据,按key:balue格式分配出来。
代码如下:
利用Ajax通信
运行run.py后查看5000端口:
本案例代码已经同步到码云,有需要的联系qq2434013294获取,不免费