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 urllib模块urlopen()与urlretrieve()详解
Nov 01 Python
在Python中使用HTML模版的教程
Apr 29 Python
python中使用序列的方法
Aug 03 Python
Python Django使用forms来实现评论功能
Aug 17 Python
Python中使用支持向量机SVM实践
Dec 27 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
使用npy转image图像并保存的实例
Jul 01 Python
彻底解决Python包下载慢问题
Nov 15 Python
Python的这些库,你知道多少?
Jun 09 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
Yii框架登录流程分析
2014/12/03 PHP
PHP基于单例模式实现的数据库操作基类
2016/01/15 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
基于JavaScript canvas绘制贝塞尔曲线
2018/12/25 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python语言生成水仙花数代码示例
2017/12/18 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
制衣厂各岗位职责
2013/12/02 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
淘宝好评语大全
2014/05/05 职场文书
2014年村官工作总结
2014/11/24 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
中秋晚会致辞
2015/07/31 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
MySQL学习之基础操作总结
2022/03/19 MySQL
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技