scrapy 爬取智联招聘
准备工作
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
- # -*- coding: utf-8 -*-
- import os
- import json
- from tinydb import TinyDB, Query
- from furl import furl
- import scrapy
- class ZhaopinspiderSpider(scrapy.Spider):
- name = 'ZhaopinSpider'
- allowed_domains = ['www.zhaopin.com', 'sou.zhaopin.com', 'fe-api.zhaopin.com']
- start_urls = ['https://www.zhaopin.com/citymap']
- cache_db = TinyDB('ZhaopinSpider-cache.json') # 缓存数据库
- allowed_cities = ['重庆', ]# '成都', '上海', '深圳', '昆明', '杭州', '贵阳', '宁波'] ## 允许的城市
- F = furl('https://fe-api.zhaopin.com/c/i/sou?pageSize=90&kt=3') # URL母版
- PAGE_SIZE = 90 # 分页大小
- def get_city_code(self, city_name):
- '''(根据城市名)获取城市代码'''
- Q = Query()
- city = self.cache_db.get(Q.name.search(city_name))
- if isinstance(city, dict):
- return city['code']
- else:
- print('@' * 100)
- print(type(city))
- def init_city_info(self, response):
- '''初始化城市信息'''
- # 取源码
- script_text = response.xpath('//script[text()[contains(., "__INITIAL_STATE__")]]/text()').extract_first()
- # 去收尾空格
- script_text = script_text.strip()
- # 预处理为符合json规范的数据
- script_json = script_text[script_text.index('=') + 1:]
- # 将json字符串转为字典
- script_dict = json.loads(script_json)
- '''
- # 存储取得的json, 便于调试查看
- with open('text.json', 'wt', encoding='utf-8') as f:
- json.dump(script_dict, f, indent=4, ensure_ascii=False)
- '''
- '''
- city_list = [] # 存储城市列表
- # 将字典中的城市提取到列表中,便于查找
- for ch in script_dict['cityList']['cityMapList']:
- city_list.extend(script_dict['cityList']['cityMapList'][ch])
- # 筛选出重庆,并获取城市码
- city_code = (list(filter(lambda city: city['name'] == '重庆', city_list)) or [{'code': None}])[0]['code']
- '''
- for ch in script_dict['cityList']['cityMapList']:
- for city in script_dict['cityList']['cityMapList'][ch]:
- self.cache_db.insert(city)
- def parse(self, response):
- # if not os.path.exists('ZhaopinSpider-cache.json'):
- if not bool(self.eache_db.all()):
- self.init_city_info(response)
- # 迭代每一个要爬取的城市
- for city_name in self.allowed_cities:
- # 启动 爬取某个城市 第一个请求
- # import ipdb; ipdb.set_trace()
- yield self.request_city(city_name)
- def request_city(self, city_name, page_start=0):
- '''构造 爬取某个具体的城市 的请求对象'''
- city_code = self.get_city_code(city_name)
- url_data = {
- 'cityId': city_code,
- 'kw': 'python',
- 'start': page_start
- }
- # 要爬取的页面的URL
- url = self.F.copy().add(url_data).url
- # import ipdb; ipdb.set_trace()
- req = scrapy.Request(url, callback=self.parse_city, dont_filter=False)
- # 使用 meta 传递附加数据,在 callback 中可以通过 respo.meta 取得
- req.meta['city_name'] = city_name
- req.meta['page_start'] = page_start
- return req
- def parse_city(self, response):
- '''解析具体的页面'''
- # 解析json格式的响应结果
- resp_dict = json.loads(response.body_as_unicode())
- # 总共所能爬取的条数
- num_found = resp_dict['data']['numFound']
- # 获取当前请求的 page_start
- page_start = response.meta['page_start']
- # 下一次请求,需要的 start 参数
- next_start = page_start + self.PAGE_SIZE
- # import ipdb; ipdb.set_trace()
- # 判断是否有下一页
- if next_start < num_found:
- # 获取当前请求的 城市名
- city_name = response.meta['city_name']
- # 发送下一页请求
- yield self.request_city(city_name, page_start=next_start)
- # 解析数据
- for item in resp_dict['data']['results']:
- # TODO: 解析数据,只取我们需要的信息
- item['spiderName'] = self.name
- # 返回每一条数据
- yield item
scrapy 爬取智联招聘的更多相关文章
- 用Python爬取智联招聘信息做职业规划
上学期在实验室发表时写了一个爬取智联招牌信息的爬虫. 操作流程大致分为:信息爬取——数据结构化——存入数据库——所需技能等分词统计——数据可视化 1.数据爬取 job = "通信工程师&qu ...
- scrapy项目2:爬取智联招聘的金融类高端岗位(spider类)
---恢复内容开始--- 今天我们来爬取一下智联招聘上金融行业薪酬在50-100万的职位. 第一步:解析解析网页 当我们依次点击下边的索引页面是,发现url的规律如下: 第1页:http://www. ...
- node.js 89行爬虫爬取智联招聘信息
写在前面的话, .......写个P,直接上效果图.附上源码地址 github/lonhon ok,正文开始,先列出用到的和require的东西: node.js,这个是必须的 request,然发 ...
- Python+selenium爬取智联招聘的职位信息
整个爬虫是基于selenium和Python来运行的,运行需要的包 mysql,matplotlib,selenium 需要安装selenium火狐浏览器驱动,百度的搜寻. 整个爬虫是模块化组织的,不 ...
- 用生产者消费模型爬取智联招聘python岗位信息
爬取python岗位智联招聘 这里爬取北京地区岗位招聘python岗位,并存入EXECEL文件内,代码如下: import json import xlwt import requests from ...
- python爬取智联招聘职位信息(多进程)
测试了下,采用单进程爬取5000条数据大概需要22分钟,速度太慢了点.我们把脚本改进下,采用多进程. 首先获取所有要爬取的URL,在这里不建议使用集合,字典或列表的数据类型来保存这些URL,因为数据量 ...
- python爬取智联招聘职位信息(单进程)
我们先通过百度搜索智联招聘,进入智联招聘官网,一看,傻眼了,需要登录才能查看招聘信息 没办法,用账号登录进去,登录后的网页如下: 输入职位名称点击搜索,显示如下网页: 把这个URL:https://s ...
- scrapy框架爬取智联招聘网站上深圳地区python岗位信息。
爬取字段,公司名称,职位名称,公司详情的链接,薪资待遇,要求的工作经验年限 1,items中定义爬取字段 import scrapy class ZhilianzhaopinItem(scrapy.I ...
- python3 requests_html 爬取智联招聘数据(简易版)
PS重点:我回来了-----我回来了-----我回来了 1. 基础需要: python3 基础 html5 CS3 基础 2.库的选择: 原始库 urllib2 (这个库早些年的用过,后来淡忘了) ...
随机推荐
- Pycharm去掉项目所有 # 注释
通过快捷键ctrl+shift+R 进入 项目全局替换窗口,点击右上角 勾选正则,然后 搜索框输入 (#.*) 即可 ,然后点击 replace all 去掉所有注释
- sql语句基本查询操作
表结构 SQL> desc empName Type Nullable Default Comments -------- ------------ -------- ------- ----- ...
- MongoDB(1)--MongoDB安装及简介
一.MongoDB的应用场景及实现原理二.MongoDB的常用命令及配置三.手写基于MongoDB的ORM框架四.基于MongoDB实现网络云盘实战五.MongoDB 4.0新特性 一.MongoDB ...
- 001_angular4.0框架学习
1. Cannot find module 'angular2-in-memory-web-api' 报这个错误的时候 是没有安装这个包 要手动安装下包 命令: npm i angular-in ...
- python初学心得之一
昨天开始接触并学习python,对python有了初步印象. 一.python主要应用方向 二.python语言类型 三.python2和3的主要区别 四.常见字符编码 五.Python语法初学 一 ...
- JPA报错问题修改小结
项目中在使用线程跑定时任务时,遇到报错,"Could not open JPA EntityManager for transaction Caused by: org.hibernate. ...
- list<T>升序、降序
List<test> list = new List<test> (); var result = list.OrderByDescending(p => p.we).T ...
- lnmp环境部署脚本-y
系统环境:centos6.X #!/bin/bash#date:2018-01-01## MySQL 安装8版本的话不太适合,有待于添加安装脚本进行测试#新版的MySQL安装需要高版本2.8以上cma ...
- 安装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 ...
- Android Spannable为同一TextView设直不同样式
/** * UNICODE * <p> * 偶尔吃(1-2次/周) ( 中文破弧 * 经常吃(3-5次/周) ( 英文破弧 * * @param name * @return */ pri ...