Scrapy框架爬取Boss直聘网Python职位信息的源码


Posted in Python onFebruary 22, 2019

分析

使用CrawlSpider结合LinkExtractor和Rule爬取网页信息

LinkExtractor用于定义链接提取规则,一般使用allow参数即可

LinkExtractor(allow=(), # 使用正则定义提取规则
       deny=(), # 排除规则
       allow_domains=(), # 限定域名范围
       deny_domains=(), # 排除域名范围
       restrict_xpaths=(), # 使用xpath定义提取队则
       tags=('a', 'area'), 
       attrs=('href',), 
       canonicalize=False,
       unique=True, 
       process_value=None,
       deny_extensions=None, 
       restrict_css=(), # 使用css选择器定义提取规则
       strip=True):

Rule用于定义CrawlSpider的爬取规则,由Spider内部自动识别,提交请求、获取响应,交给callback指定的回调方法处理response

如果指定了callback,参数follow默认为False;如果callback为None,follow默认为True

Rule(link_extractor, # LinkExtractor对象,必选参数
   callback=None, # 回调方法,可选
   cb_kwargs=None, 
   follow=None, # 是否进行深度爬取,True、False
   process_links=None, # 用于处理链接(有些反爬策略是返回假的url)
   process_request=identity)

源码

items.py

class BosszhipinItem(scrapy.Item):
  """Boss直聘Pytho职位爬虫Item"""
  # 职位名称
  position=scrapy.Field()
  # 公司名称
  company=scrapy.Field()
  # 薪资
  salary=scrapy.Field()
  # 工作地点
  location=scrapy.Field()
  # 学历要求
  education=scrapy.Field()
  # 工作时间
  year=scrapy.Field()

spiders/bosszhipin_spider.py

# !/usr/bin/env python
# -*- coding:utf-8 -*-
import scrapy
from scrapy.spider import CrawlSpider,Rule
from scrapy.linkextractors import LinkExtractor
from myscrapy.items import BosszhipinItem
class BosszhipinSpider(CrawlSpider):
  """
  Boss直聘Python职位爬虫Spider
    使用CrawlSpider基类实现
  """
  name = 'bosszhipin'
  allowed_domains=['zhipin.com',]
  start_urls=['http://www.zhipin.com/c100010000/h_100010000/?query=Python&page=1',]
  # 链接提取器对象(规定链接提取规则)
  link_extractor=LinkExtractor(allow=(r'page=\d+'))
  # 链接提取规则对象列表
  # 自动调用callback指定的方法,去取爬取由link_extractor指定的链接提取规则匹配到的url
  # 原理:link_extractor.extract_links(response)返回匹配到的链接
  rules = [
    Rule(link_extractor=link_extractor,callback='parse_page',follow=True),
  ]
  def parse_page(self,response):
    """定义回调方法,用于解析每个response对象"""
    job_list=response.xpath('//div[@class="job-list"]//li')
    for job in job_list:
      position = job.xpath('.//div[@class="info-primary"]//h3[@class="name"]/a/text()')[0].extract()
      salary =job.xpath('.//div[@class="info-primary"]//h3[@class="name"]//span/text()')[0].extract()
      company =job.xpath('.//div[@class="company-text"]//a/text()')[0].extract()
      location =job.xpath('.//div[@class="info-primary"]/p/text()[1]')[0].extract()
      year =job.xpath('.//div[@class="info-primary"]/p/text()[2]')[0].extract()
      education =job.xpath('.//div[@class="info-primary"]/p/text()[3]')[0].extract()
      item=BosszhipinItem()
      item['position']=position
      item['salary']=salary
      item['company']=company
      item['location']=location
      item['year']=year
      item['education']=education
      yield item

pipelines.py

class BosszhipinPipeline(object):
  """Boss直聘Python职位爬虫Item Pipeline"""
  def __init__(self):
    self.f=open('data/bosszhipin.json',mode='wb')
    self.f.write(b'[')
  def process_item(self,item,spider):
    data=json.dumps(dict(item),ensure_ascii=False,indent=4)
    self.f.write(data.encode('utf-8'))
    self.f.write(b',')
    return item
  def close_spider(self,spider):
    self.f.write(b']')
    self.f.close()

settings.py

ITEM_PIPELINES = {
  'myscrapy.pipelines.BosszhipinPipeline': 1,
}

运行结果

Scrapy框架爬取Boss直聘网Python职位信息的源码

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
解析Python编程中的包结构
Oct 25 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
详解Python进程间通信之命名管道
Aug 28 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
如何使用Python标准库进行性能测试
Jun 25 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
Flask框架单例模式实现方法详解
Jul 31 Python
python打包多类型文件的操作方法
Sep 21 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
深入理解Python变量的数据类型和存储
Feb 01 Python
pandas修改DataFrame列名的实现方法
Feb 22 #Python
pyhanlp安装介绍和简单应用
Feb 22 #Python
Python3.7 dataclass使用指南小结
Feb 22 #Python
Python文件读写常见用法总结
Feb 22 #Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 #Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 #Python
浅谈python3.6的tkinter运行问题
Feb 22 #Python
You might like
PHP实现的DES加密解密实例代码
2016/04/06 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
详解PHP素材图片上传、下载功能
2019/04/12 PHP
JavaScript 中的replace方法说明
2007/04/13 Javascript
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
JavaScript多线程详解
2015/08/12 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
Django框架教程之中间件MiddleWare浅析
2019/12/29 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
matplotlib交互式数据光标mpldatacursor的实现
2021/02/03 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
大学生工作推荐信范文
2013/12/02 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
40岁生日感言
2014/02/15 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
模特大赛策划方案
2014/05/28 职场文书
总经理任命书范本
2014/06/05 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
餐厅开业活动方案
2019/07/08 职场文书