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 相关文章推荐
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
python实现颜色rgb和hex相互转换的函数
Mar 19 Python
python中dir函数用法分析
Apr 17 Python
Python中使用hashlib模块处理算法的教程
Apr 28 Python
python调用Matplotlib绘制分布点并且添加标签
May 31 Python
python实现文本界面网络聊天室
Dec 12 Python
Python获取二维数组的行列数的2种方法
Feb 11 Python
Python requests模块session代码实例
Apr 14 Python
pyecharts调整图例与各板块的位置间距实例
May 16 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 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中把stdClass Object转array的几个方法
2014/05/08 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
PHP封装分页函数实现文本分页和数字分页
2014/10/23 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
jquery选择器之基本过滤选择器详解
2014/01/27 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
学习Vue组件实例
2018/04/28 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
从零学Python之入门(四)运算
2014/05/27 Python
Python学习笔记(二)基础语法
2014/06/06 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Python实现点云投影到平面显示
2020/01/18 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
材料化学应届生求职信
2013/10/09 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