Python爬虫框架Scrapy实例代码


Posted in Python onMarch 04, 2018

目标任务:爬取腾讯社招信息,需要爬取的内容为:职位名称,职位的详情链接,职位类别,招聘人数,工作地点,发布时间。

一、创建Scrapy项目

scrapy startproject Tencent

命令执行后,会创建一个Tencent文件夹,结构如下

二、编写item文件,根据需要爬取的内容定义爬取字段

# -*- coding: utf-8 -*-
import scrapy
class TencentItem(scrapy.Item):
  # 职位名
  positionname = scrapy.Field()
  # 详情连接
  positionlink = scrapy.Field()
  # 职位类别
  positionType = scrapy.Field()
  # 招聘人数
  peopleNum = scrapy.Field()
  # 工作地点
  workLocation = scrapy.Field()
  # 发布时间
  publishTime = scrapy.Field()

三、编写spider文件

进入Tencent目录,使用命令创建一个基础爬虫类:

# tencentPostion为爬虫名,tencent.com为爬虫作用范围
scrapy genspider tencentPostion "tencent.com"

执行命令后会在spiders文件夹中创建一个tencentPostion.py的文件,现在开始对其编写:

# -*- coding: utf-8 -*-
import scrapy
from tencent.items import TencentItem
class TencentpositionSpider(scrapy.Spider):
  """
  功能:爬取腾讯社招信息
  """
  # 爬虫名
  name = "tencentPosition"
  # 爬虫作用范围
  allowed_domains = ["tencent.com"]
  url = "http://hr.tencent.com/position.php?&start="
  offset = 0
  # 起始url
  start_urls = [url + str(offset)]
  def parse(self, response):
    for each in response.xpath("//tr[@class='even'] | //tr[@class='odd']"):
      # 初始化模型对象
      item = TencentItem()
      # 职位名称
      item['positionname'] = each.xpath("./td[1]/a/text()").extract()[0]
      # 详情连接
      item['positionlink'] = each.xpath("./td[1]/a/@href").extract()[0]
      # 职位类别
      item['positionType'] = each.xpath("./td[2]/text()").extract()[0]
      # 招聘人数
      item['peopleNum'] = each.xpath("./td[3]/text()").extract()[0]
      # 工作地点
      item['workLocation'] = each.xpath("./td[4]/text()").extract()[0]
      # 发布时间
      item['publishTime'] = each.xpath("./td[5]/text()").extract()[0]
      yield item
    if self.offset < 1680:
      self.offset += 10
    # 每次处理完一页的数据之后,重新发送下一页页面请求
    # self.offset自增10,同时拼接为新的url,并调用回调函数self.parse处理Response
    yield scrapy.Request(self.url + str(self.offset), callback = self.parse)

四、编写pipelines文件

# -*- coding: utf-8 -*-
import json
class TencentPipeline(object):
""" 
    功能:保存item数据 
  """
  def __init__(self):
    self.filename = open("tencent.json", "w")
  def process_item(self, item, spider):
    text = json.dumps(dict(item), ensure_ascii = False) + ",\n"
    self.filename.write(text.encode("utf-8"))
    return item
  def close_spider(self, spider):
    self.filename.close()

五、settings文件设置(主要设置内容)

# 设置请求头部,添加url
DEFAULT_REQUEST_HEADERS = {
  "User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;",
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
}
# 设置item——pipelines
ITEM_PIPELINES = {
  'tencent.pipelines.TencentPipeline': 300,
}

执行命令,运行程序

# tencentPosition为爬虫名
scrapy crwal tencentPosition

使用CrawlSpider类改写

# 创建项目
scrapy startproject TencentSpider
# 进入项目目录下,创建爬虫文件
scrapy genspider -t crawl tencent tencent.com
item等文件写法不变,主要是爬虫文件的编写
# -*- coding:utf-8 -*-
import scrapy
# 导入CrawlSpider类和Rule
from scrapy.spiders import CrawlSpider, Rule
# 导入链接规则匹配类,用来提取符合规则的连接
from scrapy.linkextractors import LinkExtractor
from TencentSpider.items import TencentItem
class TencentSpider(CrawlSpider):
  name = "tencent"
  allow_domains = ["hr.tencent.com"]
  start_urls = ["http://hr.tencent.com/position.php?&start=0#a"]
  # Response里链接的提取规则,返回的符合匹配规则的链接匹配对象的列表
  pagelink = LinkExtractor(allow=("start=\d+"))
  rules = [
    # 获取这个列表里的链接,依次发送请求,并且继续跟进,调用指定回调函数处理
    Rule(pagelink, callback = "parseTencent", follow = True)
  ]
  # 指定的回调函数
  def parseTencent(self, response):
    for each in response.xpath("//tr[@class='even'] | //tr[@class='odd']"):
      item = TencentItem()
      # 职位名称
      item['positionname'] = each.xpath("./td[1]/a/text()").extract()[0]
      # 详情连接
      item['positionlink'] = each.xpath("./td[1]/a/@href").extract()[0]
      # 职位类别
      item['positionType'] = each.xpath("./td[2]/text()").extract()[0]
      # 招聘人数
      item['peopleNum'] = each.xpath("./td[3]/text()").extract()[0]
      # 工作地点
      item['workLocation'] = each.xpath("./td[4]/text()").extract()[0]
      # 发布时间
      item['publishTime'] = each.xpath("./td[5]/text()").extract()[0]
      yield item

总结

以上所述是小编给大家介绍的Python爬虫框架Scrapy实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
简单的通用表达式求10乘阶示例
Mar 03 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
python中如何使用朴素贝叶斯算法
Apr 06 Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
Python 判断奇数偶数的方法
Dec 20 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
flask实现验证码并验证功能
Dec 05 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
Feb 26 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 Python
Spy++的使用方法及下载教程
Jan 29 Python
详解python中asyncio模块
Mar 03 #Python
python3.6+django2.0开发一套学员管理系统
Mar 03 #Python
python爬虫面试宝典(常见问题)
Mar 02 #Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 #Python
谈谈python中GUI的选择
Mar 01 #Python
纯python实现机器学习之kNN算法示例
Mar 01 #Python
用python与文件进行交互的方法
Mar 01 #Python
You might like
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
jquery判断浏览器类型的代码
2012/11/05 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
vue 项目打包时样式及背景图片路径找不到的解决方式
2019/11/12 Javascript
Python 学习笔记
2008/12/27 Python
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
Python函数的周期性执行实现方法
2016/08/13 Python
利用Python实现颜色色值转换的小工具
2016/10/27 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
python关于调用函数外的变量实例
2019/12/26 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
python编写俄罗斯方块
2020/03/13 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
暑假实习求职信范文
2013/09/22 职场文书
市场营销专科应届生求职信
2013/11/24 职场文书
关于幼儿的自我评价
2013/12/18 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
被告答辩状范文
2015/05/22 职场文书
工作收入证明范本
2015/06/12 职场文书
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle