准备工作

  1. scrapy startproject Jobs
  2. cd Jobs
  3. scrapy genspider ZhaopinSpider www.zhaopin.com
  4. scrapy crawl ZhaopinSpider
  5. pip install diskcache
  6. pip install tinydb
  7. scrapy crawl ZhaopinSpider -o chongqing.json

ZhaopinSpider

 

  1. # -*- coding: utf-8 -*-
  2. import os
  3. import json
  4.  
  5. from tinydb import TinyDB, Query
  6. from furl import furl
  7. import scrapy
  8.  
  9. class ZhaopinspiderSpider(scrapy.Spider):
  10. name = 'ZhaopinSpider'
  11. allowed_domains = ['www.zhaopin.com', 'sou.zhaopin.com', 'fe-api.zhaopin.com']
  12. start_urls = ['https://www.zhaopin.com/citymap']
  13. cache_db = TinyDB('ZhaopinSpider-cache.json') # 缓存数据库
  14. allowed_cities = ['重庆', ]# '成都', '上海', '深圳', '昆明', '杭州', '贵阳', '宁波'] ## 允许的城市
  15. F = furl('https://fe-api.zhaopin.com/c/i/sou?pageSize=90&kt=3') # URL母版
  16. PAGE_SIZE = 90 # 分页大小
  17.  
  18. def get_city_code(self, city_name):
  19. '''(根据城市名)获取城市代码'''
  20. Q = Query()
  21. city = self.cache_db.get(Q.name.search(city_name))
  22. if isinstance(city, dict):
  23. return city['code']
  24. else:
  25. print('@' * 100)
  26. print(type(city))
  27.  
  28. def init_city_info(self, response):
  29. '''初始化城市信息'''
  30. # 取源码
  31. script_text = response.xpath('//script[text()[contains(., "__INITIAL_STATE__")]]/text()').extract_first()
  32. # 去收尾空格
  33. script_text = script_text.strip()
  34. # 预处理为符合json规范的数据
  35. script_json = script_text[script_text.index('=') + 1:]
  36. # 将json字符串转为字典
  37. script_dict = json.loads(script_json)
  38. '''
  39. # 存储取得的json, 便于调试查看
  40. with open('text.json', 'wt', encoding='utf-8') as f:
  41. json.dump(script_dict, f, indent=4, ensure_ascii=False)
  42. '''
  43. '''
  44. city_list = [] # 存储城市列表
  45. # 将字典中的城市提取到列表中,便于查找
  46. for ch in script_dict['cityList']['cityMapList']:
  47. city_list.extend(script_dict['cityList']['cityMapList'][ch])
  48. # 筛选出重庆,并获取城市码
  49. city_code = (list(filter(lambda city: city['name'] == '重庆', city_list)) or [{'code': None}])[0]['code']
  50. '''
  51. for ch in script_dict['cityList']['cityMapList']:
  52. for city in script_dict['cityList']['cityMapList'][ch]:
  53. self.cache_db.insert(city)
  54.  
  55. def parse(self, response):
  56. # if not os.path.exists('ZhaopinSpider-cache.json'):
  57. if not bool(self.eache_db.all()):
  58. self.init_city_info(response)
  59. # 迭代每一个要爬取的城市
  60. for city_name in self.allowed_cities:
  61. # 启动 爬取某个城市 第一个请求
  62. # import ipdb; ipdb.set_trace()
  63. yield self.request_city(city_name)
  64.  
  65. def request_city(self, city_name, page_start=0):
  66. '''构造 爬取某个具体的城市 的请求对象'''
  67. city_code = self.get_city_code(city_name)
  68. url_data = {
  69. 'cityId': city_code,
  70. 'kw': 'python',
  71. 'start': page_start
  72. }
  73. # 要爬取的页面的URL
  74. url = self.F.copy().add(url_data).url
  75. # import ipdb; ipdb.set_trace()
  76. req = scrapy.Request(url, callback=self.parse_city, dont_filter=False)
  77. # 使用 meta 传递附加数据,在 callback 中可以通过 respo.meta 取得
  78. req.meta['city_name'] = city_name
  79. req.meta['page_start'] = page_start
  80. return req
  81.  
  82. def parse_city(self, response):
  83. '''解析具体的页面'''
  84. # 解析json格式的响应结果
  85. resp_dict = json.loads(response.body_as_unicode())
  86. # 总共所能爬取的条数
  87. num_found = resp_dict['data']['numFound']
  88. # 获取当前请求的 page_start
  89. page_start = response.meta['page_start']
  90. # 下一次请求,需要的 start 参数
  91. next_start = page_start + self.PAGE_SIZE
  92. # import ipdb; ipdb.set_trace()
  93. # 判断是否有下一页
  94. if next_start < num_found:
  95. # 获取当前请求的 城市名
  96. city_name = response.meta['city_name']
  97. # 发送下一页请求
  98. yield self.request_city(city_name, page_start=next_start)
  99. # 解析数据
  100. for item in resp_dict['data']['results']:
  101. # TODO: 解析数据,只取我们需要的信息
  102. item['spiderName'] = self.name
  103. # 返回每一条数据
  104. yield item

