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,

}

爬取的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql5.7 存储二进制_mysql5.7二进制部署

1.解压及创建目录[roothadoop39 local]# tar xzvf mysql-5.7.11-linux-glibc2.5-x86_64.tar.gz[roothadoop39 local]# mv mysql-5.7.11-linux-glibc2.5-x86_64 mysql[roothadoop39 local]# mkdir mysql/arch mysql/data mysql/tmp2.创建my.cnf(见文件)[roothadoop39 local]# vi…

ctypes python3.7_装新的python3.7时ModuleNotFoundError: No module named '_ctypes'

在编译安装新的python3.7的时候报错 ModuleNotFoundError: No module named _ctypes&#xff0c;其实是缺少了一个新需要的开发包libffi-devel&#xff0c;安装后即可yum install libffi-devel -y (包在base)最终显示Installing collected packages: setuptools, pipSuccessful…

python中的str方法和repr方法_Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些

Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些发布时间&#xff1a;2020-11-05 17:11:48来源&#xff1a;亿速云阅读&#xff1a;95作者&#xff1a;Leah本篇文章给大家分享的是有关Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些&#xff0c;小编觉得挺实用的…

requestbody前端怎么传_学习前端开发前的基础知识了解「V1001」

一、什么是http协议?什么是协议&#xff0c;就是一群人协商好了&#xff0c;统一认知的规则。【例】你&#xff0c;我&#xff0c;他&#xff0c;还有她他他&#xff0c;大家一致认定结婚的时候都要给份子钱&#xff0c;这种大家认同的就是协议。http协议&#xff0c;就规定了…

postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator

前两天项目群里发生了关于参数校验的问题讨论&#xff0c;很多开发团队没有对这些做硬性规范时&#xff0c;还是有很多童鞋本着“不多事”的原则&#xff0c;产品文档里没有特别说明就不写。对于2B的产品经理来说&#xff0c;因为一次新迭代&#xff0c;可能回涉及到N多的页面&…

java竖线分割_Java String类的Split以竖线作为分隔符

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请写明出处。https://blog.csdn.net/wo541075754/article/details/50668160问题Java中String类的Split方法&#xff0c;当用“|”进行分割时&#xff0c;发现并不能达到预期的效果。比如&#xff1a;分割字符串“ABC|DE…

ups计算软件_浅析UPS与蓄电池与逆变器的区别

早期的电信机房中&#xff0c;通常采用将220V交流电源经过整流&#xff0c;为48V电池组充电&#xff0c;由电池组直接给程控交换机供电。随着计算机网络和通信网络在电信机房的应用&#xff0c;需要为其提供高质量的220V的交流电源。由于有现有的48V电池组&#xff0c;所以通常…

java字符转为数字_Java 判断字符串能否转化为数字的三种方法

linux shell 常用指令1. man 对你熟悉或不熟悉的命令提供帮助解释 eg:man ls 就可以查看ls相关的用法 注:按q键或者ctrlc退出,在linux下可以使用ctrlc终止当前程序运行. 2. ls 查看目 ...在uwp中复活常用的vb库函数这个博文是纯原创的,转载一定要说明作者是 Nukepayload2!! 在.…

python调用gpu进行运算_tensorflow指定CPU与GPU运算的方法实现

1.指定GPU运算如果安装的是GPU版本&#xff0c;在运行的过程中TensorFlow能够自动检测。如果检测到GPU&#xff0c;TensorFlow会尽可能的利用找到的第一个GPU来执行操作。如果机器上有超过一个可用的GPU&#xff0c;除了第一个之外的其他的GPU默认是不参与计算的。为了让Tensor…

java和网易我的世界有什么区别_网易我的世界手机版对比正版JAVA版我的世界有什么区别?...

你说的这部分都属于游戏内部机制问题首先网易手机版实质上就是基岩版&#xff0c;还是更新贼慢的基岩版(笑)。所以题主完全可以去minecraft wiki查找相关资料然后我说一下我知道的一些主要差异吧刷怪效率吧基岩版明显不如java版&#xff0c;所以通用的黑暗刷怪塔在基岩版是不怎…

python jieba词频统计英文文本_python实战,中文自然语言处理,应用jieba库来统计文本词频...

模块介绍安装&#xff1a;pip install jieba 即可jieba库&#xff0c;主要用于中文文本内容的分词&#xff0c;它有3种分词方法&#xff1a;1. 精确模式, 试图将句子最精确地切开&#xff0c;适合文本分析&#xff1a;2. 全模式&#xff0c;把句子中所有的可以成词的词语都扫描…

java修改已创建程序界面_Java应用程序的Web用户界面

应用服务器。您认为Tomcat在运行时占用空间、学习量或…?我倾向于选择与一个IDE有良好集成的东西。所以EclipseTomcat或者ApacheGeronimo,可能在里面WebSphere Community Edition伪装可以完成这项工作。从我所看到的情况来看,这些足以满足您的需求,而且学习曲线实际上是可以管…

python+selenium获取cookie session_selenium获取cookie及设置cookie

获取cookie&#xff1a;在打开的页面使用self.driver.get_cookies()返回下面数据&#xff1a;[{domain: .linkedin.com,expiry: 1553,httpOnly: False,name: liap,path: /,secure: False,value: true},{domain: .linkedin.com,expiry: 154613,httpOnly: False,name: lidc,path:…

js url解码gbk_JS中对URL进行转码与解码

1. escape 和 unescapeescape()不能直接用于URL编码&#xff0c;它的真正作用是返回一个字符的Unicode编码值。采用unicode字符集对指定的字符串除0-255以外进行编码。所有的空格符、标点符号、特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在…

python常用模块用法_python常用模块(一)

#什么是模块呢&#xff1f;就是用一大坨代码来完成一个功能的代码集合&#xff0c;是不是简单易懂#类似于函数式编程和面向过程编程&#xff0c;函数式编程则完成一个功能&#xff0c;其他代码用来调用即可&#xff0c;提供了代码的重用性和代码间的耦合。而对于一个复杂的功能…

java jdbc init_Java 的JDBC 数据库连接池实现方法

虽然 J2EE 程序员一般都有现成的应用服务器所带的JDBC 数据库连接池&#xff0c;不过对于开发一般的 Java Application 、 Applet 或者 JSP、velocity 时&#xff0c;我们可用的JDBC 数据库连接池并不多&#xff0c;并且一般性能都不好。 Java 程序员都很羡慕 Windows ADO &…

python db文件_python中查看.db文件中表格的名字及表格中的字段操作

1.问题描述&#xff1a; 我桌面上有一个“账号密码.db”文件&#xff0c;我现在想知道里面有几张表格table、表格的名字、表头结构。2.使用SQL语句"""select name from sqlite_master where typetable order by name"""&#xff0c;查找表格的名…

django调用java_07.手把手教将深度学习利用Django将模型发布成服务供java调用

标题问题一.python发布成服务1.先建立一个深度学习模型并训练好2.建立一个预测方法去调用训练好的模型3.建立一个Django工程4.将python利用模型预测的代码放入Django项目中5.get请求加上参数6.github二.JAVA请求url&#xff0c;返回json数据问题python作为一个含科学计算与深度…

springboot转发http请求_网易后端实习生分享:Springboot异常和错误处理规范

由于错误在所难免&#xff0c;异常处理已经成为开发工作中不可或缺的部分。在web开发中&#xff0c;我们通常不希望用户看到一个写满StackTrace的错误页面&#xff1b;同时&#xff0c;我们希望出现错误或发生异常时&#xff0c;开发运维人员可以看到详细的错误信息&#xff0c…

java 偏向锁 怎么用_Java锁升级、偏向锁、轻量级锁

偏向锁当锁对象第一次被线程获取时&#xff0c;虚拟机会把对象头的锁状态标志设置为01(即偏向状态)&#xff0c;同时&#xff0c;使用CAS操作把获取到这个锁的线程的ID记录在对象头的mark word中。如果这个CAS操作成功&#xff0c;那么&#xff0c;以后持有这个偏向锁的线程在进…