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编写批量卸载手机中安装的android应用脚本
Jul 21 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
python线程池(threadpool)模块使用笔记详解
Nov 17 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
python web基础之加载静态文件实例
Mar 20 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
Pytest框架之fixture的详细使用教程
Apr 07 Python
Python检测端口IP字符串是否合法
Jun 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中基本符号及使用方法
2010/03/23 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
php密码生成类实例
2014/09/24 PHP
php去掉文件前几行的方法
2015/07/29 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
2016/01/14 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
vant 时间选择器--开始时间和结束时间实例
2020/11/04 Javascript
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
浅析Python 条件控制语句
2020/07/15 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
关于幼儿的自我评价
2013/12/18 职场文书
2014教师党员个人自我评议
2014/09/20 职场文书
2014年质量工作总结
2014/11/22 职场文书
店面出租协议书范本
2014/11/28 职场文书
2015学生会文艺部工作总结
2015/04/03 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书