1. 程式人生 > >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.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