Python使用Scrapy框架爬取數據存入CSV文件(Python爬蟲實戰4)

来源:https://www.cnblogs.com/cloudlab/archive/2018/02/24/8467424.html
-Advertisement-
Play Games

1. Scrapy框架 Scrapy是python下實現爬蟲功能的框架,能夠將數據解析、數據處理、數據存儲合為一體功能的爬蟲框架。 2. Scrapy安裝 1. 安裝依賴包 2. 安裝scrapy 註意事項:scrapy和twisted存在相容性問題,如果安裝twisted版本過高,運行scrapy ...


1. Scrapy框架

  Scrapy是python下實現爬蟲功能的框架,能夠將數據解析、數據處理、數據存儲合為一體功能的爬蟲框架。

2. Scrapy安裝

1. 安裝依賴包

yum install gcc libffi-devel python-devel openssl-devel -y
yum install libxslt-devel -y

 2. 安裝scrapy

pip install scrapy
pip install twisted==13.1.0

 註意事項:scrapy和twisted存在相容性問題,如果安裝twisted版本過高,運行scrapy startproject project_name的時候會提示報錯,安裝twisted==13.1.0即可。

3. 基於Scrapy爬取數據並存入到CSV

3.1. 爬蟲目標,獲取簡書中熱門專題的數據信息,站點為https://www.jianshu.com/recommendations/collections,點擊"熱門"是我們需要爬取的站點,該站點使用了AJAX非同步載入技術,通過F12鍵——Network——XHR,並翻頁獲取到頁面URL地址為https://www.jianshu.com/recommendations/collections?page=2&order_by=hot,通過修改page=後面的數值即可訪問多頁的數據,如下圖:

3.2. 爬取內容

  需要爬取專題的內容包括:專題內容、專題描述、收錄文章數、關註人數,Scrapy使用xpath來清洗所需的數據,編寫爬蟲過程中可以手動通過lxml中的xpath獲取數據,確認無誤後再將其寫入到scrapy代碼中,區別點在於,scrapy需要使用extract()函數才能將數據提取出來。

3.3 創建爬蟲項目

[root@HappyLau jianshu_hot_topic]# scrapy startproject jianshu_hot_topic

#項目目錄結構如下:
[root@HappyLau python]# tree jianshu_hot_topic
jianshu_hot_topic
├── jianshu_hot_topic
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── items.py
│   ├── items.pyc
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── pipelines.pyc
│   ├── settings.py
│   ├── settings.pyc
│   └── spiders
│       ├── collection.py
│       ├── collection.pyc
│       ├── __init__.py
│       ├── __init__.pyc
│       ├── jianshu_hot_topic_spider.py    #手動創建文件,用於爬蟲數據提取
│       └── jianshu_hot_topic_spider.pyc
└── scrapy.cfg

2 directories, 16 files
[root@HappyLau python]# 

 3.4 代碼內容

1. items.py代碼內容,定義需要爬取數據欄位
# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy
from scrapy import Item
from scrapy import Field

class JianshuHotTopicItem(scrapy.Item):
	'''
	@scrapy.item,繼承父類scrapy.Item的屬性和方法,該類用於定義需要爬取數據的子段
	'''
	collection_name = Field()
	collection_description = Field()
	collection_article_count = Field()
	collection_attention_count = Field()

2. piders/jianshu_hot_topic_spider.py代碼內容,實現數據獲取的代碼邏輯,通過xpath實現
[root@HappyLau jianshu_hot_topic]# cat spiders/jianshu_hot_topic_spider.py
#_*_ coding:utf8 _*_

import random
from time import sleep
from scrapy.spiders import CrawlSpider
from scrapy.selector import Selector
from scrapy.http import Request
from jianshu_hot_topic.items import JianshuHotTopicItem 

class jianshu_hot_topic(CrawlSpider):
	'''
	簡書專題數據爬取,獲取url地址中特定的子段信息
	'''
	name = "jianshu_hot_topic"
	start_urls = ["https://www.jianshu.com/recommendations/collections?page=2&order_by=hot"]

	def parse(self,response):
		'''
		@params:response,提取response中特定欄位信息
		'''
		item = JianshuHotTopicItem()
		selector = Selector(response)
		collections = selector.xpath('//div[@class="col-xs-8"]')	
		for collection in collections:
			collection_name = collection.xpath('div/a/h4/text()').extract()[0].strip()
                	collection_description = collection.xpath('div/a/p/text()').extract()[0].strip()
                	collection_article_count = collection.xpath('div/div/a/text()').extract()[0].strip().replace('篇文章','')
                	collection_attention_count = collection.xpath('div/div/text()').extract()[0].strip().replace("人關註",'').replace("· ",'')	
			item['collection_name'] = collection_name
			item['collection_description'] = collection_description
			item['collection_article_count'] = collection_article_count 
			item['collection_attention_count'] = collection_attention_count

			yield item
		
		
		urls = ['https://www.jianshu.com/recommendations/collections?page={}&order_by=hot'.format(str(i)) for i in range(3,11)]
		for url in urls:
			sleep(random.randint(2,7))
			yield Request(url,callback=self.parse)

3. pipelines文件內容,定義數據存儲的方式,此處定義數據存儲的邏輯,可以將數據存儲載MySQL資料庫,MongoDB資料庫,文件,CSV,Excel等存儲介質中,如下以存儲載CSV為例:
[root@HappyLau jianshu_hot_topic]# cat pipelines.py
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


