【scrapy爬蟲】xmlfeed模板爬取滾動新聞

手動反爬蟲:原博地址

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

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

1. 目標網址

中新網即時新聞,界面信息如下,內容是會按時間動態刷新
在這裏插入圖片描述

2. 項目爬取

2.1 新建項目

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

scrapy srartproject xmlfeed_demo

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

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

scrapy genspider -t xmlfeed news chinanews.com
2.3 修改items.py文件

根據新聞網站上面的信息,可以發現可以獲取的字段有四個,分別是新聞標題,新聞鏈接,新聞簡述和更新時間,需要注意的是不是所有的新聞簡述都存在的(比如第一條就沒有)
在這裏插入圖片描述
items.py文件中的代碼修改如下,定義了四個爬取的字段

import scrapy

class XmlfeedDemoItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    link = scrapy.Field()
    description = scrapy.Field()
    pubDate = scrapy.Field()
2.4 修改news.py文件

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

from scrapy.spiders import XMLFeedSpider
from ..items import XmlfeedDemoItem

class NewsSpider(XMLFeedSpider):
    name = 'news'
    allowed_domains = ['chinanews.com']
    start_urls = ['http://www.chinanews.com/rss/scroll-news.xml']    
    iterator = 'iternodes' 
    #iterator屬性:設置使用的迭代器,默認爲“iternodes”(一個基於正則表達式的高性能迭代器),除此之外還有“html”和“xml”迭代器;
    # itertag = 'rss' # 設置開始迭代的節點

    def parse_node(self, response, selector):
        item =XmlfeedDemoItem()
        #直接extract()之後是列表,這裏.extract_first() 和 extract()[0]等價的
        item['title'] = selector.xpath('title/text()').extract()[0]
        item['link'] = selector.xpath('link/text()').extract()[0]
        item['description'] =selector.xpath('description/text()').extract_first()
        item['pubDate'] = selector.xpath('pubDate/text()').extract_first()
        print(item)
        return item
2.5 執行爬蟲

命令行輸入爬蟲指令

scrapy crawl news --nolog

→ 輸出的結果爲:(可以看出在description字段,存在着大量的不需要字符,要進一步清洗)
在這裏插入圖片描述
這時候引入re庫,將description字段的數據進行清洗,修改後的代碼如下

from scrapy.spiders import XMLFeedSpider
from ..items import XmlfeedDemoItem
import re

class NewsSpider(XMLFeedSpider):
    name = 'news'
    allowed_domains = ['chinanews.com']
    start_urls = ['http://www.chinanews.com/rss/scroll-news.xml']    
    iterator = 'iternodes' 
    #iterator屬性:設置使用的迭代器,默認爲“iternodes”(一個基於正則表達式的高性能迭代器),除此之外還有“html”和“xml”迭代器;
    # itertag = 'rss' # 設置開始迭代的節點

    def parse_node(self, response, selector):
        item =XmlfeedDemoItem()
        #直接extract()之後是列表,這裏.extract_first() 和 extract()[0]等價的
        item['title'] = selector.xpath('title/text()').extract()[0]
        item['link'] = selector.xpath('link/text()').extract()[0]
        #這一步是提取表格中的數據,轉化成字符串後,替換掉裏面的格式字符
        description = selector.xpath('description/text()').extract()
        item['description'] = re.sub(r'\s','',''.join(description))
        item['pubDate'] = selector.xpath('pubDate/text()').extract_first()
        print(item)
        return item

→ 輸出的結果爲:(數據清洗完畢,可以在爬取過程中就清洗的數據儘量就清洗好入庫,省的用時候再次進行數據的篩選及清洗)
在這裏插入圖片描述

3. 保存文件

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

3.1 修改settings.py文件

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

3.1 修改pipeline.py文件(1)

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

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

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

	def process_item(self, item, spider):
		try:
			title=item['title']
			link = item['link']
			description =item['description']
			pubDate = item['pubDate']
			self.file.write('新聞標題:{},\n新聞鏈接:{},\n新聞簡述:{},\n發佈時間:{}\n\n'.format(
				title,link,description,pubDate)
			)
		except:
			pass

→ 輸出的結果爲:(爲了方便閱覽,進行可視化輸出)
在這裏插入圖片描述

3.2 修改pipeline.py文件(2)

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

from scrapy.exporters import CsvItemExporter

class XmlfeedDemoPipeline(object):
	def __init__(self):
		self.file = open('news.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

→ 輸出的結果爲:(可以看出最終的輸出的字段順序並不是我們指定的順序,因此需要進行設置)
在這裏插入圖片描述

4. csv文件指定字段順序輸出

將字典變成有序字典之後在轉回原來的字典形式之後,巧妙的解決了這個問題代碼如下,修改的內容在pipeline.py文件中,爲了證明是按照字典的最初循序存放到csv文件中的,在爲轉換數據之前進行打印輸出,最後對比輸出到csv中的內容

from scrapy.exporters import CsvItemExporter
import json
from collections import OrderedDict

class XmlfeedDemoPipeline(object):

	def __init__(self):
		self.file = open('news.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):
		print('默認的字典數據:{}\n'.format(item))
		item = OrderedDict(item)
		item = json.dumps(item, ensure_ascii = False)
		print('調整後的字典數據:{}\n'.format(item))
		self.exporter.export_item(eval(item))
		return item

→ 輸出的結果爲:(這個就和最初的寫的順序一樣了)
在這裏插入圖片描述
至此,xmlfeed模板爬取滾動新聞梳理結束,接下來就進行指定字段輸出的詳解

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