百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python爬虫之Scrapy爬虫框架解密与并爬取亚马逊评论数据

off999 2024-09-21 20:52 31 浏览 0 评论

环境准备:

  1. 使用pip安装lxml和scrapy
  2. scrapy startproject amazon_comment创建一个名为amazon_comment的scrapy爬虫项目

scrapy核心工作流程:

  1. scrapy.spiders.Spider中,有个变量start_urls,是数组类型,表示我们需要让爬虫从哪些链接开始爬取。Spider会以start_urls中的链接,生成一个含有默认回调函数parse的Request,然后使用该链接发出HTTP请求,获取到HTTP响应内容,封装成Response对象,然后把该Response对象作为参数传递给回调函数parse。Spider中最开始的Request是通过调用start_requests()方法来获取的,start_requests()方法是Spider默认实现好的,我们一般不用去实现这个方法。在start_requests()方法中,是通过读取start_urls中的链接,默认的以parse作为回调函数生成Request请求的。
  2. 当获取到Response对象之后,我们可以覆盖回调函数:parse方法,也可以在生成Request指定我们想要的任何回调函数。这样,Response就会作为参数传入我们指定的回调函数里面了(默认是parse方法)。然后,我们可以在我们设置的回调函数里面,从Response对象解析出返回的网页header内容,网页body内容。最常见的就是使用scrapy提供的scrapy.selector.Selector来从网页body中提取出我们想要的网页内容。我们设置的回调函数可以返回一个Item对象,或者是一个dict,或者是Request对象,或者是一个包括这三个东西的可迭代对象。在使用Selector提取网页内容时,最常见的就是使用xpath语法来定位和提取网页中我们想要的数据。
  3. 如果回调函数返回的是Request对象,那么这个Request对象之后又会经过Scrapy处理(发请求,获取Response,传递给回调函数处理)。
  4. 如果我们设置的回调函数返回的是Item对象,那么scrapy会把该Item传递给scrapy中我们定义好的 Item Pipeline处理,所以,我们一般都要实现ItemPipeline,最常见的是在Item Pipeline中把Item对象格式化成我们想要的格式,然后持久化到数据库中。



当我们实现scrapy.spiders.Spider时:

如果是不需要登录,不需要设置header的,只通过一个url就能访问的网页,那么在scrapy.spiders的Spider类中,重写parse(response)方法即可。

如果是不需要登录,需要设置header的(一般设置User-Agent和Referer),通过url就能访问的网页,那么重写parse(response)方法,然后在scrapy.spiders的Spider类中,重写start_requests()方法,在该方法中返回一个设置了headers参数的scrapy.http.Request对象即可。该Request对象还可以设置callback,如果设置了callback,该start_requests方法返回该Request对象后,scrapy内部会根据该Request发出请求,获取scrapy.http.Response对象,然后把Response对象传递给该callback方法作参数,然后执行该callback方法;如果没有设置callback,那么scrapy内部会根据该Request发出请求,获取scrapy.http.Response对象,然后把Response对象传递给parse方法作参数,然后执行parse方法。

如果是需要登录,需要设置header的,通过url访问的网页,那么可以在start_urls中第一个元素设置为登录的url,然后在start_requests()方法中,返回一个设置了formdata参数的scrapy.FormRequest对象。该FormRequest是继承自scrapy.http.Request对象的,FormRequest没有设置额外必需的位置参数,提供了可选参数formdata,当formdata不为None时,method必为POST(FormRequest的__init__方法会自动设置)。FormRequest显然可以当做Request使用。所有Request的默认的回调函数是parse(response)方法,设置了另外的回调函数的话,该parse方法不会被调用。


scrapy核心方法:scrapy.spiders.Spider.start_requests():

上面提到,scrapy在开始工作时会以执行start_requests()方法,该方法中会以start_urls变量中的链接来创建Request,从而下载网页。我们来看一下start_requests()方法的默认实现。

该方法的默认实现为,

通常把该方法实现为一个生成器(包含yield的函数),因为我们会在start_urls中存储我们想爬取的url,对于start_urls中的每一个url的处理,该方法只会调用一次(并不是在该项目的整个爬取过程中只调用一次,而是对于每个url只调用一次),然后调用回调函数处理Response从而获取item。

所以如果我们重写了这个方法,那么我们一般也将它实现为生成器,即在yield中通过make_requests_from_url(url)方法返回默认的Request对象。例如,

scrapy.spiders.Spider中该方法的默认实现会从start_urls中取url来生成scrapy.http.Request,我们在该方法中也可以不使用start_urls而是自己随意使用url生成Request返回。

Request的必备参数只有一个,如Request的构造方法为,

Request的构造方法

FormRequest

在一个网页需要登录或者提交表单数据才能访问时,我们可以不使用默认的Request而是FormRequest。FormRequest从名字上就可以看出,就是为了在请求中模拟表单请求而存在的。

scrapy.FormRequest继承自Request,无额外的必备参数,可以设置formdata参数来使用POST提交数据。

如,


scrapy核心方法:scrapy.spiders.Spider.parse(response):

