Spider类

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。

换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。

class scrapy.Spider是最基本的类,所有编写的爬虫必须继承这个类。

主要用到的函数及调用顺序为:

__init__() : 初始化爬虫名字和start_urls列表

start_requests() 调用make_requests_from url():生成Requests对象交给Scrapy下载并返回response

parse() : 解析response,并返回Item或Requests(需指定回调函数)。Item传给Item pipline持久化 , 而Requests交由Scrapy下载,并由指定的回调函数处理(默认parse()),一直进行循环,直到处理完所有的数据为止。

源码参考

#所有爬虫的基类,用户定义的爬虫必须从这个类继承

classSpider(object_ref):#定义spider名字的字符串(string)。spider的名字定义了Scrapy如何定位(并初始化)spider,所以其必须是唯一的。

#name是spider最重要的属性,而且是必须的。

#一般做法是以该网站(domain)(加或不加 后缀 )来命名spider。 例如,如果spider爬取 mywebsite.com ,该spider通常会被命名为 mywebsite

name =None#初始化,提取爬虫名字,start_ruls

def __init__(self, name=None, **kwargs):if name is notNone:

self.name=name#如果爬虫没有名字,中断后续操作则报错

elif not getattr(self, 'name', None):raise ValueError("%s must have a name" % type(self).__name__)#python 对象或类型通过内置成员__dict__来存储成员信息

self.__dict__.update(kwargs)#URL列表。当没有指定的URL时,spider将从该列表中开始进行爬取。 因此,第一个被获取到的页面的URL将是该列表之一。 后续的URL将会从获取到的数据中提取。

if not hasattr(self, 'start_urls'):

self.start_urls=[]#打印Scrapy执行后的log信息

def log(self, message, level=log.DEBUG, **kw):

log.msg(message, spider=self, level=level, **kw)#判断对象object的属性是否存在,不存在做断言处理

defset_crawler(self, crawler):assert not hasattr(self, '_crawler'), "Spider already bounded to %s" %crawler

self._crawler=crawler

@propertydefcrawler(self):assert hasattr(self, '_crawler'), "Spider not bounded to any crawler"

returnself._crawler

@propertydefsettings(self):returnself.crawler.settings#该方法将读取start_urls内的地址,并为每一个地址生成一个Request对象,交给Scrapy下载并返回Response

#该方法仅调用一次

defstart_requests(self):for url inself.start_urls:yieldself.make_requests_from_url(url)#start_requests()中调用,实际生成Request的函数。

#Request对象默认的回调函数为parse(),提交的方式为get

defmake_requests_from_url(self, url):return Request(url, dont_filter=True)#默认的Request对象回调函数,处理返回的response。

#生成Item或者Request对象。用户必须实现这个类

defparse(self, response):raiseNotImplementedError

@classmethoddefhandles_request(cls, request):returnurl_is_from_spider(request.url, cls)def __str__(self):return "" % (type(self).__name__, self.name, id(self))__repr__ = __str__

主要属性和方法

name

定义spider名字的字符串。

例如,如果spider爬取 mywebsite.com ,该spider通常会被命名为 mywebsite

allowed_domains

包含了spider允许爬取的域名(domain)的列表,可选。

start_urls

初始URL元祖/列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。

start_requests(self)

该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取(默认实现是使用 start_urls 的url)的第一个Request。

当spider启动爬取并且未指定start_urls时,该方法被调用。

parse(self, response)

当请求url返回网页没有指定回调函数时,默认的Request对象回调函数。用来处理网页返回的response,以及生成Item或者Request对象。

Scrapy框架爬取--->>>腾讯招聘的所有职位信息

1.先分析腾讯招聘网站url

第一页:https://hr.tencent.com/position.php?&start=0#a

第二页:https://hr.tencent.com/position.php?&start=10#a

第三页:https://hr.tencent.com/position.php?&start=20#a

发现有的职位类别为空,所有在找职位类别的时候空值也要加进去,否则for循环取不到值会直接退出了 ./td[2]/text()|./td[2]

2.目录结构

3.items.py

#-*- coding: utf-8 -*-

importscrapyclassTencentItem(scrapy.Item):#职位名

positionname =scrapy.Field()#详情连接

positionlink =scrapy.Field()#职位类别

positionType =scrapy.Field()#招聘人数

peopleNum =scrapy.Field()#工作地点

workLocation =scrapy.Field()#发布时间

publishTime = scrapy.Field()

4.tencentPosition.py

tencentPosition.py用命令创建 scrapy genspider tencentPosition "tencent.com"

#-*- coding: utf-8 -*-

importscrapyfrom tencent.items importTencentItemclassTencentpositionSpider(scrapy.Spider):

name= "tencent"allowed_domains= ["tencent.com"]

url= "http://hr.tencent.com/position.php?&start="offset=0

start_urls= [url +str(offset)]defparse(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()|./td[2]").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]yielditemif self.offset < 3171:

self.offset+= 10

#每次处理完一页的数据之后,重新发送下一页页面请求

#self.offset自增10,同时拼接为新的url,并调用回调函数self.parse处理Response

yield scrapy.Request(self.url + str(self.offset), callback = self.parse)

5.pipelines.py

#-*- coding: utf-8 -*-

importjsonclassTencentPipeline(object):def __init__(self):

self.filename= open("tencent.json", "w")defprocess_item(self, item, spider):

text= json.dumps(dict(item), ensure_ascii = False) + ",\n"self.filename.write(text.encode("utf-8"))returnitemdefclose_spider(self, spider):

self.filename.close()

6.settings.py里面的设置

ROBOTSTXT_OBEY =True

DOWNLOAD_DELAY= 4 #防止爬取过快丢失数据

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={'tencent.pipelines.TencentPipeline': 300,

}

爬取的结果

python spider怎么用_python爬虫入门(七)Scrapy框架之Spider类相关推荐

  1. python request url 转义_Python爬虫入门笔记

    来源:blog.csdn.net/weixin_44864260 爬虫四大步骤: 1.获取页面源代码 2.获取标签 3.正则表达式匹配 4.保存数据 1. 获取页面源代码 5个小步骤: 1.伪装成浏览 ...

  2. python爬虫入门(六) Scrapy框架之原理介绍

    Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...

  3. java启动scrapy爬虫,爬虫入门之Scrapy 框架基础功能(九)详解

    Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...

  4. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  5. python如何解析网页_Python爬虫入门第一课:如何解析网页

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于肥宅与画家 ,作者AntzUhl 我们编写网络爬虫最主要的目 ...

  6. python爬取方式_Python 爬虫入门(三)—— 寻找合适的爬取策略

    写爬虫之前,首先要明确爬取的数据.然后,思考从哪些地方可以获取这些数据.下面以一个实际案例来说明,怎么寻找一个好的爬虫策略.(代码仅供学习交流,切勿用作商业或其他有害行为) 1).方式一:直接爬取网站 ...

  7. python网页抓包_python爬虫入门01:教你在 Chrome 浏览器轻松抓包

    通过 我们知道了什么是爬虫 也知道了爬虫的具体流程 那么在我们要对某个网站进行爬取的时候 要对其数据进行分析 就要知道应该怎么请求 就要知道获取的数据是什么样的 所以我们要学会怎么抓咪咪! 哦,不对. ...

  8. python模拟app操作_Python爬虫入门教程 49-100 Appium安装+操作51JOB_APP(模拟手机操作之一)手机APP爬虫-阿里云开发者社区...

    爬前准备工作 在开始安装Appium之前,你要先知道Appium是做什么的?Appium 是一个自动化测试开源工具,看到没,做测试用的,它有点类似Selenium,可以自动操作APP实现一系列的操作. ...

  9. python抓包教程_Python爬虫入门技能:教你通过 Fiddler 进行手机抓包!

    哟哟哟~ hi起来 everybody image 今天要说说怎么在我们的手机抓包 学习Python中有不明白推荐加入交流群 号:864573496群里有志同道合的小伙伴 ,互帮互助,群里有不错的视频 ...

最新文章

  1. web安全之windows系统基础
  2. R: ggplot2(1)
  3. halcon 偏折法_Halcon18新技术
  4. [centos][ntp][administrator] chrony ntp
  5. 运行wordcount.java_运行hadoop wordcount程序
  6. 我的Go+语言初体验——(3)Go+ 语言数据类型
  7. g18 android 4.4,cm11出了最新的android4.4完美的附网址
  8. 原始尺寸_三维扫描检测,铸件三维全尺寸检测,铸件三维扫描服务
  9. 基于rdf的php编程,RDF 简介
  10. java fop_java – Apache FOP使用SimSun显示###
  11. java识别手写文字_Java 实现OCR 识别图像文字(手写中文)----tess4j
  12. Ubuntu下的“千千静听”-Audacious
  13. asp.net930-绿能店电动车租赁系统
  14. 12月18日23点,2022年卡塔尔世界杯决赛,阿根廷对阵法国,上演巅峰对决,谁能捧走大力神杯?
  15. VR-AR应用如何改变我们的城市生活?
  16. url scheme 实现跳转到小程序页面
  17. 一、创建线程的三种方式
  18. mysql索引linke和等于_MySQL索引的学习
  19. Wi-Fi Mesh协议(1)
  20. 前端开发需要学什么(数据可视化)

热门文章

  1. 【操作系统复习】进程控制
  2. 虚拟机 NAT模式与桥接模式的区别
  3. QT高级编程之基本函数用法
  4. C++11新特性以及std::thread多线程编程
  5. 2017年网易校招题 买苹果
  6. h命令可以获取mysql客户端的帮助信息_如何获取MySQL帮助信息
  7. 爱尔兰圣三一学院计算机全球排名,QS世界大学学科排名,爱尔兰圣三一学院20个学科进世界百强...
  8. 金昌搜索引擎优化网络推广_网络推广优化企业服务
  9. python获取当前文件路径
  10. MFC制作员工信息管理系统