准备工作

  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 爬取智联招聘的更多相关文章

  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. Vue 可输入可下拉组件的封装

    由于业务需要,需要一个可输入也可下拉的组件,看了iview没有现成的组件用,就自己封装了个小组件~~ 组件input-select.vue代码: <template> <div cl ...

  2. (Python基础)简单购物车代码

    以下是最简单,最基础的购物车代码,一起学习,一起参考.product_list = [ ('Iphone',5800), ('Mac Pro',15800), ('car',580000), ('co ...

  3. 分布式 基本理论 CAP 之 各分布式系统的cap支持情况

    分布式系统.理论.协议 非常非常多, 它们多cap 的支持是怎么样的呢? 需要注意的是,分布式系统 为了应付各种 复杂 应用场景,支持各种各样的功能,可能有的提供了选项或某种机制, 某个时刻,支持CP ...

  4. Python第9天

    迭代器(减少代码量增强可读性)和生成器(只能遍历一次):遵循迭代器协议,就是生成可迭代对象 生产者和消费者模型:可触发生成器运行的方法 直接调用next方法 用系统next+生成器的方法 send y ...

  5. highcharts的用法

    <script type="text/javascript" src="../js/highcharts.js"></script>&l ...

  6. react 和 seamless-immutable

    在 react 中,默认改变组件状态或者属性,是会整个组件全部重新渲染,但是 如果只是修改一个地方,而全部渲染,就会浪费资源,大项目中会造成性能问题 shouldComponentUpdate   s ...

  7. chrome浏览器 新建 标签 页面 跳转到主页(或跳转到谷歌)

    我的浏览器是跳转到自己设置的主页.我在贴吧看到的以下方式,然后就可以了: 地址栏输入 chrome://flags 搜索 Enable doodles on the local NTP 这一项改为di ...

  8. 2.表单与PHP

    不管是一般的企业网站还是复杂的网络应用,都离不开数据的添加.通过PHP服务器端脚本语言,程序可以处理那些通过浏览器对Web应用进行数据调用或添加的请求. 回忆一下平常使用的网站数据输入功能,不管是We ...

  9. java 深度复制与浅复制 copyOf、arraycopy、copyOfRange

    1.copyOf 原型:public static <T> T[] copyOf(T[] original, int newLength) original:原数组 newLength:要 ...

  10. R和Python,对抗or融合?

    来源商业新知网,原标题:从对抗到融合,教你充分利用R+Python! 我们应该将关注点放在技能上,而不是工具上. 如果你从事数据科学的工作,可能会立即想到两种编程语言:R和Python. 事实上,R和 ...