第一部分(数据获取)
1.数据库表创建
首先通过python的sqlalchemy模块,来新建一个表。
creat_tables.py(配置好自己的数据库连接和密码)
from sqlalchemy import create_engine, Integer,String,Float
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
#创建数据库的连接
engine = create_engine("mysql+pymysql://root:123456@localhost:3306/spiders?charset=utf8mb4")
#操作数据库,需要我们创建一个session
Session = 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'https://search.51job.com/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_list
info['data'] = result
return info
........
第二部分(前端展示)
简单查看一下前端代码结构:
第三部分(flask web应用)
使用flask将index.html转化为web应用
run.py
from flask import Flask, render_template, jsonify
from lagou_spider.handle_insert_data import lagou_mysql
# 实例化flask
app = 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__':
# 启动flask
app.run()
思路:
(1)首先需要通过编写JS文件,将几个图的数据放在一个方法里提高聚合,抽取出来提高可复用性。
(2)然后通过拼接把获取到的JSON格式的数据,按key:balue格式分配出来。
代码如下:
利用Ajax通信
运行run.py后查看5000端口:
本案例代码已经同步到码云,有需要的联系qq2434013294获取,不免费