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 相关文章推荐
ptyhon实现sitemap生成示例
Mar 30 Python
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
python通过shutil实现快速文件复制的方法
Mar 14 Python
深入理解python try异常处理机制
Jun 01 Python
Python中查看文件名和文件路径
Mar 31 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
python 删除指定时间间隔之前的文件实例
Apr 24 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
一些关于python 装饰器的个人理解
Aug 31 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
Nov 25 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 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
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
php 获取完整url地址
2008/12/20 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
2016/05/10 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
浅谈jQuery框架Ajax常用选项
2017/07/08 jQuery
vue脚手架搭建过程图解
2018/06/06 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
Vue将props值实时传递 并可修改的操作
2020/08/09 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
python实现教务管理系统
2018/03/12 Python
Django rest framework实现分页的示例
2018/05/24 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
Python Des加密解密如何实现软件注册码机器码
2020/01/08 Python
python3中数组逆序输出方法
2020/12/01 Python
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
爱的教育观后感
2015/06/17 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
MySQL系列之十一 日志记录
2021/07/02 MySQL
Python探索生命起源 matplotlib细胞自动机动画演示
2022/04/21 Python