【scrapy爬蟲】csvfeed模板爬取csv文件

手動反爬蟲:原博地址

 知識梳理不易,請尊重勞動成果,文章僅發佈在CSDN網站上,在其他網站看到該博文均屬於未經作者授權的惡意爬取信息

如若轉載,請標明出處,謝謝!

1. 文件網址

首先需要找到要爬取的文件對應的地址,scrapy官網查找過沒有找到相關的示例,於是就進行了百度搜索,這裏借鑑CSDN中Programer Cat 博主的數據,對應的數據網址爲:特派員數據.csv
在這裏插入圖片描述

2. 項目爬取

2.1 新建項目

創建一個csvfeed_demo項目的爬蟲文件夾

scrapy srartproject csvfeed_demo

cd ./csvfeed_demo #接着接入創建好的文件夾下
2.2 創建csvfeed爬蟲模板

緊接着上一個指令進行操作

scrapy genspider -t csvfeed demo gzdata.gov.cn
2.3 修改items.py文件

根據要爬取的csv文件中的信息,可以發現是四列,因此就對應四個字段

import scrapy

class CsvfeedDemoItem(scrapy.Item):
    name = scrapy.Field()
    searchField = scrapy.Field()
    service = scrapy.Field()
    specialty = scrapy.Field()
2.4 修改demo.py文件

進行爬蟲內容代碼的編寫,模板中有詳細的書寫示範,這裏根據自己的數據格式進行改進即可

from scrapy.spiders import CSVFeedSpider
from ..items import CsvfeedDemoItem  
#注意這裏導入剛剛修改的items.py文件中的類名稱(模塊)

class DemoSpider(CSVFeedSpider):
    name = 'demo'
    allowed_domains = ['gzdata.gov.cn']
    #文件的網址
    start_urls = ['http://gzopen.oss-cn-guizhou-a.aliyuncs.com/科技特派員.csv']
    #四個字段,注意不要隨便改模板的參數,這裏就是headers,改成別的變量就報錯
    headers = ['name', 'SearchField', 'Service', 'Specialty'] 
    #csv文件,就是以逗號分隔的
    delimiter = ','  
    #每行的標識就是換行符
    quotechar = '\n'
    
    #這裏設置一下字體的編碼,不然出現亂碼
    def adapt_response(self, response):
        return response.body.decode('gbk')
	
	#進行字段的數據獲取,可以輔助打印輸出
	#不然使用nolog參數,最後什麼也沒有輸出
    def parse_row(self, response, row):
        i = CsvfeedDemoItem()
        try:
            i["name"] = row["name"]
            i["searchField"] = row["SearchField"]
            i["service"] = row["Service"]
            i["specialty"] = row["Specialty"]
            print("name:",row["name"])
            print("searchField:",row["SearchField"])
            print("service:",row["Service"])
            print("specialty:",row["Specialty"])
            print('\n--------------------\n')
        except Exception as e:
            print(e)
        return i
2.5 執行爬蟲

命令行輸入爬蟲指令

scrapy crawl demo --nolog

→ 輸出的結果爲:
在這裏插入圖片描述

3. 保存文件

將爬取的內容保存至本地,這裏採用txt和csv兩種方式存放數據

3.1 修改settings.py文件

一定不要忘記打開pipeline管道,不然只有就算寫了保存數據的代碼,最後也不會生成文件
在這裏插入圖片描述

3.1 修改pipeline.py文件(1)

先將數據保存爲txt文本數據,具體的代碼如下

class CsvfeedDemoPipeline(object):
	def open_spider(self,spider):
		self.file = open('demo.txt', 'w',encoding='gbk')

	def close_spider(self,spider):
		self.file.close()

	def process_item(self, item, spider):
		try:
			name=item['name']
			searchField = item["searchField"]
			service =item["service"]
			specialty = item["specialty"]
			self.file.write('姓名:{}, 研究領域:{}, 服務分類:{}, 專業特長:{}\n'.format(
				name,searchField,service,specialty)
			)
		except:
			pass

→ 輸出的結果爲:(第一行數據暫沒有處理,等有時間了看一下,這裏把標題也輸出了)
在這裏插入圖片描述

3.2 修改pipeline.py文件(2)

接着就是生成csv文件,代碼如下

from scrapy.exporters import CsvItemExporter
#這一部分可以看上一篇的講解,關於csv文件的導出
class CsvfeedDemoPipeline(object):

	def __init__(self):
		self.file = open('demo.csv', 'wb')
		self.exporter = CsvItemExporter(self.file, encoding = 'gbk')
		self.exporter.start_exporting()

	def close_spider(self,spider):
		self.exporter.finish_exporting()
		self.file.close()

	def process_item(self, item, spider):
		self.exporter.export_item(item)
		return item

→ 輸出的結果爲:(和上面的一樣,之前的標題給錄入了,後續處理一下)
在這裏插入圖片描述
至此全部的csvfeed模板爬取csv文件的內容梳理完畢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章