import csv 

class JianshuHotTopicPipeline(object):
    def process_item(self, item, spider):
    	f = file('/root/zhuanti.csv','a+')
	writer = csv.writer(f)
	writer.writerow((item['collection_name'],item['collection_description'],item['collection_article_count'],item['collection_attention_count']))
        return item

4. 修改settings文件,
ITEM_PIPELINES = { 
    'jianshu_hot_topic.pipelines.JianshuHotTopicPipeline': 300,
}

 3.5 運行scrapy爬蟲

  返回到項目scrapy項目創建所在目錄,運行scrapy crawl spider_name即可,如下:

[root@HappyLau jianshu_hot_topic]# pwd
/root/python/jianshu_hot_topic
[root@HappyLau jianshu_hot_topic]# scrapy crawl jianshu_hot_topic
2018-02-24 19:12:23 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: jianshu_hot_topic)
2018-02-24 19:12:23 [scrapy.utils.log] INFO: Versions: lxml 3.2.1.0, libxml2 2.9.1, cssselect 1.0.3, parsel 1.4.0, w3lib 1.19.0, Twisted 13.1.0, Python 2.7.5 (default, Aug  4 2017, 00:39:18) - [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)], pyOpenSSL 0.13.1 (OpenSSL 1.0.1e-fips 11 Feb 2013), cryptography 1.7.2, Platform Linux-3.10.0-693.el7.x86_64-x86_64-with-centos-7.4.1708-Core
2018-02-24 19:12:23 [scrapy.crawler] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'jianshu_hot_topic.spiders', 'SPIDER_MODULES': ['jianshu_hot_topic.spiders'], 'ROBOTSTXT_OBEY': True, 'USER_AGENT': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0', 'BOT_NAME': 'jianshu_hot_topic'}

 查看/root/zhuanti.csv中的數據,即可實現。

 

4. 遇到的問題總結

1. twisted版本不見容,安裝過新的版本導致,安裝Twisted (13.1.0)即可

2. 中文數據無法寫入,提示'ascii'錯誤,通過設置python的encoding為utf即可,如下:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf8')
>>> sys.getdefaultencoding()
'utf8'

 3. 爬蟲無法獲取站點數據,由於headers導致,載settings.py文件中添加USER_AGENT變數,如:

USER_AGENT="Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

 Scrapy使用過程中可能會遇到結果執行失敗或者結果執行不符合預期,其現實的logs非常詳細,通過觀察日誌內容,並結合代碼+網上搜索資料即可解決。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 位置參數 位置參數需與形參一一對應 def test(a,b) #a,b就是位置參數 print(a) print(b) test(1,2) 關鍵字參數 與形參順序無關 def test(x,y) print(x,y) test(x=2,y=3) 位置參數必須在關鍵字參數之前 **kwargs:把N ...
  • 單例模式的定義:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點! 1、懶漢 2、餓漢 3、雙重校驗鎖 4、枚舉 5、靜態內部類 本文永久更新地址: "https://github.com/nnngu/LearningNotes/blob/master/Java%20Basis/019%20%E ...
  • 前言 為了鞏固MVC的開發模式,下麵就寫一個購物車的小案例.. ①構建開發環境 導入需要用到的開發包 建立程式開發包 ②設計實體 書籍實體 購物車與購物項實體 可能我們會這樣設計購物車 上面的做法是不合適的,試想一下: 如果我要購買兩本相同的書,購物車的頁面上就出現了兩本書,而不是書 2。買三本相同 ...
  • Django中的CBV和FBV 一、 CBV CBV是採用面向對象的方法寫視圖文件。 CBV的執行流程: 瀏覽器向伺服器端發送請求,伺服器端的urls.py根據請求匹配url,找到要執行的視圖類,執行dispatch方法區分出是POST請求還是GET請求,執行views.py對應類中的POST方法或 ...
  • 匿名內部類是內部類的簡寫格式。 定義匿名內部類的前提: 內部類必須是繼承一個類或者實現一個介面。 匿名內部類的格式: 其實匿名內部類就是一個匿名子類對象,就是把定義類和建立對象封裝在一起的一種表現形式,形成的是匿名子類對象。 ...
  • auto關鍵字:1.C++98標準auto關鍵字的作用和C語言的相同,表示自動變數,是關於變數存儲位置的類型飾詞,通常不寫,因為局部變數的預設存儲就是auto 2.C++11標準中auto關鍵字不再表示變數的存儲類型,而是用於類型推導 (2.1)auto的基本用法 (2.2)auto和指針或者引用結 ...
  • 前言 很多項目, 都不是一個系統就做完了. 而是好多個系統, 相互協作來完成功能. 那, 系統與系統之間, 不可能完全獨立吧? 如: 在學校所用的管理系統中, 有學生系統, 資產系統, 宿舍系統等等. 當學期結束之後, 是否需要對已經結束的期次進行歸檔操作. 假如歸檔功能在學生系統中, 那點擊歸檔之 ...
  • final關鍵字的含義 在`Java final`,你將不能改變這個引用了,編譯器會檢查代碼,如果你試圖將變數再次初始化的話,編譯器會報編譯錯誤。 final變數 凡是對成員變數或者本地變數(在方法中的或者代碼塊中的變數稱為本地變數)聲明為 的都叫作 變數。 變數經常和 關鍵字一起使用,作為常量。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...