首页
看点啥
插画图片
首页 看点啥 11、web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

11、web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

2026-08-05 0

xpath表达式

//x表示向下查找n层指定标签,如://div 表示查找所有div标签

/x表示向下查找一层指定的标签

/@x表示查找指定属性的值,可以连缀如:@id @src

[@属性名称="属性值"]表示查找指定属性等于指定值的标签,可以连缀 ,如查找class名称等于指定名称的标签

/text()获取标签文本类容

[x]通过索引获取集合里的指定一个元素

1、将xpath表达式过滤出来的结果进行正则匹配,用正则取最终内容

最后.re('正则')

xpath('//div[@class="showlist"]/li//img')[0].re('alt="(w )')

2、在选择器规则里应用正则进行过滤

[re:正则规则]

xpath('//div[re:test(@class,"showlist")]').extract()

实战使用Scrapy获取一个电商网站的、商品标题、商品链接、和评论数

image

分析源码

image

第一步、编写items.py容器文件

我们已经知道了我们要获取的是、商品标题、商品链接、和评论数

在items.py创建容器接收爬虫获取到的数据

设置爬虫获取到的信息容器类,必须继承scrapy.Item类

scrapy.Field()方法,定义变量用scrapy.Field()方法接收爬虫指定字段的信息

#-*-coding:utf-8-*-#Defineherethemodelsforyourscrapeditems##Seedocumentationin:#http://doc.scrapy.org/en/latest/topics/items.htmlimportscrapy#items.py,文件是专门用于,接收爬虫获取到的数据信息的,就相当于是容器文件classAdcItem(scrapy.Item):#设置爬虫获取到的信息容器类#definethefieldsforyouritemherelike:#name=scrapy.Field()title=scrapy.Field()#接收爬虫获取到的title信息link=scrapy.Field()#接收爬虫获取到的连接信息comment=scrapy.Field()#接收爬虫获取到的商品评论数

第二步、编写pach.py爬虫文件

定义爬虫类,必须继承scrapy.Spider

name设置爬虫名称

allowed_domains设置爬取域名

start_urls设置爬取网址

parse(response)爬虫回调函数,接收response,response里是获取到的html数据对象

xpath()过滤器,参数是xpath表达式

extract()获取html数据对象里的数据

yield item接收了数据的容器对象,返回给pipelies.py

#-*-coding:utf-8-*-importscrapyfromadc.itemsimportAdcItem#导入items.py里的AdcItem类,容器类classPachSpider(scrapy.Spider):#定义爬虫类,必须继承scrapy.Spidername='pach'#设置爬虫名称allowed_domains=['search.dangdang.com']#爬取域名start_urls=['http://category.dangdang.com/pg1-cid4008149.html']#爬取网址defparse(self,response):#parse回调函数item=AdcItem()#实例化容器对象item['title']=response.xpath('//p[@class="name"]/a/text()').extract()#表达式过滤获取到数据赋值给,容器类里的title变量#print(rqi['title'])item['link']=response.xpath('//p[@class="name"]/a/@href').extract()#表达式过滤获取到数据赋值给,容器类里的link变量#print(rqi['link'])item['comment']=response.xpath('//p[@class="star"]//a/text()').extract()#表达式过滤获取到数据赋值给,容器类里的comment变量#print(rqi['comment'])yielditem#接收了数据的容器对象,返回给pipelies.py

robots协议

注意:如果获取的网站在robots.txt文件里设置了,禁止爬虫爬取协议,那么将无法爬取,因为scrapy默认是遵守这个robots这个国际协议的,如果想不遵守这个协议,需要在settings.py设置

到settings.py文件里找到ROBOTSTXT_OBEY变量,这个变量等于False不遵守robots协议,等于True遵守robots协议

#Obeyrobots.txtrulesROBOTSTXT_OBEY=False#不遵循robots协议

第三步、编写pipelines.py数据处理文件

如果需要pipelines.py里的数据处理类能工作,需在settings.py设置文件里的ITEM_PIPELINES变量里注册数据处理类

#Configureitempipelines#Seehttp://scrapy.readthedocs.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES={'adc.pipelines.AdcPipeline':300,#注册adc.pipelines.AdcPipeline类,后面一个数字参数表示执行等级,数值越大越先执行}

注册后pipelines.py里的数据处理类就能工作

定义数据处理类,必须继承object

process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yield item 来的数据对象

#-*-coding:utf-8-*-#Defineyouritempipelineshere##Don'tforgettoaddyourpipelinetotheITEM_PIPELINESsetting#See:http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlclassAdcPipeline(object):#定义数据处理类,必须继承objectdefprocess_item(self,item,spider):#process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yielditem来的数据对象foriinrange(0,len(item['title'])):#可以通过item['容器名称']来获取对应的数据列表title=item['title'][i]print(title)link=item['link'][i]print(link)comment=item['comment'][i]print(comment)returnitem

最后执行

执行爬虫文件,scrapy crawl pach --nolog

image

可以看到我们需要的数据已经拿到了

【转载自:http://www.lqkweb.com】

喜欢(0)

上一篇

10、web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

10、web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

下一篇

文档内外流转权限管控落地实践:企业内网文档分发全链路安全方案

文档内外流转权限管控落地实践:企业内网文档分发全链路安全方案
猜你喜欢