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.py
parse()方法控制爬取的連結與爬取結果的處理,通常我們在獲取連結後使用 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