scrapy 爬取智联招聘的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    测试了下,采用单进程爬取5000条数据大概需要22分钟,速度太慢了点.我们把脚本改进下,采用多进程. 首先获取所有要爬取的URL,在这里不建议使用集合,字典或列表的数据类型来保存这些URL,因为数据量 ...

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

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

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

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

  9. python3 requests_html 爬取智联招聘数据(简易版)

    PS重点:我回来了-----我回来了-----我回来了 1. 基础需要: python3 基础 html5 CS3 基础 2.库的选择: 原始库  urllib2  (这个库早些年的用过,后来淡忘了) ...

随机推荐

  1. Pycharm去掉项目所有 # 注释

    通过快捷键ctrl+shift+R 进入 项目全局替换窗口,点击右上角 勾选正则,然后 搜索框输入 (#.*) 即可 ,然后点击 replace all 去掉所有注释

  2. sql语句基本查询操作

    表结构 SQL> desc empName Type Nullable Default Comments -------- ------------ -------- ------- ----- ...

  3. MongoDB(1)--MongoDB安装及简介

    一.MongoDB的应用场景及实现原理二.MongoDB的常用命令及配置三.手写基于MongoDB的ORM框架四.基于MongoDB实现网络云盘实战五.MongoDB 4.0新特性 一.MongoDB ...

  4. 001_angular4.0框架学习

    1. Cannot find module 'angular2-in-memory-web-api' 报这个错误的时候  是没有安装这个包  要手动安装下包  命令: npm i angular-in ...

  5. python初学心得之一

    昨天开始接触并学习python,对python有了初步印象. 一.python主要应用方向 二.python语言类型 三.python2和3的主要区别 四.常见字符编码 五.Python语法初学  一 ...

  6. JPA报错问题修改小结

    项目中在使用线程跑定时任务时,遇到报错,"Could not open JPA EntityManager for transaction Caused by: org.hibernate. ...

  7. list<T>升序、降序

    List<test> list = new List<test> (); var result = list.OrderByDescending(p => p.we).T ...

  8. lnmp环境部署脚本-y

    系统环境:centos6.X #!/bin/bash#date:2018-01-01## MySQL 安装8版本的话不太适合,有待于添加安装脚本进行测试#新版的MySQL安装需要高版本2.8以上cma ...

  9. 安装SQL server 2008 R2和QL server 2008,与SQL server 2008升级SQL server 2008 R2

    安装SQL server 2008 R2和由SQL server 2008升级SQL server 2008 R2 前提条件: 由SQL server2008 升级SQL server2008 R2 ...

  10. Android Spannable为同一TextView设直不同样式

    /** * UNICODE * <p> * 偶尔吃(1-2次/周) ( 中文破弧 * 经常吃(3-5次/周) ( 英文破弧 * * @param name * @return */ pri ...