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实现在sqlite动态创建表的方法
May 08 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
Python工程师面试必备25条知识点
Jan 17 Python
Python使用pickle模块存储数据报错解决示例代码
Jan 26 Python
python样条插值的实现代码
Dec 17 Python
python使用百度文字识别功能方法详解
Jul 23 Python
浅析Windows 嵌入python解释器的过程
Jul 26 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
pytorch查看通道数 维数 尺寸大小方式
May 26 Python
python如何处理程序无法打开
Jun 16 Python
Python urllib request模块发送请求实现过程解析
Dec 10 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获取当前文件所在目录 getcwd()函数
2009/05/13 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
JavaScript闭包 懂不懂由你反正我是懂了
2011/10/21 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
JavaScript构建自己的对象示例
2016/11/29 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
python中执行shell的两种方法总结
2017/01/10 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
基于树莓派的语音对话机器人
2019/06/17 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
Pyqt5自适应布局实例
2019/12/13 Python
2014自荐信的写作技巧
2014/01/28 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
小型婚礼主持词
2015/06/30 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
初中政治教学反思
2016/02/23 职场文书
Python中可变和不可变对象的深入讲解
2021/08/02 Python