Scrapy框架入門
標簽: 爬蟲
第一,認識Scrapy
Scrapy 是用 Python 實現的一個為了爬取網站數據、提取結構性數據而編寫的應用框架。
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中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)
第二,scrapy爬蟲流程
Scrapy的運作流程
代碼寫好,程序開始運行…
1 引擎:Hi!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 管道調度器:好的,現在就做!
注意!只有當調度器中不存在任何request了,整個程序才會停止,(也就是說,對于下載失敗的URL,Scrapy也會重新下載。)
第三,制作 Scrapy 爬蟲 步驟:
1.新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目
2.明確目標 (編寫items.py):明確你想要抓取的目標
3.制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網頁
4.存儲內容 (pipelines.py):設計管道存儲爬取內容
第四,安裝
Windows 安裝方式
升級 pip 版本:
pip install --upgrade pip
通過 pip 安裝 Scrapy 框架:
pip install Scrapy
Ubuntu 安裝方式:
安裝非 Python 的依賴:
sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
通過 pip 安裝 Scrapy 框架:
sudo pip install scrapy
Mac OS 安裝方式:
對于Mac OS系統來說,由于系統本身會引用自帶的python2.x的庫,因此默認安裝的包是不能被刪除的,但是你用python2.x來安裝Scrapy會報錯,用python3.x來安裝也是報錯,我最終沒有找到直接安裝Scrapy的方法,所以我用另一種安裝方式來說一下安裝步驟,解決的方式是就是使用virtualenv來安裝。
$ sudo pip install virtualenv
$ virtualenv scrapyenv
$ cd scrapyenv
$ source bin/activate
$ pip install Scrapy
安裝后,只要在命令終端輸入 scrapy,提示類似以下結果,代表已經安裝成功。
第五,案例
一、在開始爬蟲必須創建一個新的Scrapy項目。進入自定義的項目目錄中,運行下列命令:
scrapy startproject mySpider
其中, mySpider 為項目名稱,可以看到將會創建一個 mySpider 文件夾,目錄結構大致如下:
下面來簡單介紹一下各個主要文件的作用:
mySpider/
scrapy.cfg
mySpider/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
這些文件分別是:
1.scrapy.cfg: 項目的配置文件。
2.mySpider/: 項目的Python模塊,將會從這里引用代碼。
3.mySpider/items.py: 項目的目標文件。
4.mySpider/pipelines.py: 項目的管道文件。
5.mySpider/settings.py: 項目的設置文件。
6.mySpider/spiders/: 存儲爬蟲代碼目錄。
二、明確目標(mySpider/items.py)
我們打算抓取 http://www.itcast.cn/channel/teacher.shtml 網站里的所有講師的姓名、職稱和個人信息。
打開 mySpider 目錄下的 items.py。
Item 定義結構化數據字段,用來保存爬取到的數據,有點像 Python 中的 dict,但是提供了一些額外的保護減少錯誤。
可以通過創建一個 scrapy.Item 類, 并且定義類型為 scrapy.Field 的類屬性來定義一個 Item(可以理解成類似于 ORM 的映射關系)。
接下來,創建一個 ItcastItem 類,和構建 item 模型(model)。
import scrapy
class ItcastItem(scrapy.Item):
name = scrapy.Field()
title = scrapy.Field()
info = scrapy.Field()
三、制作爬蟲
爬蟲分兩步,
1,爬數據
在當前目錄下輸入命令,將在mySpider/spider目錄下創建一個名為itcast的爬蟲,并指定爬取域的范圍:
scrapy genspider itcast "itcast.cn"
打開 mySpider/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
其實也可以由我們自行創建itcast.py并編寫上面的代碼,只不過使用命令可以免去編寫固定代碼的麻煩
要建立一個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)
然后運行一下看看,在mySpider目錄下執行:
scrapy crawl itcast
是的,就是 itcast,看上面代碼,它是 ItcastSpider 類的 name 屬性,也就是使用 scrapy genspider命令的唯一爬蟲名。
運行之后,如果打印的日志出現 [scrapy] INFO: Spider closed (finished),代表執行完成。 之后當前文件夾中就出現了一個 teacher.html 文件,里面就是我們剛剛要爬取的網頁的全部源代碼信息。
注意: Python2.x默認編碼環境是ASCII,當和取回的數據編碼格式不一致時,可能會造成亂碼;我們可以指定保存內容的編碼格式,一般情況下,我們可以在代碼最上方添加
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
這三行代碼是 Python2.x 里解決中文編碼的萬能鑰匙,經過這么多年的吐槽后 Python3 學乖了,默認編碼是Unicode了…
2. 取數據
爬取整個網頁完畢,接下來的就是的取過程了,首先觀察頁面源碼:
<div class="li_txt">
<h3> xxx </h3>
<h4> xxxxx </h4>
<p> xxxxxxxx </p>
是不是一目了然?直接上 XPath 開始提取數據吧。
xpath 方法,我們只需要輸入的 xpath 規則就可以定位到相應 html 標簽節點
不會 xpath 語法沒關系,Chrome 給我們提供了一鍵獲取 xpath 地址的方法(右鍵->檢查->copy->copy xpath),如下圖:
這里給出一些 XPath 表達式的例子及對應的含義:
/html/head/title: 選擇HTML文檔中 標簽內的
# -*- coding: utf-8 -*-
import scrapy
# 以下三行是在 Python2.x版本中解決亂碼問題,Python3.x 版本的可以去掉
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class Opp2Spider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.com']
start_urls = ['http://www.itcast.cn/']
def parse(self, response):
# 獲取網站標題
context = response.xpath('/html/head/title/text()')
# 提取網站標題
title = context.extract_first()
print(title)
pass
執行以下命令:
$ scrapy crawl itcast
...
...
傳智播客官網-好口碑IT培訓機構,一樣的教育,不一樣的品質
...
...
我們之前在 mySpider/items.py 里定義了一個 ItcastItem 類。 這里引入進來:
from mySpider.items import ItcastItem
然后將我們得到的數據封裝到一個 ItcastItem 對象中,可以保存每個老師的屬性:
from mySpider.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 輸出指定格式的文件,命令如下:
scrapy crawl itcast -o teachers.json
json lines格式,默認為Unicode編碼
scrapy crawl itcast -o teachers.jsonl
csv 逗號表達式,可用Excel打開
scrapy crawl itcast -o teachers.csv
xml格式
scrapy crawl itcast -o teachers.xml
思考
如果將代碼改成下面形式,結果完全一樣。
請思考 yield 在這里的作用(Python yield 使用淺析):
# -*- coding: utf-8 -*-
import scrapy
from mySpider.items import ItcastItem
# 以下三行是在 Python2.x版本中解決亂碼問題,Python3.x 版本的可以去掉
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class Opp2Spider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.com']
start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)
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模塊時要注意是否跟操作系統兼容,不兼容則要考慮換python版本,不過這種情況比較少,還有就是我們在安裝時會出現下載不了的情況,具體情況請移步博文主頁,里面有詳細記錄以及解決辦法,希望對大家有用!!!
智能推薦
Python爬蟲day7—Scrapy框架入門
Scrapy爬蟲框架入門 概述 Scrapy是Python開發的一個非常流行的網絡爬蟲框架,可以用來抓取Web站點并從頁面中提取結構化的數據,被廣泛的用于數據挖掘、數據監測和自動化測試等領域。下圖展示了Scrapy的基本架構,其中包含了主要組件和系統的數據處理流程(圖中帶數字的紅色箭頭)。 組件 Scrapy引擎(Engine):Scrapy引擎是用來控制整個系統的數據處理流程。 調度器(Sche...
Python爬蟲學習教程:Scrapy爬蟲框架入門
Python爬蟲學習教程:Scrapy概述 Scrapy是Python開發的一個非常流行的網絡爬蟲框架,可以用來抓取Web站點并從頁面中提取結構化的數據,被廣泛的用于數據挖掘、數據監測和自動化測試等領域。下圖展示了Scrapy的基本架構,其中包含了主要組件和系統的數據處理流程(圖中帶數字的紅色箭頭)。 組件 Scrapy引擎(Engine):Scrapy引擎是用來控制整個系統的數據處理流程。 調度...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
猜你喜歡
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...