程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

學python,怎麼能不學習scrapy呢!

編輯:Python

摘要:本文講述如何編寫scrapy爬蟲。

本文分享自華為雲社區《學python,怎麼能不學習scrapy呢,這篇博客帶你學會它》,作者: 夢想橡皮擦 。

在正式編寫爬蟲案例前,先對 scrapy 進行一下系統的學習。

scrapy 安裝與簡單運行

使用命令 pip install scrapy 進行安裝,成功之後,還需要隨手收藏幾個網址,以便於後續學習使用。

  • scrapy 官網:https://scrapy.org;
  • scrapy 文檔:https://doc.scrapy.org/en/latest/intro/tutorial.html;
  • scrapy 更新日志:https://docs.scrapy.org/en/latest/news.html。

安裝完畢之後,在控制台直接輸入 scrapy,出現如下命令表示安裝成功。

> scrapy
Scrapy 2.5.0 - no active project
Usage:
scrapy <command> [options] [args]
Available commands:

上述截圖是 scrapy 的內置命令列表,標准的格式的 scrapy <command> <options> <args>,通過 scrapy <command> -h 可以查看指定命令的幫助手冊。

scrapy 中提供兩種類型的命令,一種是全局的,一種的項目中的,後者需要進入到 scrapy 目錄才可運行。

這些命令無需一開始就完全記住,隨時可查,有幾個比較常用,例如:

**scrpy startproject <項目名> **

該命令先依據 項目名 創建一個文件夾,然後再文件夾下創建於個 scrpy 項目,這一步是後續所有代碼的起點。

> scrapy startproject my_scrapy
> New Scrapy project 'my_scrapy', using template directory 'e:\pythonproject\venv\lib\site-packages\scrapy\templates\project', created in: # 一個新的 scrapy 項目被創建了,使用的模板是 XXX,創建的位置是 XXX
E:\pythonProject\滾雪球學Python第4輪\my_scrapy
You can start your first spider with: # 開啟你的第一個爬蟲程序
cd my_scrapy # 進入文件夾
scrapy genspider example example.com # 使用項目命令創建爬蟲文件

上述內容增加了一些注釋,可以比對著進行學習,默認生成的文件在 python 運行時目錄,如果想修改項目目錄,請使用如下格式命令:

scrapy startproject myproject [project_dir]

例如

scrapy startproject myproject d:/d1

命令依據模板創建出來的項目結構如下所示,其中紅色下劃線的是項目目錄,而綠色下劃線才是 scrapy 項目,如果想要運行項目命令,則必須先進入紅色下劃線 my_scrapy 文件夾,在項目目錄中才能控制項目。

下面生成一個爬蟲文件

使用命令 scrapy genspider [-t template] <name> <domain> 生成爬蟲文件,該方式是一種快捷操作,也可以完全手動創建。創建的爬蟲文件會出現在 當前目錄或者項目文件夾中的 spiders 文件夾中,name 是爬蟲名字,domain 用在爬蟲文件中的 alowed_domains 和 start_urls 數據中,[-t template] 表示可以選擇生成文件模板。

查看所有模板使用如下命令,默認模板是 basic。

> scrapy genspider -l
basic
crawl
csvfeed
xmlfeed

創建第一個 scrapy 爬蟲文件,測試命令如下:

>scrapy genspider pm imspm.com
Created spider 'pm' using template 'basic' in module:
my_project.spiders.pm

此時在 spiders 文件夾中,出現 pm.py 文件,該文件內容如下所示:

import scrapy
class PmSpider(scrapy.Spider):
name = 'pm'
allowed_domains = ['imspm.com']
start_urls = ['http://imspm.com/']
def parse(self, response):
pass

測試 scrapy 爬蟲運行

使用命令 scrapy crawl <spider>,spider 是上文生成的爬蟲文件名,出現如下內容,表示爬蟲正確加載。

>scrapy crawl pm
2021-10-02 21:34:34 [scrapy.utils.log] INFO: Scrapy 2.5.0 started (bot: my_project)
[...]

scrapy 基本應用

scrapy 工作流程非常簡單:

  1. 采集第一頁網頁源碼;
  2. 解析第一頁源碼,並獲取下一頁鏈接;
  3. 請求下一頁網頁源碼;
  4. 解析源碼,並獲取下一頁源碼;
  5. […]
  6. 過程當中,提取到目標數據之後,就進行保存。

接下來為大家演示 scrapy 一個完整的案例應用,作為 爬蟲 120 例 scrapy 部分的第一例。

> scrapy startproject my_project 爬蟲
> cd 爬蟲
> scrapy genspider pm imspm.com

獲得項目結構如下:

上圖中一些文件的簡單說明。

  • scrapy.cfg:配置文件路徑與部署配置;
  • items.py:目標數據的結構;
  • middlewares.py:中間件文件;
  • pipelines.py:管道文件;
  • settings.py:配置信息。

使用 scrapy crawl pm 運行爬蟲之後,所有輸出內容與說明如下所示:

上述代碼請求次數為 7 次,原因是在 pm.py 文件中默認沒有添加 www,如果增加該內容之後,請求次數變為 4。

現在的 pm.py 文件代碼如下所示:

import scrapy
class PmSpider(scrapy.Spider):
name = 'pm'
allowed_domains = ['www.imspm.com']
start_urls = ['http://www.imspm.com/']
def parse(self, response):
print(response.text)

其中的 parse 表示請求 start_urls 中的地址,獲取響應之後的回調函數,直接通過參數 response 的 .text 屬性進行網頁源碼的輸出。

獲取到源碼之後,要對源碼進行解析與存儲

在存儲之前,需要手動定義一個數據結構,該內容在 items.py 文件實現,對代碼中的類名進行了修改,MyProjectItem → ArticleItem。

import scrapy
class ArticleItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field() # 文章標題
url = scrapy.Field() # 文章地址
author = scrapy.Field() # 作者

修改 pm.py 文件中的 parse 函數,增加網頁解析相關操作,該操作類似 pyquery 知識點,直接觀察代碼即可掌握。

 def parse(self, response):
# print(response.text)
list_item = response.css('.list-item-default')
# print(list_item)
for item in list_item:
title = item.css('.title::text').extract_first() # 直接獲取文本
url = item.css('.a_block::attr(href)').extract_first() # 獲取屬性值
author = item.css('.author::text').extract_first() # 直接獲取文本
print(title, url, author)

其中 response.css 方法返回的是一個選擇器列表,可以迭代該列表,然後對其中的對象調用 css 方法。

  • item.css('.title::text'),獲取標簽內文本;
  • item.css('.a_block::attr(href)'),獲取標簽屬性值;
  • extract_first():解析列表第一項;
  • extract():獲取列表。

在 pm.py 中導入 items.py 中的 ArticleItem 類,然後按照下述代碼進行修改:

 def parse(self, response):
# print(response.text)
list_item = response.css('.list-item-default')
# print(list_item)
for i in list_item:
item = ArticleItem()
title = i.css('.title::text').extract_first() # 直接獲取文本
url = i.css('.a_block::attr(href)').extract_first() # 獲取屬性值
author = i.css('.author::text').extract_first() # 直接獲取文本
# print(title, url, author)
# 對 item 進行賦值
item['title'] = title
item['url'] = url
item['author'] = author
yield item

此時在運行 scrapy 爬蟲,就會出現如下提示信息。

此時完成了一個單頁爬蟲

接下來對 parse 函數再次改造,使其在解析完第 1 頁之後,可以解析第 2 頁數據。

 def parse(self, response):
# print(response.text)
list_item = response.css('.list-item-default')
# print(list_item)
for i in list_item:
item = ArticleItem()
title = i.css('.title::text').extract_first() # 直接獲取文本
url = i.css('.a_block::attr(href)').extract_first() # 獲取屬性值
author = i.css('.author::text').extract_first() # 直接獲取文本
# print(title, url, author)
# 對 item 進行賦值
item['title'] = title
item['url'] = url
item['author'] = author
yield item
next = response.css('.nav a:nth-last-child(2)::attr(href)').extract_first() # 獲取下一頁鏈接
# print(next)
# 再次生成一個請求
yield scrapy.Request(url=next, callback=self.parse)

上述代碼中,變量 next 表示下一頁地址,通過 response.css 函數獲取鏈接,其中的 css 選擇器請重點學習。
yield scrapy.Request(url=next, callback=self.parse) 表示再次創建一個請求,並且該請求的回調函數是 parse 本身,代碼運行效果如下所示。

如果想要保存運行結果,運行下面的命令即可。

scrapy crawl pm -o pm.json

如果想要將每條數據存儲為單獨一行,使用如下命令即可 scrapy crawl pm -o pm.jl 。

生成的文件還支持 csv 、 xml、marchal、pickle ,可自行嘗試。

下面將數據管道利用起來

打開 pipelines.py 文件,修改類名 MyProjectPipeline → TitlePipeline,然後編入如下代碼:

class TitlePipeline:
def process_item(self, item, spider): # 移除標題中的空格
if item["title"]:
item["title"] = item["title"].strip()
return item
else:
return DropItem("異常數據")

該代碼用於移除標題中的左右空格。

編寫完畢,需要在 settings.py 文件中開啟 ITEM_PIPELINES 配置。

ITEM_PIPELINES = {
'my_project.pipelines.TitlePipeline': 300,
}

300 是 PIPELINES 運行的優先級順序,根據需要修改即可。再次運行爬蟲代碼,會發現標題的左右空格已經被移除。

到此 scrapy 的一個基本爬蟲已經編寫完畢。

點擊關注,第一時間了解華為雲新鮮技術~

學python,怎麼能不學習scrapy呢!的更多相關文章

  1. 【我要學python】面向對象系統學習

    第一節:初識類的定義和調用 c1.py #類 = 面向對象 #類 最基本作用:封裝 #類中不僅可以定義變量 還可以定義函數等等,例: class student( ): name = ' ' age ...

  2. 零基礎學Python不迷茫——基本學習路線及教程!

    什麼是Python? 在過去的2018年裡,Python成功的證明了它自己有多火,它那“簡潔”與明了的語言成功的吸引了大批程序員與大數據應用這的注意,的確,它的實用性的確是配的上它的熱度.   Pyt ...

  3. 學Python的第五天

    最近忙著學MySQL,但是小編也不會放棄學Python!!! 因為熱愛所以學習~ 好了各位,進入正題,由於時間問題今天學的不是很多.... #!/usr/bin/env python # -*- co ...

  4. python初學者必看學習路線圖!!!

    python應該是近幾年比較火的語言之一,很多人剛學python不知道該如何學習,尤其是沒有編程基礎想要從事程序員工作的小白,想必應該都會有此疑惑,包括我剛學python的時候也是通過從網上查找相關資 ...

  5. 怎麼快速學python?酒店女服務員一周內學會Python,一年後成為程序員

    怎麼快速學python?有人說,太難!但這個女生卻在一個星期內入門Python,一個月掌握python所有的基礎知識點. 說出來你應該不信,剛大學畢業的女生:琳,一邊在酒店打工,一邊自學python, ...

  6. 小白學 Python 爬蟲(33):爬蟲框架 Scrapy 入門基礎(一)

    人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置准備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置准備(二)Li ...

  7. 他學習一年Python找不到工作,大佬都說你別再學Python了!

    引言: 都說,滴水穿石非一日之功.然而有些人即使奮斗一輩子也比不上別人一年,別人學習一年比不得你學習一個月.其中緣由,有些人看了大半輩子還沒看明白. 即使Python這麼火,為何你學習一年的Pytho ...

  8. 小白學 Python 爬蟲(34):爬蟲框架 Scrapy 入門基礎(二)

    人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置准備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置准備(二)Li ...

  9. 小白學 Python 爬蟲(35):爬蟲框架 Scrapy 入門基礎(三) Selector 選擇器

    人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置准備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置准備(二)Li ...

  10. 小白學 Python 爬蟲(36):爬蟲框架 Scrapy 入門基礎(四) Downloader Middleware

    人生苦短,我用 Python 前文傳送門: 小白學 Python 爬蟲(1):開篇 小白學 Python 爬蟲(2):前置准備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置准備(二)Li ...

隨機推薦

  1. linux下python版webshell後門查殺工具

    使用說明: 1.查殺指定路徑:python webshell.py 路徑 2.按時間查找文件:python webshell.py 路徑 “2013-09-28 00:00:00″ # -*- cod ...

  2. SQL Server 最小化日志操作解析,應用

    Sql Server 中數據庫在BULK_LOGGED/SIMPLE模式下的一些操作會采用最小化日志的記錄方式,以減小tran log落盤日志量從而提高整體性能. 這裡我簡單介紹下哪些操作在什麼樣的情 ...

  3. Web Token JWT

    基於Token的WEB後台認證機制 JSON Web Token in ASP.NET Web API 2 using Owin 翻譯:Token Authentication in ASP.NET ...

  4. 理解ROS rqt_console和 roslaunch

    1.使用rqt_console和roslaunch 這篇教程將介紹使用rqt_console和rqt_logger_level來調試以及使用roslaunch一次啟動許多nodes.如果你使用ROS  ...

  5. Cocos2d-android (02) 添加一個精靈對象

    什麼是精靈: 1.精靈就是游戲當中的一個元素,通常用於代表畫面當前中的一個事物,例如主人公,NPC和背景元素等: 2.一個精靈對象通常都與一張圖片關聯 3.精靈對象可以通過動作對象(CCAction) ...

  6. 《Genesis-3D開源游戲引擎--橫版格斗游戲制作教程08:虛擬鍵盤實現》--本系列完結

    8.虛擬鍵盤實現 概述: 硬鍵盤就是物理鍵盤,平時敲的那種.軟鍵盤是虛擬的鍵盤,不是在鍵盤上,而是在"屏幕"上.虛擬按鍵就是虛擬鍵盤的一部分,根據功能需求,提供部分按鍵效果的UI可 ...

  7. IIS7 常用模塊介紹說明

    1.1.0   IIS常用的功能模塊介紹: 1)         靜態內容:可發布靜態 Web 文件格式,比如 HTML 頁面和圖像文件. 2)         默認文檔:允許您配置當用戶未在 URL ...

  8. hdu - 2586 (LCA板子題)

    傳送門 (這次的英文題面要比上一個容易看多了) (英語蒟蒻的卑微) 又是一個很裸的LCA題 (顯然,這次不太容易打暴力咧) (但聽說還是有大佬用dfs直接a掉了) 正好 趁這個機會復習一下LCA 這裡 ...

  9. [轉] react-router4 + webpack Code Splitting

    項目升級為react-router4後,就嘗試著根據官方文檔進行代碼分割.https://reacttraining.com/react-router/web/guides/code-splittin ...

  10. MySQL數據庫的基礎學習

    1.什麼是數據庫 用來存儲數據的倉庫,簡稱數據庫; 數據庫可以在硬盤和內存中存儲數據 數據庫存儲數據的本質: 通過文件來存儲數據 2.數據庫存儲數據與文件存儲的區別 (1).一個文件僅僅只能存儲在一個 ...


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved