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多进程共享变量
Apr 06 Python
python matplotlib画图实例代码分享
Dec 27 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
Django框架使用mysql视图操作示例
May 15 Python
python实现微信自动回复及批量添加好友功能
Jul 03 Python
Python中list循环遍历删除数据的正确方法
Sep 02 Python
python构造函数init实例方法解析
Jan 19 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
详解python中的闭包
Sep 07 Python
python程序实现BTC(比特币)挖矿的完整代码
Jan 20 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 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下使用SMTP发邮件的代码
2008/01/10 PHP
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
PHP数据库调用类调用实例(详细注释)
2012/07/12 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
详解jenkins自动化部署vue
2019/05/14 Javascript
Angular进行简单单元测试的实现方法实例
2020/08/16 Javascript
初学python数组的处理代码
2011/01/04 Python
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
python利用正则表达式排除集合中字符的功能示例
2017/10/10 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
Python基础之文件读取的讲解
2019/02/16 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
python装饰器原理与用法深入详解
2019/12/19 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
好人好事演讲稿
2014/09/01 职场文书
会议主持词结束语
2015/07/03 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
Python 统计序列中元素的出现频度
2022/04/26 Python