Scrapy抓取京東商品、豆瓣電影及代碼分享
1.scrapy基本了解
Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架??梢詰?yīng)用在包括數(shù)據(jù)挖掘, 信息處理或存儲歷史數(shù)據(jù)等一系列的程序中。其最初是為了頁面抓取(更確切來說,網(wǎng)絡(luò)抓取)所設(shè)計(jì)的,也可以應(yīng)用在獲取API所返回的數(shù)據(jù)(比如Web Services)或者通用的網(wǎng)絡(luò)爬蟲。
Scrapy也能幫你實(shí)現(xiàn)高階的爬蟲框架,比如爬取時的網(wǎng)站認(rèn)證、內(nèi)容的分析處理、重復(fù)抓取、分布式爬取等等很復(fù)雜的事。
Scrapy主要包括了以下組件:
- 引擎(Scrapy): 用來處理整個系統(tǒng)的數(shù)據(jù)流處理, 觸發(fā)事務(wù)(框架核心)
- 調(diào)度器(Scheduler): 用來接受引擎發(fā)過來的請求, 壓入隊(duì)列中, 并在引擎再次請求的時候返回. 可以想像成一個URL(抓取網(wǎng)頁的網(wǎng)址或者說是鏈接)的優(yōu)先隊(duì)列, 由它來決定下一個要抓取的網(wǎng)址是什么, 同時去除重復(fù)的網(wǎng)址
- 下載器(Downloader): 用于下載網(wǎng)頁內(nèi)容, 并將網(wǎng)頁內(nèi)容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的異步模型上的)
- 爬蟲(Spiders): 爬蟲是主要干活的, 用于從特定的網(wǎng)頁中提取自己需要的信息, 即所謂的實(shí)體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續(xù)抓取下一個頁面
- 項(xiàng)目管道(Pipeline): 負(fù)責(zé)處理爬蟲從網(wǎng)頁中抽取的實(shí)體,主要的功能是持久化實(shí)體、驗(yàn)證實(shí)體的有效性、清除不需要的信息。當(dāng)頁面被爬蟲解析后,將被發(fā)送到項(xiàng)目管道,并經(jīng)過幾個特定的次序處理數(shù)據(jù)。
- 下載器中間件(Downloader Middlewares): 位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應(yīng)。
- 爬蟲中間件(Spider Middlewares): 介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應(yīng)輸入和請求輸出。
- 調(diào)度中間件(Scheduler Middewares): 介于Scrapy引擎和調(diào)度之間的中間件,從Scrapy引擎發(fā)送到調(diào)度的請求和響應(yīng)。
Scrapy運(yùn)行流程大概如下:
1.首先,引擎從調(diào)度器中取出一個鏈接(URL)用于接下來的抓取
2.引擎把URL封裝成一個請求(Request)傳給下載器,下載器把資源下載下來,并封裝成應(yīng)答包(Response)
3.然后,爬蟲解析Response
4.若是解析出實(shí)體(Item),則交給實(shí)體管道進(jìn)行進(jìn)一步的處理。
5.若是解析出的是鏈接(URL),則把URL交給Scheduler等待抓取
2.安裝scrapy
虛擬環(huán)境安裝:
sudo pip install virtualenv #安裝虛擬環(huán)境工具
virtualenv ENV #創(chuàng)建一個虛擬環(huán)境目錄
source ./ENV/bin/active #激活虛擬環(huán)境
pip install Scrapy #驗(yàn)證是否安裝成功
pip list #驗(yàn)證安裝
可以如下測試:
scrapy bench
3.使用scrapy
在抓取之前, 你需要新建一個Scrapy工程. 進(jìn)入一個你想用來保存代碼的目錄,然后執(zhí)行:
$ scrapy startproject tutorial
這個命令會在當(dāng)前目錄下創(chuàng)建一個新目錄 tutorial, 它的結(jié)構(gòu)如下:
|____scrapy.cfg |____tutorial | |______init__.py | |______init__.pyc | |____items.py | |____items.pyc | |____pipelines.py | |____settings.py | |____settings.pyc | |____spiders | | |______init__.py | | |______init__.pyc | | |____example.py | | |____example.pyc
這些文件主要是:
scrapy.cfg: 項(xiàng)目配置文件
tutorial/: 項(xiàng)目python模塊, 之后您將在此加入代碼
tutorial/items.py: 項(xiàng)目items文件
tutorial/pipelines.py: 項(xiàng)目管道文件
tutorial/settings.py: 項(xiàng)目配置文件
tutorial/spiders: 放置spider的目錄
3.1. 定義Item
items是將要裝載抓取的數(shù)據(jù)的容器,它工作方式像 python 里面的字典,但它提供更多的保護(hù),比如對未定義的字段填充以防止拼寫錯誤通過創(chuàng)建scrapy.Item類, 并且定義類型為 scrapy.Field 的類屬性來聲明一個Item.我們通過將需要的item模型化。在 tutorial 目錄下的 items.py 文件中編輯。
3.2. 編寫Spider
Spider 是用戶編寫的類, 用于從一個域(或域組)中抓取信息, 定義了用于下載的URL的初步列表, 如何跟蹤鏈接,以及如何來解析這些網(wǎng)頁的內(nèi)容用于提取items。
要建立一個 Spider,繼承 scrapy.Spider 基類,并確定三個主要的、強(qiáng)制的屬性:
name:爬蟲的識別名,它必須是唯一的,在不同的爬蟲中你必須定義不同的名字.
start_urls:包含了Spider在啟動時進(jìn)行爬取的url列表。因此,第一個被獲取到的頁面將是其中之一。后續(xù)的URL則從初始的URL獲取到的數(shù)據(jù)中提取。我們可以利用正則表達(dá)式定義和過濾需要進(jìn)行跟進(jìn)的鏈接。
parse():是spider的一個方法。被調(diào)用時,每個初始URL完成下載后生成的 Response 對象將會作為唯一的參數(shù)傳遞給該函數(shù)。該方法負(fù)責(zé)解析返回的數(shù)據(jù)(response data),提取數(shù)據(jù)(生成item)以及生成需要進(jìn)一步處理的URL的 Request 對象。
這個方法負(fù)責(zé)解析返回的數(shù)據(jù)、匹配抓取的數(shù)據(jù)(解析為 item )并跟蹤更多的 URL。
在 /tutorial/tutorial/spiders 目錄下創(chuàng)建
example.py
3.3 .爬取
到項(xiàng)目根目錄, 然后運(yùn)行命令
$ scrapy crawl example
完整代碼參考:https://github.com/AlexanLee/Spider 其中有題目中抓取京東和豆瓣的方法。
相關(guān)文章
淺談pandas中shift和diff函數(shù)關(guān)系
下面小編就為大家分享一篇淺談pandas中shift和diff函數(shù)關(guān)系,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04TensorFlow教程Softmax邏輯回歸識別手寫數(shù)字MNIST數(shù)據(jù)集
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)的TensorFlow教程基于Softmax邏輯回歸識別手寫數(shù)字的MNIST數(shù)據(jù)集示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11Python實(shí)現(xiàn)讀寫sqlite3數(shù)據(jù)庫并將統(tǒng)計(jì)數(shù)據(jù)寫入Excel的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)讀寫sqlite3數(shù)據(jù)庫并將統(tǒng)計(jì)數(shù)據(jù)寫入Excel的方法,涉及Python針對sqlite3數(shù)據(jù)庫的讀取及Excel文件相關(guān)操作技巧,需要的朋友可以參考下2017-08-08python 求10個數(shù)的平均數(shù)實(shí)例
今天小編就為大家分享一篇python 求10個數(shù)的平均數(shù)實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Anaconda+vscode+pytorch環(huán)境搭建過程詳解
這篇文章主要介紹了Anaconda+vscode+pytorch環(huán)境搭建過程詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Pytorch如何指定device(cuda or cpu)
這篇文章主要介紹了Pytorch如何指定device(cuda or cpu)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06Python稀疏矩陣及參數(shù)保存代碼實(shí)現(xiàn)
這篇文章主要介紹了Python稀疏矩陣及參數(shù)保存代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04pandas數(shù)據(jù)處理清洗實(shí)現(xiàn)中文地址拆分案例
因?yàn)楹罄m(xù)數(shù)據(jù)分析工作需要用到地理維度進(jìn)行分析,所以需要把login_place字段進(jìn)行拆分成:國家、省份、地區(qū)。感興趣的可以了解一下2021-06-06Python+tkinter實(shí)現(xiàn)樹形圖繪制
Treeview是ttk中的樹形表組件,功能十分強(qiáng)大,非常適用于系統(tǒng)路徑的表達(dá),下面我們就來看看如何利用這一組件實(shí)現(xiàn)樹形圖的繪制吧,有需要的可以參考下2023-09-09