parse方法是scrapy.http.Request中默认的回调函数,在Request中我们如果不显式声明回调函数的话,Request会默认把parse方法作为回调函数使用。

parse方法必须返回一个包含scrapy.http.Request对象、dict、project.items中定义的Item的可迭代的对象(一般实现为生成器,即在方法最后使用yield item或者yield Request)。

parse方法如果返回scrapy.http.Request对象,则scrapy内部还会通过该Request对象获取scrapy.http.Response,然后传递给该Request中的回调函数并调用该回调函数(默认是parse方法)。

parse方法中可以使用自定义的任何解析器来分析Response,获取item(一般是使用xpath,即scrapy.selector.Selector.xpath()方法,该方法还是返回一个Selector对象)。如


parse方法中提取想要的数据:scrapy.selector.Selector和xpath:

在parse方法中,要从抓取的网页提取感兴趣的数据,需要使用到Selector和xpath。

Selector构造函数为:

Selector(response=None, text=None, type=None, namespaces=None, _root=None, _expr=None)

Selector常用方法为:

  1. extract():返回Selector对象的unicode字符串列表。
  2. extract_first():返回Selector对象匹配到的第一个元素。
  3. xpath():返回一个Selector对象

Selector和xpath使用示例:

  1. Selector(response).xpath('//span/text()').extract(): # 以列表方式返回所有span元素的文本内容。
  2. Selector(response).xpath('//div[@id]/a[1]/text()').extract(): # @表示选取属性,该句表示以列表形式返回所有具有id属性的div中第一个超链接的文本内容。或者使用Selector(response).xpath('//div[@id]/a/text()').extract_first()Selector(response).xpath('//div[@id and @class]/a/text()').extract(): # 多个条件用and连接
  3. Selector(response).xpath('//div[@id="images"]/a[1]/text()').extract(): # @表示选取属性,该句表示以列表形式返回所有id为images的div中第一个超链接的文本内容。
  4. Selector(response).xpath('//div[ul]/a/text()').extract(): # 以列表形式返回所有含有ul子元素的div中所有超链接的文本内容。
  5. Selector(response).xpath('//div[last()]/a/text()').extract(): # 以列表形式返回最后一个div中所有超链接的文本内容。
  6. Selector(response).xpath('//a[contains(@href, "image")]/@href').extract(): # 以列表形式返回所有的超链接中,其href属性包含"image"内容的那些超链接的链接内容。<a href="http://image1.html">超链接</a>这样的链接会被匹配上,因为href属性包含"image"内容。
  7. element_dom.xpath("//div[@class='item_list']//li/a/@href"): # 选取任意位置的class为item_list的div节点的全部子节点li【div后代节点,不管在div中任何位置】中a节点的href属性

xpath链式写法、条件嵌套和多条件查找:

xpath()完之后,仍然可以继续xpath:

注意:xpath链式写法重复利用时,'//'前需要加上点'.'。如在某个xpath对象下继续使用xpath规则提取, 当提取某个对象下的所有某个对象所有tr标签:

xpath多条件查找:

假设xml内容为下图,我们想要查找包含“data”节点并且“data”的type属性为"String"并且“data”节点的文本为“Alpha”的所有“cell”节点(即下图中的第一个data节点):

满足需求的xpath为://cell[data[text()='Alpha'] and data[@type='String']] 或 //cell[data[text()='Alpha' and @type='String']]。//cell表示搜索所有的cell节点,中括号[]里面是条件,满足了中括号中所有条件的cell节点会被搜索出来,data[text()='Alpha' and @type='String']表示(节点文本="Alpha"且type="String")的子节点会被搜索出来。其中,中括号中的多个条件用and连接,相当于Python条件表达式中的and语法。

如果要在加一层结点的话,则中括号[]继续嵌套,想要查找子孙节点为data节点并且该data节点的type属性为"String"并且data节点的文本为“Alpha”的所有Row结点:

满足条件的xpath为://row[cell/data[text()='Alpha'] and cell/data[@type='String']] 或 //row[cell/data[text()='Alpha' and @type='String']]

Selector().css()

与xpath类似,我们也可以在Selector上使用css()方法来查找元素。

css()方法:返回一个Selector对象,采用css语法来查找元素。

css()示例:

  1. Selector(response).css('title::text').extract() # 以列表方式返回所有title元素的文本内容。
  2. Selector(response).css('base::attr(href)').extract() # 以列表方式返回所有base元素的href属性内容。
  3. Selector(response).css('a[href*=image]::attr(href)').extract() # 以列表方式返回所有超链接中,href属性包含"image"的那些超链接的链接内容。
  4. Selector(response).css('a[href*=asks] .num::text').extract() # 以列表方式返回所有超链接中,href属性包含"asks"的那些超链接下,class为num的那些元素的文本内容。


更多文章


Python爬虫框架之Scrapy详解

Python爬虫框架Scrapy架构和爬取糗事百科段子结果

Python爬虫框架Scrapy之爬取糗事百科大量段子数据

喜欢的可以关注,赞赏多多支持一下!

相关推荐

windows无法识别usb(windows无法识别usb设备)
windows无法识别usb(windows无法识别usb设备)

Windows无法识别USB,解决办法如下右键开始菜单打开设备管理器,在通用串行总线控制器中右键点击设备选择“卸载”,完成后重新启动计算机即可解决问题。这有可能是在组策略中禁用了USB口,可以使用快捷键【Win+R】运行gpedit.msc...

2025-11-10 11:51 off999

bios能看到硬盘 开机找不到硬盘

bios里可以看到硬盘,说明硬盘已经被主板识别。进系统找不到,可能硬盘没分区,或者硬盘是动态磁盘,还没有导入或激活。按win+r,输入diskmgmt.msc回车,就打开磁盘管理了,在里面可以给新硬盘...

找回qq聊天记录的方法(找回qq聊天记录怎么找)
  • 找回qq聊天记录的方法(找回qq聊天记录怎么找)
  • 找回qq聊天记录的方法(找回qq聊天记录怎么找)
  • 找回qq聊天记录的方法(找回qq聊天记录怎么找)
  • 找回qq聊天记录的方法(找回qq聊天记录怎么找)
无线网有个红叉(无线网有个红叉,搜索不到网络)

连接失败,路由坏换路由,外网坏,报修无线网络处出现红叉表示设备无法正常工作。请检查网卡驱动是否正常,无线网络开关是否打开。解决方法:查看电脑是否有无线网络开关,且是否打开。进入设备管理器检查网卡驱动是...

thinkpad笔记本官网首页(thinkpad官方商城)

官方网站 国内:http://www.thinkworld.com.cn   国内用户只需要访问国内即可。  ThinkPad,中文名为“思考本”,在2005年以前是IBMPC事业部旗下的便携式计算机...

win7什么版本最好用(win7哪个版本最稳定流畅)

Windows7旗舰版,最好,最稳定。Windows7,是由微软公司(Microsoft)开发的操作系统,内核版本号为WindowsNT6.1。Windows7可供选择的版本有:简易版(Sta...

win7自带虚拟光驱怎么使用(win7系统虚拟光驱安装教程)

以DAEMONTools为例,360软件管家里面就有最新版的下.安装后使用方法如下:第一种方法:在虚拟光驱界面中,你先按一下中间工具栏最左边“+”符号的按钮,添加镜像文件(可以一次添加多个),这...

电脑装系统蓝屏(电脑装系统蓝屏重启开不了机)

蓝屏的原因往往集中在不兼容的硬件和驱动程序、有问题的软件、病毒等。解决办法:1、病毒的原因。使用电脑管家杀毒。2、内存的原因。用橡皮擦把内存条的金手指擦拭一下,把氧化层擦掉,确保内存条安装、运行正常。...

u盘安装软件(u盘安装软件到电视)

第一种情况:软件安装包可以直接下载的。在电脑上将软件安装包下载到本地硬盘,然后将下载好软件安装包拷贝到U盘上即可拿到别的电脑上去安装。分可为exe格式的和rar格式,exe格式直接安装,rar格式的解...

microsoft官网账户注册(microsoft 帐户注册)

要创建Microsoft账户,您可以按照以下步骤进行操作:1.打开任意一个支持浏览器的设备,如电脑、手机或平板电脑。2.在浏览器中输入"Microsoft账户注册"或直接访问Mic...

outlookcom官网(outlook online archive auto)
  • outlookcom官网(outlook online archive auto)
  • outlookcom官网(outlook online archive auto)
  • outlookcom官网(outlook online archive auto)
  • outlookcom官网(outlook online archive auto)
显示器闪屏是什么原因(显示器闪屏是哪里坏了)

解决方法:  一、接触不良导致的显示器闪屏  先查看主机和显示器的电源线连接,是否松动,重新插拔一下电源线。  二、信号干扰导致的显示器闪屏  1、连接显示器的电缆线是否没有屏蔽线圈,如果没有防干扰的...

国产linux操作系统(国产linux操作系统有什么版本)

中国对于操作系统的探索其实并不晚。  早在20世纪60年代中期中国就开始操作系统的研发,那时的比尔·盖茨还只是个迷恋计算机的小字辈,南京大学教授孙钟秀、北京大学杨芙清院士等都是我国操作系统的拓荒者...

免费无需排队的云电脑(不需要排队的云电脑)

目前市场上有一些云游戏平台提供无限时长且无需排队的服务。这些平台通常采用先进的云计算技术和高性能服务器,能够提供稳定流畅的游戏体验。用户可以随时登录并畅玩游戏,无需等待排队。这些平台还提供多种游戏选择...

视频播放器下载量排名(2020视频播放器排行榜)
  • 视频播放器下载量排名(2020视频播放器排行榜)
  • 视频播放器下载量排名(2020视频播放器排行榜)
  • 视频播放器下载量排名(2020视频播放器排行榜)
  • 视频播放器下载量排名(2020视频播放器排行榜)

取消回复欢迎 发表评论: