Python爬虫之Scrapy爬虫框架解密与并爬取亚马逊评论数据
ccwgpt 2024-09-27 07:29 156 浏览 0 评论
环境准备:
- 使用pip安装lxml和scrapy
- scrapy startproject amazon_comment创建一个名为amazon_comment的scrapy爬虫项目
scrapy核心工作流程:
- 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请求的。
- 当获取到Response对象之后,我们可以覆盖回调函数:parse方法,也可以在生成Request指定我们想要的任何回调函数。这样,Response就会作为参数传入我们指定的回调函数里面了(默认是parse方法)。然后,我们可以在我们设置的回调函数里面,从Response对象解析出返回的网页header内容,网页body内容。最常见的就是使用scrapy提供的scrapy.selector.Selector来从网页body中提取出我们想要的网页内容。我们设置的回调函数可以返回一个Item对象,或者是一个dict,或者是Request对象,或者是一个包括这三个东西的可迭代对象。在使用Selector提取网页内容时,最常见的就是使用xpath语法来定位和提取网页中我们想要的数据。
- 如果回调函数返回的是Request对象,那么这个Request对象之后又会经过Scrapy处理(发请求,获取Response,传递给回调函数处理)。
- 如果我们设置的回调函数返回的是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常用方法为:
- extract():返回Selector对象的unicode字符串列表。
- extract_first():返回Selector对象匹配到的第一个元素。
- xpath():返回一个Selector对象
Selector和xpath使用示例:
- Selector(response).xpath('//span/text()').extract(): # 以列表方式返回所有span元素的文本内容。
- 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连接
- Selector(response).xpath('//div[@id="images"]/a[1]/text()').extract(): # @表示选取属性,该句表示以列表形式返回所有id为images的div中第一个超链接的文本内容。
- Selector(response).xpath('//div[ul]/a/text()').extract(): # 以列表形式返回所有含有ul子元素的div中所有超链接的文本内容。
- Selector(response).xpath('//div[last()]/a/text()').extract(): # 以列表形式返回最后一个div中所有超链接的文本内容。
- Selector(response).xpath('//a[contains(@href, "image")]/@href').extract(): # 以列表形式返回所有的超链接中,其href属性包含"image"内容的那些超链接的链接内容。<a href="http://image1.html">超链接</a>这样的链接会被匹配上,因为href属性包含"image"内容。
- 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()示例:
- Selector(response).css('title::text').extract() # 以列表方式返回所有title元素的文本内容。
- Selector(response).css('base::attr(href)').extract() # 以列表方式返回所有base元素的href属性内容。
- Selector(response).css('a[href*=image]::attr(href)').extract() # 以列表方式返回所有超链接中,href属性包含"image"的那些超链接的链接内容。
- Selector(response).css('a[href*=asks] .num::text').extract() # 以列表方式返回所有超链接中,href属性包含"asks"的那些超链接下,class为num的那些元素的文本内容。
更多文章
Python爬虫框架之Scrapy详解
Python爬虫框架Scrapy架构和爬取糗事百科段子结果
Python爬虫框架Scrapy之爬取糗事百科大量段子数据
喜欢的可以关注,赞赏多多支持一下!
相关推荐
- css布局方案汇总(28个实例图文并茂)
-
简介布局在我们前端日常开发来说是非常重要的,一个好的布局能简化代码的同时还能提高网页的性能。常见的布局方法有浮动(float)布局、绝对定位(position)布局、表格布局(table)、弹性(fl...
- 十款免费的CSS框架加速Web开发
-
Pure这是Yahoo最新推出的一款CSS框架,它只有HTML和CSS,没有使用任何JavaScript语言。总大小只有4.4kb,但功能却非常丰富,支持响应式样式和各种导航、表格、表单、按钮、网格和...
- Tailwind CSS 是不是目前世上最好的CSS框架?
-
转载说明:原创不易,未经授权,谢绝任何形式的转载今天看了一篇国外大佬对TailwindCSS的看法,在这里分享给大家,看看大家是否赞同,以下是其相关内容的整理,由于翻译水平有限,欢迎大家讨论和指...
- 下一代 CSS 框架:Mojo CSS,为何如此受欢迎?
-
TailwindCSS推出即受到广大开发者的欢迎,当前Githubstar数已达77.8k。它是一个功能类优先(utility-first)的CSS框架,它提供了一系列功能类,让开发者...
- 常见的几种摄影构图方式
-
摄影构图,是一种在摄影画面中表现结构美、形式美的方式。构图能让摄影主体更加突出,画面更加有序。所以说,构图在摄影中是非常重要的一个环节。无论是前期构图还是后期构图,摄影者都要对构图有一个比较深的了解。...
- 风光摄影10大构图技巧,会用构图,照片更容易好看
-
风光摄影10大构图技巧,会用构图,照片更容易好看先解释一下,为什么会使用构图之后,照片更容易好看?因为,构图是根据很多好看的照片,总结出来的技巧,使用这些构图技巧,就相当于站在了巨人的肩膀上,也就是用...
- 掌握框式构图的摄影技巧,会让摄影爱好者的作品更有魅力!
-
很多摄影爱好者都知道摄影构图中有个框式构图,但大多数人对框式构图的摄影技巧,却一知半解。所以摄影爱好者们有必要更全面、深入的了解,并掌握框式构图,会对你摄影水平的提高更有帮助。【欢迎点击上方关注:金立...
- 这个构图很简洁,但为什么不耐看?
-
摄影爱好者最常犯的错就是过于复杂、主体不明确,但当遇到简单的场景往往又会出现单调、不耐看的状况。为什么会这样?说白了还是观察力不够。下面是本周的摄影入围习作,我们一起来看看这些照片中主体、陪体以及背景...
- 初学者需要记牢的八种常用构图法
-
作者:冯海军摄影中,构图很关键,决定照片是否成功,所以在构图上要加以重视和推敲,虽然说构图无定法,但是也有很多的规律可循,以下列举几种常用构图,会对初学者有很大的帮助。多彩刘卫洲摄苏州姑苏俱乐部(...
- 构图这件事不难!掌握14种构图模式就稳了
-
如果说视觉元素是视觉信息的载体,那么构图就是视觉元素的载体。没有适当形式的构图对视觉元素有机、有序地承载,平面设计将无法传达预定的设计意图和视觉信息。因此,对于平面设计而言,构图是平面设计不可或缺的重...
- 框架构图如何使用?
-
1分钟教你用手机拍大片。今天我们利用框架构图,在不同的运镜方法下拍摄。·首先将手机贴近地面,拍摄人物走过的画面。·然后利用3D效果的背景衬托,将手机贴近地面,以低角度仰拍人物。·最后我们用高清画质来呈...
- 面构图的5种超实用的构图形式 前景构图,框架构图,填充构图
-
面构图的5种超实用的构图形式。为什么有的人拍摄的照片好看又舒适?仔细观察会发现他们善用构图。大家好,今天带大家了解摄影中5种超实用的面构图形式。·一、前景构图。前景是构图中的神奇要素,可以提升照片的表...
- 一看就懂!跟着马格南的大师学构图
-
马格南图片社是迄今为止全球最重要的摄影图片社,其网站包涵了太多经典的名字和照片。细细品味这些经典图片,能够学到很多有用的构图手法。跟着大师走,总不会错吧?前后景的运用这似乎是非常常见的一种手法,仔细看...
- 这才是框架构图,有想法!能给你启发么?
-
框架构图大家并不陌生,但并不是有一个框就行了。框架构图用得不好,就很死板生硬,给人感觉很假。如果你理解透了,拍出的作品不会单调。今天就给大家分享一下框架构图,你看看有哪些妙用?1.广角与长焦的应用长焦...
- 7B小模型写好学术论文,新框架告别AI引用幻觉
-
ScholarCopilot团队投稿量子位|公众号QbitAI学术写作通常需要花费大量精力查询文献引用,而以ChatGPT、GPT-4等为代表的通用大语言模型(LLM)虽然能够生成流畅文本,但...