测试了下,采用单进程爬取5000条数据大概需要22分钟,速度太慢了点。我们把脚本改进下,采用多进程。

首先获取所有要爬取的URL,在这里不建议使用集合,字典或列表的数据类型来保存这些URL,因为数据量太大,太消耗内存,这里,python的生成器就发挥作用了。

def get_urls(total_page,cityname,jobname):
'''
获取需要爬取的URL以及部分职位信息
:param start: 开始的工作条数
:param cityname: 城市名
:param jobname: 工作名
:return: 字典
'''
for start in range(total_page):
url = r'https://fe-api.zhaopin.com/c/i/sou?start={}&pageSize=60&cityId={}&workExperience=-1&education=-1' \
r'&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw={}&kt=3'.format(start*60,cityname,jobname)
try:
rec = requests.get(url)
if rec.status_code == 200:
j = json.loads(rec.text)
results = j.get('data').get('results')
for job in results:
empltype = job.get('emplType') # 职位类型,全职or校园
if empltype=='全职':
positionURL = job.get('positionURL') # 职位链接
createDate = job.get('createDate') # 招聘信息创建时间
updateDate = job.get('updateDate') # 招聘信息更新时间
endDate = job.get('endDate') # 招聘信息截止时间
positionLabel = job.get('positionLabel')
if positionLabel:
jobLight_par = (re.search('"jobLight":\[(.*?|[\u4E00-\u9FA5]+)\]',job.get('positionLabel'))) # 职位亮点
jobLight = jobLight_par.group(1) if jobLight_par else None
else:
jobLight = None
yield {
'positionURL':positionURL,
'createDate':createDate,
'updateDate':updateDate,
'endDate':endDate,
'jobLight':jobLight
}
except Exception as e:
logger.error('get urls faild:%s', e)
return None

在使用多进程之前,有两个问题需要解决:

1、在爬取过程中,即需要把爬取完成的URL实时保存到old_url这个变量中,又要去查询要爬取的URL是否在这个old_url,那么就要使这个old_url的变量在多个进程之间共享数据。这里使用multiprocessing的Manager()方法

2、每个进程都要把爬取下来的数据保存到同一个CSV文件中,多个进程同时去修改一个CSV,当然会报异常。这里我们引入回调函数来解决整个问题

def mycallback(data):
if data:
csv_filename = data.pop('csv_filename')
with open(csv_filename,'a+',newline='',encoding='utf-8-sig') as f:
f_csv = csv.DictWriter(f,data.keys())
f_csv.writerow(data)

好了,解决上述两个问题后,就可以使用进程池Pool()来实现多进程了

if __name__=='__main__':
start_time = datetime.datetime.now()
logger.info('*' * 20 + "start running spider!" + '*' * 20)
old_url_l = load_progress('old_url.txt')
manager = Manager()
old_url = manager.list(old_url_l)
if not os.path.exists(output_path):
os.mkdir(output_path)
for jobname in job_names:
for cityname in city_names:
pool = Pool()
logger.info('*'*10+'start spider '+'jobname:'+jobname+'city:'+cityname+'*'*10)
total_page = get_page_nums(cityname,jobname)
csv_filename=output_path+'/{0}_{1}.csv'.format(jobname,cityname)
if not os.path.exists(csv_filename):
write_csv_headers(csv_filename)
urls = get_urls(total_page, cityname, jobname)
for url in urls:
pool.apply_async(get_job_info,args=(url,old_url,csv_filename),callback=mycallback)
pool.close()
pool.join()
logger.info('*'*10+'jobname:'+jobname+'city:'+cityname+' spider finished!'+'*'*10)
save_progress(set(old_url), 'old_url.txt')
end_time = datetime.datetime.now()
logger.info('*' * 20 + "spider finished!Running time:%s" % (end_time - start_time) + '*' * 20)
print("Running time:%s" % (end_time - start_time))

测试了下,我是4核电脑,爬取速度大概是单进程的3倍,智联招聘的反爬虫很弱,基本上不封IP。

所有代码都已经上传到github中,地址:https://github.com/Python3SpiderOrg/zhilianzhaopin

python爬取智联招聘职位信息(多进程)的更多相关文章

  1. python爬取智联招聘职位信息(单进程)

    我们先通过百度搜索智联招聘,进入智联招聘官网,一看,傻眼了,需要登录才能查看招聘信息 没办法,用账号登录进去,登录后的网页如下: 输入职位名称点击搜索,显示如下网页: 把这个URL:https://s ...

  2. 用Python爬取智联招聘信息做职业规划

    上学期在实验室发表时写了一个爬取智联招牌信息的爬虫. 操作流程大致分为:信息爬取——数据结构化——存入数据库——所需技能等分词统计——数据可视化 1.数据爬取 job = "通信工程师&qu ...

  3. python3爬虫抓取智联招聘职位信息代码

    上代码,有问题欢迎留言指出. # -*- coding: utf-8 -*- """ Created on Tue Aug 7 20:41:09 2018 @author ...

  4. 用python抓取智联招聘信息并存入excel

    用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...

  5. Python+selenium爬取智联招聘的职位信息

    整个爬虫是基于selenium和Python来运行的,运行需要的包 mysql,matplotlib,selenium 需要安装selenium火狐浏览器驱动,百度的搜寻. 整个爬虫是模块化组织的,不 ...

  6. 用生产者消费模型爬取智联招聘python岗位信息

    爬取python岗位智联招聘 这里爬取北京地区岗位招聘python岗位,并存入EXECEL文件内,代码如下: import json import xlwt import requests from ...

  7. node.js 89行爬虫爬取智联招聘信息

    写在前面的话, .......写个P,直接上效果图.附上源码地址  github/lonhon ok,正文开始,先列出用到的和require的东西: node.js,这个是必须的 request,然发 ...

  8. scrapy项目2:爬取智联招聘的金融类高端岗位(spider类)

    ---恢复内容开始--- 今天我们来爬取一下智联招聘上金融行业薪酬在50-100万的职位. 第一步:解析解析网页 当我们依次点击下边的索引页面是,发现url的规律如下: 第1页:http://www. ...

  9. scrapy框架爬取智联招聘网站上深圳地区python岗位信息。

    爬取字段,公司名称,职位名称,公司详情的链接,薪资待遇,要求的工作经验年限 1,items中定义爬取字段 import scrapy class ZhilianzhaopinItem(scrapy.I ...

随机推荐

  1. LOJ526「LibreOJ β Round #4」子集

    题目 算是比较裸的题吧. 首先我们把符合要求的\((i,j)\)建一条边,那么我们要求的就是最大团. 转化为补图的最小独立集. 然后我们来证明补图是一个二分图. \((u,v)\)有边\(\Leftr ...

  2. 分布式锁的几种实现方法:redis实现分布式锁

    使用失效的方式实现分布式锁(推荐) import redis.clients.jedis.Jedis; /** * 使用redis实现分布式锁(推荐) * */ public class JedLoc ...

  3. 牛客 2B 树 (组合计数)

    传送门 大意: 给定n节点树, 求划分为不超过$k$个连通块的方案数. n,k<=300. 核心观察是每个连通块深度最低的点固定以后染色方案就固定了. 所以答案为$\sum\limits_{i= ...

  4. 日志:slf4j+logback 的配置与使用

    1. 常用日志组件和选择 java开发日志处理是发现和调试bug所 必不可少的,那么现在企业中常用的日志组件有哪些呢,JCL . JUL.  SLF4j.Log4j.  Log4j2 . Logbac ...

  5. 【项目构建工具】 Gradle笔记2

    一.Gradle执行流程 1.Gradle的执行流程(生命周期)主要是三个阶段: 初始化阶段:解析整个工程中所有Project,构建所有的Project对应的project对象 配置阶段:解析所有的p ...

  6. hive元数据库理解

    在hive2.1.1 里面一共有59张表 表1 VERSION ; version表存hive的版本信息,该表中数据只有一条,如果存在多条,会造成hive启动不起来. 表2  DBS select * ...

  7. shell脚本中的一些特殊符号

    在shell中常用的特殊符号罗列如下:  # ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $*  \"string\"* **  ...

  8. poj 2033 Alphacode (dp)

    Alphacode Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13378   Accepted: 4026 Descri ...

  9. 谷歌对Intel 10nm进度不满

    Intel 在 10nm 处理器上的节奏可谓是“龟速”,一拖三年,且目前大规模发货的 10nm Ice Lake 处理器仅仅是移动平台低电压,桌面要到明年. 表面波澜不惊,实际上却暗流涌动. 首先是 ...

  10. python+Appium自动化:logging配置代码分离

    配置文件信息log.conf: [loggers]keys=root,simpleExample [logger_root]level=DEBUGhandlers=consoleHandler,fil ...