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里disconnect UDP套接字的方法
Apr 23 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
Python时间获取及转换知识汇总
Jan 11 Python
浅谈用Python实现一个大数据搜索引擎
Nov 28 Python
python实现简单登陆流程的方法
Apr 22 Python
django1.11.1 models 数据库同步方法
May 30 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
分析python请求数据
Aug 19 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
Python学习笔记之While循环用法分析
Aug 14 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 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
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
JS基于正则截取替换特定字符之间字符串操作示例
2017/02/03 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
2017/05/08 jQuery
微信小程序Redux绑定实例详解
2017/06/07 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
在 Linux/Unix 中不重启 Vim 而重新加载 .vimrc 文件的流程
2018/03/21 Javascript
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
python实现合并多个list及合并多个django QuerySet的方法示例
2019/06/11 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
提升python处理速度原理及方法实例
2019/12/25 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
动物科学专业毕业生的自我评价
2013/11/29 职场文书
办公室前台的岗位职责
2013/12/20 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
领导班子四风表现材料
2014/08/23 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
python process模块的使用简介
2021/05/14 Python
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers