
標題無意冒犯,就是覺得這個廣告挺好玩的
上面這張思維導圖喜歡就拿走,反正我也學不了這么多
文章目錄
- 前言
- 歡迎來到我們的圈子
- 安裝scrapy
- 什么是scrapy
- scrapy架構
- pycharm體驗scrapy專案
- 天才第一步:創建scrapy專案
- 天才第二步:明確目標,構建items
- 制作爬蟲
- 取資料
前言
前期回顧:我要偷偷學Python(第十二天)
第十二篇的專案還在持續更新中,哎,日理萬機雖然談不上,但是也是手忙腳亂,這不,自動表單生成是寫完了,但是學校網路實在是受不了啊,2G,測驗不了,就只能一直擱置在那邊了,
明天就可以去測驗了,明天出學校去逛逛,
今天講scrapy框架,有不少小伙伴問我說為什么最近沒更新,實在是這個不好辦吶,安裝上就花了些功夫嘞,不過你們跟著我的安裝步驟,就不用走那么多的彎路了,
插播一條推送:(如果是小白的話,可以看一下下面這一段)
歡迎來到我們的圈子
我建了一個Python學習答疑群,有興趣的朋友可以了解一下:這是個什么群
群里已經有一千三百多個小伙伴了哦!!!
直通群的傳送門:傳送門
本系列文默認各位有一定的C或C++基礎,因為我是學了點C++的皮毛之后入手的Python,這里也要感謝齊鋒學長送來的支持,
本系列文默認各位會百度,學習‘模塊’這個模塊的話,還是建議大家有自己的編輯器和編譯器的,上一篇已經給大家做了推薦啦?
我要的不多,點個關注就好啦
然后呢,本系列的目錄嘛,說實話我個人比較傾向于那兩本 Primer Plus,所以就跟著它們的目錄結構吧,
本系列也會著重培養各位的自主動手能力,畢竟我不可能把所有知識點都給你講到,所以自己解決需求的能力就尤為重要,所以我在文中埋得坑請不要把它們看成坑,那是我留給你們的鍛煉機會,請各顯神通,自行解決,
安裝scrapy
這里我并不打算說我安裝程序中踩了多少坑,反正你現在跟著我來做:
1、win+R,cmd,打開終端
2、
pip install pywin32
pip install pyopenssl
pip install wheel
3、打開https://www.lfd.uci.edu/~gohlke/pythonlibs/,找到twisted和lxml兩個whl檔案,下載下來,
4、進入兩個檔案的存放目錄下,
pip install Twisted·····
pip install lxml····
5、安裝scrapy,這里需要引入國內源,
pip install Scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
整完之后速度嗖嗖的,
好,當它顯示給你說success,就萬事大吉了嗎?并不是這樣的,
這里你需要做兩件事情:
1、先弄清楚你安裝在了那個Python上,如果你的電腦上只有一個Python就零擔別論了,像我的電腦上就有三個Python,
這時候:終端輸入:python --version,就可以看到Python的版本號了,
2、在新建檔案的時候,

好極,這樣就解決了pycharm上有些包無法安裝的問題,以及有些包不翻墻解決不了的問題,
好,我們開始今天的主題:Scrapy,
什么是scrapy
Scrapy,Python開發的一個快速、高層次的螢屏抓取和web抓取框架,用于抓取web站點并從頁面中提取結構化的資料,Scrapy用途廣泛,可以用于資料挖掘、監測和自動化測驗.
牛頓說,他只是站在了巨人的肩膀上,說真的,作為一個學C++過來的人,我還沒有體驗過框架的力量,聽說框架可以定制功能,我們只需要將我們所需要的主要功能填充進去,便可以快速的得到我們想要的效果,就像把不同的光碟,插入DVD,
Scrapy吸引人的地方在于它是一個框架,任何人都可以根據需求方便的修改,它也提供了多種型別爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支持,
scrapy架構

這張架構圖能看懂不?百度一搜基本全是這張,
Scrapy Engine(引擎):負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、資料傳遞等,
Scheduler(調度器):它負責接受引擎發送過來的Request請求,并按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎,
Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,
Spider(爬蟲):它負責處理所有Responses,從中分析提取資料,獲取Item欄位需要的資料,并將需要跟進的URL提交給引擎,再次進入Scheduler(調度器),
Item Pipeline(管道):它負責處理Spider中獲取到的Item,并進行進行后期處理(詳細分析、過濾、存盤等)的地方,
Downloader Middlewares(下載中間件):一個可以自定義擴展下載功能的組件,
Spider Middlewares(Spider中間件):一個可以自定擴展和操作引擎和Spider中間通信的功能組件,
注意:當只有調度器中沒剩下request的時候,整個專案的運轉才會停止,
也就是說,如果某個任務在運行程序中失敗了,該網址會被重新訪問,
我在網上看到一段挺形象生動的:
!Spider, 你要處理哪一個網站?
2 Spider:老大要我處理xxxx.com,
3 引擎:你把第一個需要處理的URL給我吧,
4 Spider:給你,第一個URL是xxxxxxx.com,
5 引擎:Hi!調度器,我這有request請求你幫我排序入隊一下,
6 調度器:好的,正在處理你等一下,
7 引擎:Hi!調度器,把你處理好的request請求給我,
8 調度器:給你,這是我處理好的request
9 引擎:Hi!下載器,你按照老大的下載中間件的設定幫我下載一下這個request請求
10 下載器:好的!給你,這是下載好的東西,(如果失敗:sorry,這個request下載失敗了,然后引擎告訴調度器,這個request下載失敗了,你記錄一下,我們待會兒再下載)
11 引擎:Hi!Spider,這是下載好的東西,并且已經按照老大的下載中間件處理過了,你自己處理一下(注意!這兒responses默認是交給def parse()這個函式處理的)
12 Spider:(處理完畢資料之后對于需要跟進的URL),Hi!引擎,我這里有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item資料,
13 引擎:Hi !管道 我這兒有個item你幫我處理一下!調度器!這是需要跟進URL你幫我處理下,然后從第四步開始回圈,直到獲取完老大需要全部資訊,
14 管道``調度器:好的,現在就做!
pycharm體驗scrapy專案
天才第一步:創建scrapy專案
由于pycharm無法直接創建scrapy專案,所以這樣操作:
1、在pycharm中打開終端,輸入scrapy startproject 專案名(比如說:Test_Scrapy)
弄完之后,重繪兩下,會出現這么個東西:

說明創建成功了,
下面來簡單介紹- - 下各個主要檔案的作用:
scrapy.cfg :專案的組態檔
test_scrapy/ :專案的Python模塊,將會從這里參考代碼
test_scrapy/items.py :專案的目標檔案
test_scrapy/pipelines.py :專案的管道檔案
test_scrapy/settings.py :目的設定檔案
test_scrapy/spiders/ :存盤爬蟲代碼目錄
天才第二步:明確目標,構建items
我們打算抓取:http://www.itcast.cn/channel/ 網站里的所有講師的姓名、職稱和個人資訊,
打開test_scrapy目錄下的items.py
Item 定義結構化資料欄位,用來保存爬取到的資料,有點像Python中的dict,但是提供了一些額外的保護減少錯誤,
可以通過創建一個 scrapy.Item 類, 并且定義型別為
scrapy.Field的類屬性來定義一個Item(可以理解成類似于ORM的映射關系),
接下來,創建一個ItcastItem 類,和構建item模型(model),
class ItcastItem(scrapy.Item):
name = scrapy.Field()
title = scrapy.Field()
info = scrapy.Field()
制作爬蟲
進入spiders目錄,終端輸入命令:
scrapy genspider itcast "itcast.cn"
將在test_scrapy/test_scrapy/spider目錄下創建一個名為itcast的爬蟲,并指定爬取域的范圍:
打開 spider目錄里的 itcast.py,默認增加了下列代碼:
import scrapy
class ItcastSpider(scrapy.Spider):
name = "itcast"
allowed_domains = ["itcast.cn"]
start_urls = (
'http://www.itcast.cn/',
)
def parse(self, response):
pass
要建立一個Spider, 你必須用scrapy.Spider類創建一個子類,并確定了三個強制的屬性 和 一個方法,
name = "" :這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字,
allow_domains = [] 是搜索的域名范圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略,
start_urls = () :爬取的URL元祖/串列,爬蟲從這里開始抓取資料,所以,第一次下載的資料將會從這些urls開始,其他子URL將會從這些起始URL中繼承性生成,
parse(self, response) :決議的方法,每個初始URL完成下載后將被呼叫,呼叫的時候傳入從每一個URL傳回的Response物件來作為唯一引數,主要作用如下:
負責決議回傳的網頁資料(response.body),提取結構化資料(生成item)
生成需要下一頁的URL請求,
將start_urls的值修改為需要爬取的第一個url
start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)
修改parse()方法
def parse(self, response):
filename = "teacher.html"
open(filename, 'w').write(response.body)
然后運行一下看看,在test_scrapy/test_scrapy目錄下執行:
scrapy crawl itcast
是的,就是 itcast,看上面代碼,它是 ItcastSpider 類的 name 屬性,也就是使用 scrapy genspider命令的唯一爬蟲名,
運行之后,如果列印的日志出現 [scrapy] INFO: Spider closed (finished),代表執行完成, 之后當前檔案夾中就出現了一個 teacher.html 檔案,里面就是我們剛剛要爬取的網頁的全部源代碼資訊,
取資料
爬取整個網頁完畢,接下來的就是的取程序了,
我們之前在test_scrapy/test_scrapy/items.py 里定義了一個ItcastItem類, 這里引入進來
from test_scrapy/test_scrapy/.items import ItcastItem
好,這樣寫妥妥是要報錯的,不這樣寫又沒法子,搞了半天,
from ..items import ItcastItem
然后將我們得到的資料封裝到一個 ItcastItem 物件中,可以保存每個老師的屬性:
from test_scrapy.items import ItcastItem
def parse(self, response):
#open("teacher.html","wb").write(response.body).close()
# 存放老師資訊的集合
items = []
for each in response.xpath("//div[@class='li_txt']"):
# 將我們得到的資料封裝到一個 `ItcastItem` 物件
item = ItcastItem()
#extract()方法回傳的都是unicode字串
name = each.xpath("h3/text()").extract()
title = each.xpath("h4/text()").extract()
info = each.xpath("p/text()").extract()
#xpath回傳的是包含一個元素的串列
item['name'] = name[0]
item['title'] = title[0]
item['info'] = info[0]
items.append(item)
# 直接回傳最后資料
return items
scrapy保存資訊的最簡單的方法主要有四種,-o 輸出指定格式的檔案,這里我采用的是csv檔案
csv 逗號運算式,可用Excel打開
scrapy crawl itcast -o teachers.csv
最近都比較忙了些,先把這個框架走通吧,后面還要拓展再拓展,難搞哦,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/224735.html
標籤:AI
