Scrapy爬取并保存到TXT文件 |
您所在的位置:网站首页 › 网页保存文本文件 › Scrapy爬取并保存到TXT文件 |
在创建完成项目并创建爬虫的基础上,编写保存到TXT的项目 0.设置setting文件1.将 ROBOTSTXT_OBEY 设置为false 2.将 ITEM_PIPELINES 打开 1.定义items.py数据容器item是Scrapy提供的类似于字典类型的数据容器,它与字典最大的区别在于它规定了统一的数据规格样式,即具有统一性与结构性。这样既方便数据的保存与处理,也可以避免打错字段或数据不一致的情况。 import scrapy class BaikeItem(scrapy.Item): # define the fields for your item here like: name = scrapy.Field() 2.编写spiders.pyparse()方法控制爬取的链接与爬取结果的处理,通常我们在获取链接后使用 scrapy.Request(url,callback=) 方法获取网页,可以callback=后面指定解析的方法。 在解析的方法中,需要定义一个字典类型 dic={},将解析完的结果,按照items定义的容器模板,更新字典内容,并将字典返回。使用return或yield返回,返回后值被pipelines获取到。 class DemoSpider(scrapy.Spider): name = 'demo' # allowed_domains = ['mp.csdn.net'] start_urls = ['http://www.gx211.com/collegemanage/content45_03.shtml'] def parse(self, response): for i in range(45,1000): url='http://www.gx211.com/collegemanage/content'+str(i)+'_03.shtml' try: yield scrapy.Request(url, callback=self.parse_history) except: continue def parse_history(self, response): dic={} try: school = response.css('h1 a::text').extract()[0] dic['name'] = school yield dic except Exception as e: print(e) 3.在pipeline中处理并保存数据定义: open_spider(self,spider) ----爬虫开始运行时执行 close_spider(self,spider) ----爬虫关闭时执行 process_item(self,item,spider) ----在有spiders中的parse函数返回值时执行 我们在open_spider中打开一个txt文件,如果没有该文件则创建,并指定文本写入模式: 在此处指定写入的编码格式为'utf-8' (默认'gdk') def open_spider(self,spider): self.file = open('items2.txt', 'w',encoding='utf-8')在close_spider中关闭txt文件的写入: def close_spider(self,spider): self.file.close()在process_item中指定item中内容按照一定格式写入txt文件: def process_item(self, item, spider): try: res=dict(item) line=res['name'] self.file.write(line+'\n') except: pass注意: windows默认的文件写入格式为'gdk',我们往往要改变编码才能正确写入文件, 在open方法中指定编码方式为'utf-8'是常用的防止乱码和无法写入问题方法 1.为了便于处理,我们首先要将item使用dict()转化为字典类型 2.文本默认为unicode编码,这样无法写入到txt文件中,我们需要将其转换为‘utf-8'编码 可以对unicode字符使用str()方法转化为字符串,这样可以将其写入TXT,但编码还是Unicode 可以对unicode字符使用.encode('utf-8')方法,写入TXT中打开便是中文。 由于python2对汉字不太友好,导致这部分造成了额外的麻烦
全部代码: spiders/demo.py # -*- coding: utf-8 -*- import scrapy import re class DemoSpider(scrapy.Spider): name = 'demo' # allowed_domains = ['mp.csdn.net'] start_urls = ['http://www.gx211.com/collegemanage/content45_03.shtml'] def parse(self, response): for i in range(45,1000): url='http://www.gx211.com/collegemanage/content'+str(i)+'_03.shtml' try: yield scrapy.Request(url, callback=self.parse_history) except: continue def parse_history(self, response): dic={} try: school = response.css('h1 a::text').extract()[0] dic['name'] = school yield dic except Exception as e: print(e)items.py import scrapy class BaikeItem(scrapy.Item): # define the fields for your item here like: name = scrapy.Field()pipelines.py class BaikePipeline(object): def open_spider(self,spider): self.file = open('items2.txt', 'w') def close_spider(self,spider): self.file.close() #item在后期使用的时候还要转换回来,他存在的意义只是防止出错导致程序中止 def process_item(self, item, spider): try: res=dict(item) line=res['name'] self.file.write(line.encode('utf-8')+'\n') except: pass
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |