**抓取58job, 赶集job以及智联招聘,并使用数据分析生成echarts图**
爬虫部分
爬虫部分使用scrapy-redis分布式爬虫,通过redis实现增量爬取以及去重,并将所有的数据直接保存到redis中,后续再做处理
github:https://github.com/AndrewAndrea/spider_work
代码已经提交到GitHub中,不是很完善,爬虫爬取的信息没有详情页的数据,只有赶集网的数据是详情页的。有点懒得写了。
可以自己把代码clone下来,在做完善。
抓取智联招聘的信息
这个很简单
抓取58同城的招聘信息
这个也很简单,我的代码只做了一个城市的抓取,可以做扩展
抓取赶集网的招聘信息
这个也简单。就不说了,也是一个城市的信息。
最后关于爬虫如何同时启动多个spider
如何将所有的爬虫的同时启动,这个我写一下,记录一下,避免以后给忘了。
首先,需要在爬虫文件新建一个commond包,在该目录下新建文件crawlall.py。
目录结构:
crawlall.py中的内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/5/6 16:31
# @Author : zhao.jia
# @Site :
# @File : crawlall.py
# @Software: PyCharm
from scrapy.commands import ScrapyCommand
class Command(ScrapyCommand):
requires_project = True
def syntax(self):
return '[options]'
def short_desc(self):
return 'Runs all of the spiders'
def run(self, args, opts):
spider_list = self.crawler_process.spiders.list()
for name in spider_list:
self.crawler_process.crawl(name, **opts.__dict__)
self.crawler_process.start()
更改settings.py
COMMANDS_MODULE = 'spider_work.command'
启动
scrapy crawlall
爬虫部分到此结束,单个如何启动大家也都知道。
可以扩张的地方很多,所以再补充几点:
1、详细的招聘信息的抓取
2、可以将代码直接改成通用爬虫
3、58job和赶集网的都是同城的,可以扩展到全国,写个配置文件,拼接URL就行。可以分别根据每个网站做关键词搜索爬虫,而不是单一使用智联的关键词。
4、增加异常处理
5、增加数据去重存到 redis 中
数据转换部分(可以忽略)
我是通过 MySQL 去做的,所以需要将 Redis 中的数据取出来存到 MySQL 中。
Redis 存储的类型是列表,所以有重复数据。redis 取数据采用 lpop 方法。通过给 MySQL 表中的字段加索引,来去重,插入语句使用 replace into 而不是 insert into。 可以去百度一下,看看博客。
process_item_mysql.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/4/29 23:15
# @Author : zhao.jia
# @Site :
# @File : process_item_mysql.py
# @Software: PyCharm
import pymysql
import redis
import json
def process_item(key):
Redis_conn = redis.StrictRedis(host='ip', port=6379, db=0, password='pass')
MySql_conn = pymysql.connect(host='ip', user='root', passwd='pass', port=3306, db='zhaopin')
cur = MySql_conn.cursor()
while True:
data = Redis_conn.lpop(key)
if data:
try:
data = json.loads(data.decode('unicode_escape'), strict=False)
except Exception as e:
process_item(key)
print(data)
try:
if '-' in data['city']:
city = data['city'].split('-')[0]
else:
city = data['city']
except Exception as e:
city = data['city']
lis = (
pymysql.escape_string(data['jobType']),
pymysql.escape_string(data['jobName']),
pymysql.escape_string(data['emplType']),
pymysql.escape_string(data['eduLevel']),
pymysql.escape_string(data['salary']),
pymysql.escape_string(data['companyName']),
pymysql.escape_string(city),
pymysql.escape_string(data['welfare']),
pymysql.escape_string(data['workingExp']))
sql = (
"replace into work(jobType, jobName, emplType, eduLevel, salary, companyName, city, welfare, workingExp) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % lis)
try:
cur.execute(sql)
MySql_conn.commit()
except Exception as e:
MySql_conn.rollback()
else:
break
cur.close()
MySql_conn.close()
if __name__ == "__main__":
key_list = ['job_spider:items', 'jobs58:items', 'jobsganjispider']
for i in range(3):
process_item(key_list[i])
可视化部分
可视化采用的flask+mysql+echarts
具体代码见我的GitHub,这里就不贴了。
贴一下几个图吧
web网站的整体图
搜索界面
学历要求
学历工资图
经验要求
词云图
完成
项目中可以扩展的部分很多,需要大家自己去写,不用再搭架子写简单的东西,web部分也可以扩展,包括页面以及echarts图,数据分析都可以继续扩展。
代码中有任何问题都可以留言,指正。一块学习!
代码会放在我GitHub上,关注后回复 ‘work’,即可获取
本文分享自 Python爬虫scrapy 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!