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 正则表达式(转义问题)
Dec 15 Python
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 Python
Python聚类算法之基本K均值实例详解
Nov 20 Python
python 二分查找和快速排序实例详解
Oct 13 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
Python2和Python3的共存和切换使用
Apr 12 Python
python从入门到精通 windows安装python图文教程
May 18 Python
python getpass模块用法及实例详解
Oct 07 Python
谈谈python垃圾回收机制
Sep 27 Python
解决virtualenv -p python3 venv报错的问题
Feb 05 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 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
php防注入及开发安全详细解析
2013/08/09 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
AngularJS实现表单验证
2015/01/28 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
2016/07/27 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
Java分治归并排序算法实例详解
2017/12/12 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
浅谈HTML5新增及移除的元素
2016/06/27 HTML / CSS
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
初中生自我评价
2014/02/01 职场文书
小学英语教学反思案例
2014/02/04 职场文书
颁奖晚会主持词
2014/03/25 职场文书
保证书格式范文
2014/04/28 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
社区端午节活动总结
2015/02/11 职场文书
redis限流的实际应用
2021/04/24 Redis
python数据处理之Pandas类型转换
2022/04/28 Python