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 (这个库早些年的用过,后来淡忘了) ...
随机推荐
- Android 开发 Camera类的拍照与录像
前言 在开发Android应用的时候,如果需要调用摄像头拍照或者录像,除了通过Intent调用系统现有相机应用进行拍照录像之外,还可以通过直接调用Camera硬件去去获取摄像头进行拍照录像的操作.本篇 ...
- 70.纯 CSS 创作一只徘徊的果冻怪兽
原文地址:https://segmentfault.com/a/1190000015484852 感想:monster中边框角.上下动画.旋转动画.左右动画,眼睛中transform:scaleY(n ...
- mac环境破解navicat premium 12.1
1. 下载破解工具 https://github.com/DoubleLabyrinth/navicat-keygen/tree/mac 其中,navicat-keygen为破解器:navicat-p ...
- Linux_Ubuntu_C++编程_如何完成一个C++编写,调试,运行。
倘若没装那个软件,系统会提示,根据提示装软件.
- 与大家分享学习微信小程序开发的一些心得
因为我也才开始学习微信小程序不久,下文也是现在的一时之言,大家有不同的想法也可以在评论里共同交流讨论,希望文章能给大家提供一点点帮助. 最近接触到了一些前端框架,像Vue.js,React,发现小程序 ...
- JeeWx全新版本发布!捷微二代微信活动平台1.0发布!活动插件持续开源更新!
JeeWx捷微二代微信活动平台 (专业微信营销活动平台,活动插件持续更新ing~) 终于等到你!还好我没放弃! 在团队持续多年的努力下,Jeewx微信管家和H5活动平台不断更新迭代,积累了许许多 ...
- Inno setup 操作注册表操作参数详解
原文地址:http://www.dayanzai.me/inno-setup-tut.html [Registry] 段这个可选段用来定义一些你想用安装程序在用户系统中创建.修改或删除的注册表键/值. ...
- Grafana短信报警实现
1.阿里云短信服务API2.Jenkins-plugin:Generic Webhook Trigger Plugin 阿里云 下载阿里云短信服务SDK 创建短信服务ACCESS_KEY_ID Gra ...
- 程序员常用字体(vs2008字体修改方案)
字体不仅是设计师手中重要的武器,对我们开发人员来说,字体的选择也有许多讲究,一个好的.适合展示代码的字体,应该具备以下要素: 等宽的字符 简洁.清晰并且规范的字符形状 支持ASCII码为128以上的扩 ...
- LINUX系统日常使用命令
一.开关机命令1.shutdown -h now 关闭系统2.init 0 关闭系统3.telinit 0 关闭系统4.shutdown -h hours:minutes 按预定时 ...