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 08 Python
使用Python的判断语句模拟三目运算
Apr 24 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
Nov 09 Python
Python装饰器基础详解
Mar 09 Python
对Python中的@classmethod用法详解
Apr 21 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
用python爬取租房网站信息的代码
Dec 14 Python
python实现邮件发送功能
Aug 10 Python
django项目用higcharts统计最近七天文章点击量
Aug 17 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
python爬虫破解字体加密案例详解
Mar 02 Python
Python帮你解决手机qq微信内存占用太多问题
Feb 15 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加密解密的代码
2007/07/16 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python查询IP地址归属完整代码
2017/06/21 Python
Python中Selenium模拟JQuery滑动解锁实例
2017/07/26 Python
Python之文字转图片方法
2018/05/10 Python
Python 做曲线拟合和求积分的方法
2018/12/29 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
中学门卫岗位职责
2013/12/26 职场文书
二年级体育教学反思
2014/01/15 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
预备党员承诺书
2014/03/25 职场文书
对祖国的寄语大全
2014/04/11 职场文书
建设工地安全标语
2014/06/07 职场文书
员工自我评价范文
2015/03/11 职场文书
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL