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编写一个简单的FUSE文件系统的教程
Apr 02 Python
python实现将文本转换成语音的方法
May 28 Python
Python实现建立SSH连接的方法
Jun 03 Python
说一说Python logging
Apr 15 Python
python检查URL是否正常访问的小技巧
Feb 25 Python
使用matplotlib画散点图的方法
May 25 Python
Python中if elif else及缩进的使用简述
May 31 Python
python虚拟环境完美部署教程
Aug 06 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
python如何进行矩阵运算
Jun 05 Python
如何解决python多种版本冲突问题
Oct 13 Python
基于Python组装jmx并调用JMeter实现压力测试
Nov 03 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php二维数组排序详解
2013/11/06 PHP
php导出CSV抽象类实例
2014/09/24 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
2017/02/17 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
js注意img图片的onerror事件的分析
2011/01/01 Javascript
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
js实现二级导航功能
2017/03/03 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
实例分析javascript中的异步
2020/06/02 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
python的pdb调试命令的命令整理及实例
2017/07/12 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
有原因的手表:Flex Watches
2019/03/23 全球购物
大学生期末自我鉴定
2014/02/01 职场文书
学生手册家长评语
2014/02/10 职场文书
诉讼财产保全担保书
2014/05/20 职场文书
影视后期实训报告
2014/11/05 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
同学聚会通知短信
2015/04/20 职场文书
加薪申请报告范本
2015/05/15 职场文书
入党积极分子党支部意见
2015/06/02 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL