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进阶教程之异常处理
Aug 30 Python
Python自动化部署工具Fabric的简单上手指南
Apr 19 Python
Python探索之实现一个简单的HTTP服务器
Oct 28 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
Django rest framework实现分页的示例
May 24 Python
Python动态导入模块的方法实例分析
Jun 28 Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 Python
Python生成rsa密钥对操作示例
Apr 26 Python
Python使用贪婪算法解决问题
Oct 22 Python
Python中低维数组填充高维数组的实现
Dec 02 Python
python 日志 logging模块详细解析
Mar 31 Python
python 指定源路径来解决import问题的操作
Mar 04 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 FPDF类库应用实现代码
2009/03/20 PHP
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
jquery 问答知识整理
2010/02/11 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
JavaScript实现算术平方根算法-代码超简单
2015/09/11 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
Js类的静态方法与实例方法区分及jQuery拓展的两种方法
2016/06/03 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
Python中的rfind()方法使用详解
2015/05/19 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
使用Scrapy爬取动态数据
2018/10/21 Python
CSS3 linear-gradient线性渐变生成加号和减号的方法
2017/11/21 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
大二自我鉴定范文
2013/10/05 职场文书
出纳员的岗位职责
2014/02/22 职场文书
国培远程培训感言
2014/03/08 职场文书
小学清明节活动方案
2014/03/08 职场文书
股权转让协议书范本
2014/04/12 职场文书
《分一分》教学反思
2014/04/13 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
如何理解PHP核心特性命名空间
2021/05/28 PHP
MySQL创建表操作命令分享
2022/03/25 MySQL
星际争霸:毕姥爷vs解冻01
2022/04/01 星际争霸