python spider怎么用_python爬虫入门(七)Scrapy框架之Spider类
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类相关推荐
- python request url 转义_Python爬虫入门笔记
来源:blog.csdn.net/weixin_44864260 爬虫四大步骤: 1.获取页面源代码 2.获取标签 3.正则表达式匹配 4.保存数据 1. 获取页面源代码 5个小步骤: 1.伪装成浏览 ...
- python爬虫入门(六) Scrapy框架之原理介绍
Scrapy框架 Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬 ...
- java启动scrapy爬虫,爬虫入门之Scrapy 框架基础功能(九)详解
Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...
- python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)
前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...
- python如何解析网页_Python爬虫入门第一课:如何解析网页
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于肥宅与画家 ,作者AntzUhl 我们编写网络爬虫最主要的目 ...
- python爬取方式_Python 爬虫入门(三)—— 寻找合适的爬取策略
写爬虫之前,首先要明确爬取的数据.然后,思考从哪些地方可以获取这些数据.下面以一个实际案例来说明,怎么寻找一个好的爬虫策略.(代码仅供学习交流,切勿用作商业或其他有害行为) 1).方式一:直接爬取网站 ...
- python网页抓包_python爬虫入门01:教你在 Chrome 浏览器轻松抓包
通过 我们知道了什么是爬虫 也知道了爬虫的具体流程 那么在我们要对某个网站进行爬取的时候 要对其数据进行分析 就要知道应该怎么请求 就要知道获取的数据是什么样的 所以我们要学会怎么抓咪咪! 哦,不对. ...
- python模拟app操作_Python爬虫入门教程 49-100 Appium安装+操作51JOB_APP(模拟手机操作之一)手机APP爬虫-阿里云开发者社区...
爬前准备工作 在开始安装Appium之前,你要先知道Appium是做什么的?Appium 是一个自动化测试开源工具,看到没,做测试用的,它有点类似Selenium,可以自动操作APP实现一系列的操作. ...
- python抓包教程_Python爬虫入门技能:教你通过 Fiddler 进行手机抓包!
哟哟哟~ hi起来 everybody image 今天要说说怎么在我们的手机抓包 学习Python中有不明白推荐加入交流群 号:864573496群里有志同道合的小伙伴 ,互帮互助,群里有不错的视频 ...
最新文章
- web安全之windows系统基础
- R: ggplot2(1)
- halcon 偏折法_Halcon18新技术
- [centos][ntp][administrator] chrony ntp
- 运行wordcount.java_运行hadoop wordcount程序
- 我的Go+语言初体验——(3)Go+ 语言数据类型
- g18 android 4.4,cm11出了最新的android4.4完美的附网址
- 原始尺寸_三维扫描检测,铸件三维全尺寸检测,铸件三维扫描服务
- 基于rdf的php编程,RDF 简介
- java fop_java – Apache FOP使用SimSun显示###
- java识别手写文字_Java 实现OCR 识别图像文字(手写中文)----tess4j
- Ubuntu下的“千千静听”-Audacious
- asp.net930-绿能店电动车租赁系统
- 12月18日23点,2022年卡塔尔世界杯决赛,阿根廷对阵法国,上演巅峰对决,谁能捧走大力神杯?
- VR-AR应用如何改变我们的城市生活?
- url scheme 实现跳转到小程序页面
- 一、创建线程的三种方式
- mysql索引linke和等于_MySQL索引的学习
- Wi-Fi Mesh协议(1)
- 前端开发需要学什么(数据可视化)