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 (这个库早些年的用过,后来淡忘了) ...
随机推荐
- LayaAir疑难杂症之三:1.7版本click()、execCommand('copy')函数不生效
问题描述 在使用Laya1.7引擎开发H5游戏时,引入Js原生函数click( ),模拟一次点击事件,发现无效.在使用Laya1.7引擎开发H5游戏时,引入Js原生函数execCommand('cop ...
- Python全栈开发记录_第六篇(生成器和迭代器)
说生成器之前先说一个列表生成式:[x for x in range(10)] ->[0,1,2....,9]这里x可以为函数(因为对python而言就是一个对象而已),range(10)也可 ...
- MySQL(索引)
索引 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可. MySQL中常见索引有: 普通索引 唯一索引 ...
- 菜鸟教程之学习Shell script笔记(中)
菜鸟教程Shell script学习笔记(中) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...
- jedisCluster 报错: redis.clients.jedis.exceptions.JedisClusterException: No way to dispatch this command to Redis Cluster because keys have different slots.
根本原因:jedisCluster不支持mget/mset等跨槽位的操作. 版本:2.9.0 解决办法,推荐更改redis的驱动修改为: lettuce lettuce 项目地址:https://gi ...
- 2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165304 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...
- jsfl 添加代码
var __name=""; var __author=""; var __book=[]; var newJz=""; for(var d ...
- C Mergeable Stack(list超好用)
ZOJ 4016 list用法https://www.cnblogs.com/LLLAIH/p/10673068.html 一开始用普通的栈做,超内存,链表模拟栈也没写出来orz.补题发现list超 ...
- spring注解-“@Scope”
@Scope可用来指定Spring创建bean的方式 默认为单实例,即@Scope("singleton").IOC容器启动的时候会调用方法创建对象并放到IOC容器中,以后每次获取 ...
- SuRF: Practical Range Query Filtering with Fast Succinct Tries 阅读笔记
SuRF(Succinct Range Filter)是一种快速而紧凑的过滤器,同时支持点查询和范围查询(包括开区间查询.闭区间查询.范围计数),可以在RocksDB中用SuRF来替换Bloom过滤器 ...