Python基礎與大數據應用-第八章-Python爬蟲框架課件_第1頁
Python基礎與大數據應用-第八章-Python爬蟲框架課件_第2頁
Python基礎與大數據應用-第八章-Python爬蟲框架課件_第3頁
Python基礎與大數據應用-第八章-Python爬蟲框架課件_第4頁
Python基礎與大數據應用-第八章-Python爬蟲框架課件_第5頁
已閱讀5頁,還剩99頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第八章Python爬蟲框架第八章Python爬蟲框架1目錄

Contents01常見爬蟲框架02Scrapy安裝03Scrapy爬蟲框架04Scrapy常用工具命令0506Scrapy爬蟲實戰項目訓練07小結目錄01常見爬蟲框架02Scrapy03Scrapy爬蟲2常見爬蟲框架01常見爬蟲框架010102030405爬蟲框架Scrapy是Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用于抓取web站點并從頁面中提取結構化的數據。Scrapy用途廣泛,可以用于數據挖掘、監測和自動化測試。Scrapy吸引人的地方在于它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等。ScrapyCrawley能高速爬取對應網站的內容,支持關系和非關系數據庫,數據可以導出為JSON、XML等。CrawleyPortia是一個用Python編寫無需任何編程知識,就能可視化爬取網站數據的開源工具。Portia是運行在Web瀏覽器中,Portia提供了可視化的Web頁面,只需通過簡單單擊,標注頁面上需提取的相應數據,即可完成爬取規則的開發,這些規則還可在Scrapy中使用,用于抓取頁面。PortiaPySpider是一個強大的網絡爬蟲系統,并帶有強大的WebUI。采用Python語言編寫,分布式架構,支持多種數據庫后端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器。PySpiderBeautifulSoup是一個可以從HTML或XML文件中提取數據的Python庫。它能夠通過你喜歡的轉換器實現慣用的文檔導航、查找、修改文檔的方式。BeautifulSoup會幫你節省數小時甚至數天的工作時間。在獲取html元素時,都是用bs4完成的。BeautifulSoup常見爬蟲框架06Grab框架,可以構建各種復雜的網頁抓取工具,從簡單的5行腳本到處理數百萬個網頁的復雜異步網站抓取工具。Grab提供一個API用于執行網絡請求和處理接收到的內容。Grab07Cola是一個分布式的爬蟲框架,對于用戶來說,只需編寫幾個特定的函數,而無需關注分布式運行的細節。任務會自動分配到多臺機器上,整個過程對用戶是透明的。Cola0102030405爬蟲框架Scrapy是Python開發的Scrapy安裝02Scrapy安裝02第一步

如Python和pip的版本比較低,需要將其升級。Python3.7安裝方法按照第一章方法安裝即可。pip3安裝命令為【apt-getinstallPython3-pip】安裝scrapy的依賴包【sudoapt-getinstallpython3python3-devpython-piplibxml2-devlibxslt1-devlibffi-devlibssl-devzlib1q-dev】在/home目錄下用mkdir命令建立scrapy文件夾利用pip3命令安裝scrapy【pipinstallscrapy】scrapy安裝第二步第三步查看版本第四步【cd/home】【mkdirscrapy】第一步如Python和pip的版本比較低,需要將其升級。PScrapy爬蟲框架03Scrapy爬蟲框架03Scrapy爬蟲框架Scrapy框架組件功能Scrapy引擎(ScrapyEngine)負責處理整個系統的數據流,并在相應動作時觸發事件(框架核心)調度器(Scheduler)接受引擎發過來的Request請求,并加入隊列中,并在引擎再次發來Request請求的時候提供給引擎下載器(Downloader)負責獲取網頁內容并將網頁內容返回給蜘蛛spider爬蟲(Spiders)Scrapy用戶編寫用于分析Response并提取Item的類項目管道(ItemPipeline)位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應下載器中間件(DownloaderMiddlewares)位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應爬蟲中間件(SpiderMiddlewares)介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛(Spiger)的響應輸入(Response)和請求輸出(Item和Request)調度中間件(SchedulerMiddewares)介于Scrapy引擎和調度之間的中間件,處理從Scrapy引擎發送到調度的請求和響應Scrapy爬蟲框架Scrapy框架組件功能Scrapy數據流運行過程step1引擎打開一個網站,找到處理該網站的Spider并向該Spider請求第一個要抓取的URL。step2引擎從Spider中獲取第一個要爬取的URL并通過調度器(Scheduler)和Request進行調度。step3引擎從調度器請求下一個要爬取的URLstep4調度器返回下一個要爬取的URL給引擎,引擎將URL封裝成一個請求(Request),通過下載中間件轉發給下載器step5頁面下載完畢后,下載器把資源封裝成應答包(Response),并將其通過下載中間件發送給引擎step6引擎從下載器中接收到Response并通過Spider中間件發送給Spider處理step7Spider處理Response并返回爬取到的Item和新的Request發送給引擎step8引擎將爬取到的Item交給ItemPipeline,將Request給調度器Scrapy數據流運行過程step1step2step3stScrapy常用工具命令04Scrapy常用工具命令04創建一個Scrapy項目

在爬取之前,需先創建一個新的Scrapy項目。在Ubuntu16.04、Python3.7環境中,在/home/scapy/路徑下建立一個文件夾,命令為【mkdirpyscr】,接下來進入該文件夾,在終端輸入命令【scrapystartprojectpyscr】,即可創建一個名為pyscr的項目,如圖所示。創建一個Scrapy項目在爬取之前,需先創建一個新的Scr11創建一個Scrapy項目pyscr項目內容:scrapy.cfg:項目配置文件pyscr/:項目Python模塊,代碼將從這里導入pyscr/items.py:項目items文件pyscr/middlewares.py:定義spider中間件和downloader中間件pyscr/pipelines.py:項目管道文件pyscr/settings.py:項目設置文件pyscr/spiders:放置Spider的目錄【tree】命令查看項目結構,pyscr項目中包含如圖所示內容創建一個Scrapy項目pyscr項目內容:【tree】命令12Scrapy全局命令在Scrapy框架中,提供了兩種類型的命令:一種是針對項目的命令(即需要有項目,該命令才能成功運行);另一種為全局命令,這些命令不需要有項目就能運行(在有項目的情況下,這些命令也能運行)。全局命令一共有8個,具體如下:

startprojectsettingsrunspidershellfetchviewversionbenchScrapy全局命令在Scrapy框架中,提供了兩種類型的命13Scrapy全局命令startproject命令語法:scrapystartproject<project_name>功能:在目錄project_name下創建一個名為project_name的Scrapy項目。用法示例:

【scrapystartprojectmyproject】settings命令語法:

scrapy

settings

[options]功能:查看scrapy對應的配置信息,如果在項目目錄內使用該命令,查看的是對應項目的配置信息,如果在項目外使用查看的是scrapy默認配置信息。用法示例:【scrapysettings--getBOT_NAME】獲取得到蜘蛛項目的名稱,如果沒有獲取結果則返回none輸出結果:scrapybotScrapy全局命令startproject命令14Scrapy全局命令runspider命令語法:

scrapy

runspider

<spider_file.py>功能:在未創建項目的情況下,運行一個編寫好的Python文件中的spider。用法示例:【scrapyrunspidermyspider.py】輸出結果:[...spiderstartscrawling...]shell命令語法:

scrapy

shell

[url]功能:以給定的URL(如果給出)或者空(沒有給出URL)啟動Scrapyshell。用法示例:【scrapyshell】運行結束后,在終端屏幕上會出現抓取的控制信息Scrapy全局命令runspider命令15Scrapy全局命令fetch命令語法:scrapy

fetch

<url>功能:使用Scrapy下載器(downloader)下載給定的URL,并將獲取到的內容送到標準輸出。該命令以spider下載頁面的方式獲取頁面。如果實際在項目中運行,fetch將會使用項目中spider的屬性訪問,如果該命令不在項目中運行,則會使用默認Scrapydownloader設定。用法示例:【scrapyfetch--nolog】【scrapyfetch--nolog--headers】view命令語法:

scrapy

view

<url>功能:在瀏覽器中打開給定的URL,并以Scrapyspider獲取到的形式展現。有時候spider獲取到的頁面和普通用戶看到的并不相同,此該命令可以用來檢查spider所獲取到的頁面,并確認與用戶看到的一致。應用示例:【scrapyview】Scrapy全局命令fetch命令16Scrapy全局命令version命令語法:

scrapy

version

[-v]功能:輸出Scrapy版本。配合-v運行時,該命令同時輸出Python,Twisted以及平臺的信息,方便bug提交。應用示例:【scrapyversion–v】bench命令語法:scrapy

bench功能:運行benchmark測試,測試Scrapy在硬件上的效率。Scrapy全局命令version命令17Scrapy項目命令項目命令需要在有Scrapy項目的情況下,這些命令才能運行。項目命令主要有以下幾個:crawlchecklisteditparsedeploygenspiderScrapy項目命令項目命令需要在有Scrapy項目的情況下18Scrapy項目命令crawl命令語法:

scrapy

crawl

<spider>功能:運行Scrapy項目,使用spider進行爬取。應用示例:【scrapycrawlpyscr】check命令語法:

scrapy

check

[-l]

<spider>功能:運行contract檢查。應用示例:【scrapycheck–l】Scrapy項目命令crawl命令19Scrapy項目命令list命令語法:scrapy

list功能:列出當前項目中所有可用的spider。每行輸出一個spider。應用示例:【scrapylist】edit命令語法:scrapy

edit

<spider>功能:使用EDITOR中設定的編輯器編輯給定的spider。該命令僅僅是提供一個快捷方式。開發者可以自由選擇其它工具或者IDE來編寫調試spider。應用示例:【scrapyeditspider1】Scrapy項目命令list命令20Scrapy項目命令parse命令語法:【scrapy

parse

<url>

[options]】功能:獲取給定的URL并使用相應的spider分析處理。如果提供--callback選項,則使用spider中的解析方法處理,否則使用parse。支持的選項:--spider=SPIDER:跳過自動檢測spider并強制使用特定的spider--a

NAME=VALUE:設置spider的參數(可能被重復)--callback

or

–c:spider中用于解析返回(response)的回調函數--pipelines:在pipeline中處理item--rulesor-r:使用CrawlSpider規則來發現用來解析返回(response)的回調函數--noitems:不顯示爬取到的item--nolinks:不顯示提取到的鏈接--nocolour:避免使用pygments對輸出著色--depth

or

–d:指定跟進鏈接請求的層次數(默認1)--verbose

or

–v:顯示每個請求的詳細信息應用示例:【scrapyparse“/”-cparse_item】Scrapy項目命令parse命令21Scrapy項目命令deploy命令語法:scrapy

deploy[<target:project>|-l<target>|-L]功能:將項目部署到Scrapyd服務。genspider命令語法:scrapygenspider[-ttemplate]<name><domain>功能:在當前項目中創建一個新的的spiders。這僅是創建spider的一種快捷方式,該方法可以使用提前定義好的模板來生成spider,也可自己創建spider的源碼文件,應用示例如圖所示。Scrapy項目命令deploy命令22Scrapy爬蟲實戰05Scrapy爬蟲實戰05Scrapy爬蟲實戰

在Ubuntu16.04,Python3.7環境下,創建一個Scrapy項目,爬取“糗事百科”中“穿越”網頁中網友發表的糗事內容,并將內容保存在文本文件中。1.創建Scrapy項目qsbk在爬取之前,必須創建一個新的Scrapy項目。在/home/scrapy目錄下建立qsbk目錄,并在/home/scrapy/qsbk目錄下用【scrapy

startproject

qsbk】命令創建項目,如下圖所示。Scrapy爬蟲實戰在Ubuntu16.04,Python24Scrapy爬蟲實戰2.設置settings.py文件settings.py文件是項目的配置文件,常用的參數有:BOT_NAME='qsbk',Scrapy項目的名字,使用startproject命令創建項目時被自動賦值;SPIDER_MODULES=['qsbk.spiders'],Scrapy搜索spider的模塊列表,創建項目時被自動賦值;NEWSPIDER_MODULE='qsbk.spiders',使用genspider命令創建新spider的模塊,創建項目時被自動賦值;ROBOTSTXT_OBEY=True,是否遵守robots.txt協議,默認遵守robots.txt協議。robots.txt是遵循Robot協議的一個文件,它保存在網站的服務器中,作用是告訴搜索引擎爬蟲,本網站哪些目錄下的網頁不希望被爬取收錄。在Scrapy啟動后,會在第一時間訪問網站的robots.txt文件,然后決定該網站的爬取范圍。在某些情況下希望獲取的是被robots.txt所禁止訪問的,此時可將此配置項設置為False來獲取數據;Scrapy爬蟲實戰2.設置settings.py文件25Scrapy爬蟲實戰CONCURRENT_REQUESTS=16,開啟線程數量,默認16;AUTOTHROTTLE_START_DELAY=3,開始下載時限速并延遲時間;AUTOTHROTTLE_MAX_DELAY=60,高并發請求時最大延遲時間;DEFAULT_REQUEST_HEADERS={‘Accept’:‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8’,‘Accept-Language’:‘en’,},這個參數是設置瀏覽器請求頭,很多網站都會檢查客戶端的headers,可以在該參數里設置模擬瀏覽器;ITEM_PIPELINES={'demo1.pipelines.Demo1Pipeline':300,},Pipeline的路徑,300表示優先級,范圍(0-1000),值越小級別越高;具體設置qsbk項目的settings.py文件:(1)設置ROBOTSTXT_OBEY參數:ROBOTSTXT_OBEY=False(2)設置AUTOTHROTTLE_START_DELAY參數:刪除參數前的“#”,AUTOTHROTTLE_START_DELAY=3(3)設置ITEM_PIPELINES參數:刪除該參數中所有“#”(4)設置DEFAULT_REQUEST_HEADERS參數:刪除該參數中所有“#”,并添加“‘User-Agent’:‘Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/48.0.2564.116Safari/537.36’,”,偽裝成瀏覽器訪問Scrapy爬蟲實戰CONCURRENT_REQUESTS26Scrapy爬蟲實戰3.設置items.py文件items.py負責數據模型的建立,是項目中的Item對象。Item對象是保存爬取到的數據的容器;其使用方法和Python字典類似,并且提供了額外保護機制來避免拼寫錯誤導致的未定義字段錯誤。Item使用簡單的class定義語法和Field對象聲明。在新建的qsbk項目中,使用items.py來定義存儲的Item類,這個類需要繼承scrapy.Item。其代碼下圖所示。Scrapy爬蟲實戰3.設置items.py文件27Scrapy爬蟲實戰4.創建spider爬蟲文件爬蟲模塊的代碼都放置與spiders文件夾中。爬蟲模塊是用于從單個網站或多個網站爬取數據的類,其中應包含初始頁面的URL、跟進網頁鏈接、分析頁面內容、提取數據方法。為了創建一個Spider爬蟲,必須繼承scrapy.Spider類,且定義以下三個屬性:name:

用于區別Spider。該名字必須是唯一的,不可為不同的Spider設定相同的名字start_urls:包含了Spider在啟動時進行爬取的url列表。因此,第一個被獲取到的頁面將是其中之一。后續的URL則從初始的URL獲取到的數據中提取parse():是spider的一個方法。被調用時,每個初始URL完成下載后生成的

response對象將會作為唯一的參數傳遞給該函數。該方法負責解析返回的數據(responsedata),提取數據(生成item)以及生成需要進一步處理的URL的Request對象。Scrapy爬蟲實戰4.創建spider爬蟲文件28Scrapy爬蟲實戰在spiders文件夾(cd/spiders)下創建qsbk.py文件(vimqsbk.py),qsbk.py中的代碼如圖所示。需要注意的是,這段代碼中不僅需要下載網頁數據,還需要對這些數據進行提取。Scrapy有自己的數據提取機制--選擇器(selector基于lxml庫),它通過Xpath或者CSS表達式來提取HTML文件中的內容。Scrapy爬蟲實戰在spiders文件夾(cd/spid29Scrapy爬蟲實戰(1)XpathXPath是XML路徑語言(XMLPathLanguage),它是一種用來確定XML文檔中某部分位置的語言。Xpath使用路徑表達式來選取XML文檔中的節點或者節點集。這些路徑表達式和在常規的電腦文件系統中看到的表達式非常相似。節點是通過沿著路徑(path)或者步(steps)來選取的。在Xpath中,有七種類型的節點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節點。XML文檔是被作為節點樹來對待的,樹的根被稱為文檔節點或者根節點。示例XML文檔如下:<?xmlversion="1.0"encoding="ISO-8859-1"?><bookstore><book><titlelang="en">HarryPotter</title><author>JK.Rowling</author><year>2005</year><price>29.99</price></book></bookstore>上面XML文檔中的節點:<bookstore>(文檔節點)、<author>JK.Rowling</author>(元素節點)、lang="en"(屬性節點)。節點有:父、子、同胞、先輩、后代,5種關系。按照上方的xml文件book就是title的父節點,title就是book的子節點,author和title是同胞,bookstore是author和title的先輩,反之author是bookstore的后代。Scrapy爬蟲實戰(1)Xpath30選取節點Xpath使用路徑表達式在XML文檔中選取節點。節點是通過沿著路徑或者step來選取的。表8-1列出了最有用的路徑表達式。對上面XML代碼進行節點選取,其表達式如下表所示。Scrapy爬蟲實戰表達式描

述nodename選取此節點的所有子節點/從根節點選取//從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。.選取當前節點..選取當前節點的父節點@選取屬性路徑表達式結

果bookstore選取bookstore元素的所有子節點/bookstore選取根元素bookstore。假如路徑起始于正斜杠(/),則此路徑始終代表到某元素的絕對路徑!bookstore/book選取屬于bookstore的子元素的所有book元素//book選取所有book子元素,而不管它們在文檔中的位置bookstore//book選擇屬于bookstore元素的后代的所有book元素,而不管它們位于bookstore之下的什么位置//@lang選取名為lang的所有屬性選取節點Scrapy爬蟲實戰表達式描述31選取未知節點XPath通配符可用來選取未知的XML元素。常用的通配符如下表所示。對上述XML代碼,下表列出了一些路徑表達式,以及這些表達式的結果。Scrapy爬蟲實戰通配符描

述*匹配任何元素節點@*匹配任何屬性節點node()匹配任何類型的節點路徑表達式結

果/bookstore/*選取bookstore元素的所有子元素//*選取文檔中的所有元素//title[@*]選取所有帶有屬性的title元素選取未知節點Scrapy爬蟲實戰通配符描述*匹配任何32Scrapy爬蟲實戰下面,以糗事百科網站為例,初始網站為/history/,需要抓取網頁中的“糗事”。首先分析這張網頁中的元素。用瀏覽器打來該網頁,右擊打開快捷菜單,選擇“檢查”(谷歌瀏覽器)或“查看元素”(火狐瀏覽器)或“檢查元素”(IE瀏覽器)命令,查看頁面元素,如圖所示。Scrapy爬蟲實戰下面,以糗事百科網站為例,初始網站為h33Scrapy爬蟲實戰

從下圖可以看出,網友發表“糗事”所有信息都放置在<divclass=“col1”>中,根據Xpath的編寫規則,其xpath路徑表達式可以寫為“//div[@class=’col1’]/div”。而需要爬取的“糗事”文字內容都存放在<divclass="content"><span>*******************</span>中(****為具體的“糗事”,如圖8-14所示),因此其xpath可以寫為“.//div[@class='content']/span//text()”。Scrapy爬蟲實戰從下圖可以看出,網友發表“糗事”所有信34Scrapy爬蟲實戰(2)選擇器(Selector)有了Xpath路徑表達式還不能直接進行網頁數據提取,還需要一個提取機制。而在Scrapy框架中有一套自己的數據提取機制,稱為選擇器(selector),它通過特定的Xpath或CSS表達式來選擇HTML文件中的某個部分。Scrapy選擇器構建于lxml庫之上,因此它們在速度和解析準確性上非常相似。Selector選擇器有四個基本的方法:xpath(表達式):傳入Xpath表達式,返回該表達式對應的節點列表。css(表達式):傳入CSS表達式,返回該表達式對應的節點列表。extract():返回被選擇元素的unicode字符串的列表。Extract()表示所有的元素,extract_first()表示第一個元素。re(表達式):返回通過正則表達式提取的unicode字符串列表。選擇器在使用方式上很方便,可以使用傳入的response直接調用,如response.xpath(表達式)、response.css(表達式)。調用方法很簡單,而構建xpath和css比較復雜。Scrapy框架中提供了一種簡便的方式來查看Xpath表達式是否正確有用。Scrapy爬蟲實戰(2)選擇器(Selector)35Scrapy爬蟲實戰在終端窗口輸入命令【scrapyshellURL】,成功運行就會有返回結果。如【scrapyshell】,其返回結果如圖所示。

從圖中看到response就是訪問以上網址獲得的響應,接下來輸入【response.xpath(“.//div[@class='content']/span//text()”).extract()】,驗證Xpath表達式的正確性,如果正確就能抽取當前網頁中所有糗事的內容,如不正確,則返回值為空。Scrapy爬蟲實戰在終端窗口輸入命令【scr36Scrapy爬蟲實戰

5.設置pipelines文件pipelines文件負責對spider返回數據進行處理,可以將數據寫入數據庫,也可以寫入到文件等。該項目中將數據寫入到文本文件。代碼如圖所示。Scrapy爬蟲實戰5.設置pipelines文件37Scrapy爬蟲實戰

6.運行Scrapy項目在qsbk目錄下,用crawl命令運行Scrapy項目。【scrapycrawlqsbk】運行結束后,在該目錄下生成文本文件qsbk.txt,使用命令【catqsbk.txt】查看其內容。項目運行及結果見下面2個圖所示。項目運行的結果由于網頁在變動,因此結果不盡相同。Scrapy爬蟲實戰6.運行Scrapy項目項目運38項目訓練:用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件06項目訓練:用Scrapy爬取豆瓣圖書保存到MySQL數據庫文用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件

(1)用Scrapy框架抓取把豆瓣網(/tag/中國文學)中的圖書信息(包括書名、作者、類別、評價、評價人數、圖書類別);(2)將抓取的數據保存到MySQL數據庫中。

訓練目標通過對Scarpy爬取項目的設計與實現,掌握Scrapy框架的用法和MySQL的基本操作,會用Scrapy框架爬取網頁數據并保存至數據庫。訓練內容用Scrapy爬取豆瓣圖書保存到(1)用Scrap40

(1)任務分析Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。MySQL是一種開放源代碼的關系型數據庫管理系統(RDBMS),MySQL數據庫系統使用最常用的數據庫管理語言——結構化查詢語言(SQL)進行數據庫管理。本項目使Scrapy框架首先抓取豆瓣網上的圖書信息,通過創建項目、設置items.py文件和pipelines.py文件、創建spider.py文件等操作進行抓取。然后將抓取的信息通過創建數據庫、創建存放圖書信息的數據表等操作存儲到MySQL數據庫中。本項目的關鍵是Xpath表達式的構建。項目需要抓取的URL為/tag/中國文學,抓取網頁中圖書的書名、作者、評價、評價人數、圖書信息。通過瀏覽器的元素分析,可以知道這些信息的xpath路徑為:每本圖書的信息都保存在class=“info”的div里面,其對應的xpath路徑為‘//div[@class=“info”]’;書名h2的下一個a標簽里面,其對應的xpath路徑為‘./h2/a/text()’;作者在class=“pub”的div標簽里面,其對應的xpath路徑為‘./div[@class=’pub‘]/text()’;評分在第二個div標簽下的第二個span標簽里面,其對應的xpath路徑為‘./div[2]/span[2]/text()’;評價人數在第二個div標簽下的第三個span標簽里面,其對應的xpath路徑為‘./div[2]/span[3]/text()’;后頁的鏈接在class=“paginator”div標簽下的屬性為class=‘next’的span標簽下面的一個a標簽里面的href屬性里面,其對應的xpath路徑為'div[@class='paginator']/span[@class='next']/a/@href'。訓練步驟用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件(1)任務分析訓練步驟用Scrapy爬取豆瓣圖書保41

(2)項目實施①新建Scrapy項目douban在Ubuntu的終端依次完成以下操作:【cd/home】切換到home目錄;【ls】查看該目錄下的所有內容;【mkdirscrapy】在home目錄下創建scrapy文件夾;【cdscrapy】進入scrapy文件夾;【scrapystartprojectdouban】創建Scrapy項目douban;【ls】查看創建成功的scrapy項目douban。②設置settings.py文件在Ubuntu的終端依次完成以下操作:【cd/home/scrapy/douban/douban】進入douban目錄;【ls】查看該目錄下的所有內容,找到settings.py文件;【vimsettings.py】打開setting.py文件并編輯,修改如下數據:ROBOTSTXT=False、刪除ITEM_PIPELINES參數前“#”、USER_AGENT參數前“#”去掉,并將參數值改為“USER_AGENT='Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/48.0.2564.116Safari/537.36'”,保存退出。用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件訓練步驟(2)項目實施用Scrapy爬取豆瓣圖書保存到訓練42項目訓練

③設置items.py文件【vimitems.py】打開并編輯文件,添加如下數據(將pass改成以下5行):book_name=scrapy.Field()author=scrapy.Field()grade=scrapy.Field()count=scrapy.Field()introduction=scrapy.Field()保存退出用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件訓練步驟④爬蟲編寫【cd/home/scrapy/douban/douan/spiders】切換至spiders目錄下;【vimdoubanspider.py】創建與編輯爬蟲文件,導入要爬取的數據項,構建爬蟲所需的name、URL及爬取的內容,添加代碼如下:importscrapyfromdouban.itemsimportDoubanItem

classDoubanspiderSpider(scrapy.Spider):name='doubanspider'allowed_domains=['']defstart_requests(self):url="/tag/%E4%B8%AD%E5%9B%BD%E6%96%87%E5%AD%A6"yieldscrapy.Request(url,callback=self.parse

,dont_filter=True)項目訓練③設置items.py文件用Scrapy爬43

defparse(self,response):item=DoubanItem()info_list=response.xpath("http://div[@class='info']")forinfoininfo_list:

item['book_name']=info.xpath("./h2/a/text()").extract_first().strip()item['author']=info.xpath("./div[@class='pub']/text()").extract_first().strip().split('/')[0]

item['grade']=info.xpath("./div[2]/span[2]/text()").extract_first()item['count']=info.xpath("./div[2]/span[3]/text()").extract_first()item['introduction']=info.xpath("./p/text()").extract_first()yielditemnext_temp_url=response.xpath("http://div[@id='subject_list']/div[@class='paginator']/span[@class='next']/a/@href").extract_first()ifnext_temp_url:next_url=response.urljoin(next_temp_url)yieldscrapy.Request(next_url)

用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件訓練步驟用Scrapy爬取豆瓣圖書保存到訓練步驟44項目訓練

代碼如圖所示用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件訓練步驟項目訓練代碼如圖所示用Scrapy爬取豆瓣圖書保存45項目訓練

⑤運行爬蟲并將其保存至csv文件【cd/home/scrapy/douban】返回douban目錄下;【ls】查看其中文件,確保有douban文件夾和scrapy.cfg文件后;【scrapycrawldoubanspider–odoubanread.csv】運行爬蟲;【ls】查看其中文件,發現生成doubanread.csv文件【catdoubanread.csv】查看文件內容結果。⑥創建MySQL數據庫douban和數據表doubanread【mysql-uroot-p】終端輸入命令后,在Enterpassword:后輸入密碼******,進入MySQL數據庫;創建名為douban的數據庫:mysql>createdatabasedouban;顯示所有的數據庫:mysql>showdatabases;選擇douban數據庫:mysql>usedouban;在MySQL數據庫里創建表doubanread,命令如下:mysql>CREATETABLEdoubanread(idint(11)PRIMARYKEYNOTNULLAUTO_INCREMENT,

book_namevarchar(255)DEFAULTNULL,authorvarchar(255)DEFAULTNULL,gradevarchar(255)DEFAULTNULL,countvarchar(255)DEFAULTNULL,

introductionvarchar(255)DEFAULTNULL)ENGINE=InnoDBAUTO_INCREMENT=1409DEFAULTCHARSET=utf8;mysql>exit;退出數據庫。用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件訓練步驟項目訓練⑤運行爬蟲并將其保存至csv文件用Scra46項目訓練

⑦設置pipelines.py文件【cd/home/scrapy/douban/douban】【vimpipelines.py】編輯pipelines.py文件,導入MySQLdb數據庫,配置數據庫相關的信息,代碼如下:importMySQLdbclassDoubanPipeline(object):def__init__(self):#參數依次是:服務器主機名、用戶名、密碼、數據庫、編碼類型 self.db=MySQLdb.connect('localhost',’root’,'','douban',charset='utf8')self.cursor=self.db.cursor()defprocess_item(self,item,spider):book_name=item.get("book_name","N/A")author=item.get("author","N/A")grade=item.get("grade","N/A")count=item.get("count","N/A")introduction=item.get("introduction","N/A")sql="insertintodoubanread(book_name,author,class_,grade,count,introduction)values(%s,%s,%s,%s,%s,%s)"self.cursor.execute(sql,(book_name,author,class_,grade,count,introduction))mit()defcolse_spider(self,spider):self.cursor.close()self.db.close()用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件訓練步驟項目訓練⑦設置pipelines.py文件用Scr47

⑧再次運行爬蟲【scrapycrawldoubanspider】⑨查看MySQL數據庫中保存的數據【mysql–uroot-p】輸入密碼,進入MySQL數據庫;mysql>usedouban;使用豆瓣數據庫mysql>selectcount(*)fromdoubanread計數統計mysql>select*fromdoubanread;查詢全部記錄查詢結果如圖所示。用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件訓練步驟⑧再次運行爬蟲用Scrapy爬取豆瓣圖書保存到訓練48項目訓練

項目小結:使用Scrapy框架的爬取網絡信息的流程如下在spider(爬取數據文件)中傳入了初始url,并通過引擎傳遞給scheduler調度隊列生成request請求,并通過downloadermiddleware進入downloader從互聯網上下載數據,返回一個response對象。response是一個scrapy.http.response.html.HtmlResponse對象,可以通過css和xpath語法來提取數據提取出的數據是一個Selector或SelectorList對象,并通過downloadermiddle經引擎傳遞給spider(爬取數據文件)中的parse函數進行解析,通過extract()或getall()獲取了字符串列表類型。get()方法返回第一個值為str類型,xtract_first()返回列表中的第一個值為str類型解析后使用yield將函數轉換為一個生成器,不斷的從中抽數據,并傳遞給pipeline進行處理在Itempipeline中使用三個核心方法和初始化函數,首先在__init__()或open_spider()打開數據,接著使用核心方法process_item進行數據處理,最后使用了close_spider()方法關閉了打開的數據,如需把數據保存至MySQL數據庫時創建數據庫和數據表,在Python3.7連接MySQL數據庫,需要用到pymysql或者是MySQLdb模塊。最后運行爬蟲項目,得到目標結果Scrapy框架爬取數據時,要注意反爬蟲headers的設置。用Scrapy爬取豆瓣圖書保存到MySQL數據庫文件項目訓練項目小結:使用Scrapy框架的爬取網絡信49小結07小結07小結

Scrapy框架中由Scrapy引擎(ScrapyEngine)、調度器(Scheduler)、下載器(Downloader)、爬蟲(Spiders)、項目管道(ItemPipeline)、下載器中間件(DownloaderMiddlewares)、爬蟲中間件(SpiderMiddlewares)、調度中間件(SchedulerMiddewares)組件組成。Scrapy項目創建后,該項目中包含項目配置文件scrapy.cfg、項目items文件items.py、定義spider中間件和downloader中間件的middlewares.py、項目管道文件pipelines.py、項目設置文件settings.py、放置Spider的目錄spiders等文件、文件夾。創建Scrapy項目的命令為scrapystartproject項目名稱;運行項目命令為scrapycrawl項目名稱。命令scrapyshellURL與選擇器(selector)配合使用,可以測試抽取數據的xpath或css表達式的正確性。創建Scrapy項目后,需要修改items.py、settings.py、pipelins.py文件和創建爬取數據****(項目名稱).py文件(這個文件在spiders目錄下)。小結Scrapy框架中由Scrapy引擎(Sc51THANKS!THANKS!52第八章Python爬蟲框架第八章Python爬蟲框架53目錄

Contents01常見爬蟲框架02Scrapy安裝03Scrapy爬蟲框架04Scrapy常用工具命令0506Scrapy爬蟲實戰項目訓練07小結目錄01常見爬蟲框架02Scrapy03Scrapy爬蟲54常見爬蟲框架01常見爬蟲框架010102030405爬蟲框架Scrapy是Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用于抓取web站點并從頁面中提取結構化的數據。Scrapy用途廣泛,可以用于數據挖掘、監測和自動化測試。Scrapy吸引人的地方在于它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等。ScrapyCrawley能高速爬取對應網站的內容,支持關系和非關系數據庫,數據可以導出為JSON、XML等。CrawleyPortia是一個用Python編寫無需任何編程知識,就能可視化爬取網站數據的開源工具。Portia是運行在Web瀏覽器中,Portia提供了可視化的Web頁面,只需通過簡單單擊,標注頁面上需提取的相應數據,即可完成爬取規則的開發,這些規則還可在Scrapy中使用,用于抓取頁面。PortiaPySpider是一個強大的網絡爬蟲系統,并帶有強大的WebUI。采用Python語言編寫,分布式架構,支持多種數據庫后端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器。PySpiderBeautifulSoup是一個可以從HTML或XML文件中提取數據的Python庫。它能夠通過你喜歡的轉換器實現慣用的文檔導航、查找、修改文檔的方式。BeautifulSoup會幫你節省數小時甚至數天的工作時間。在獲取html元素時,都是用bs4完成的。BeautifulSoup常見爬蟲框架06Grab框架,可以構建各種復雜的網頁抓取工具,從簡單的5行腳本到處理數百萬個網頁的復雜異步網站抓取工具。Grab提供一個API用于執行網絡請求和處理接收到的內容。Grab07Cola是一個分布式的爬蟲框架,對于用戶來說,只需編寫幾個特定的函數,而無需關注分布式運行的細節。任務會自動分配到多臺機器上,整個過程對用戶是透明的。Cola0102030405爬蟲框架Scrapy是Python開發的Scrapy安裝02Scrapy安裝02第一步

如Python和pip的版本比較低,需要將其升級。Python3.7安裝方法按照第一章方法安裝即可。pip3安裝命令為【apt-getinstallPython3-pip】安裝scrapy的依賴包【sudoapt-getinstallpython3python3-devpython-piplibxml2-devlibxslt1-devlibffi-devlibssl-devzlib1q-dev】在/home目錄下用mkdir命令建立scrapy文件夾利用pip3命令安裝scrapy【pipinstallscrapy】scrapy安裝第二步第三步查看版本第四步【cd/home】【mkdirscrapy】第一步如Python和pip的版本比較低,需要將其升級。PScrapy爬蟲框架03Scrapy爬蟲框架03Scrapy爬蟲框架Scrapy框架組件功能Scrapy引擎(ScrapyEngine)負責處理整個系統的數據流,并在相應動作時觸發事件(框架核心)調度器(Scheduler)接受引擎發過來的Request請求,并加入隊列中,并在引擎再次發來Request請求的時候提供給引擎下載器(Downloader)負責獲取網頁內容并將網頁內容返回給蜘蛛spider爬蟲(Spiders)Scrapy用戶編寫用于分析Response并提取Item的類項目管道(ItemPipeline)位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應下載器中間件(DownloaderMiddlewares)位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應爬蟲中間件(SpiderMiddlewares)介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛(Spiger)的響應輸入(Response)和請求輸出(Item和Request)調度中間件(SchedulerMiddewares)介于Scrapy引擎和調度之間的中間件,處理從Scrapy引擎發送到調度的請求和響應Scrapy爬蟲框架Scrapy框架組件功能Scrapy數據流運行過程step1引擎打開一個網站,找到處理該網站的Spider并向該Spider請求第一個要抓取的URL。step2引擎從Spider中獲取第一個要爬取的URL并通過調度器(Scheduler)和Request進行調度。step3引擎從調度器請求下一個要爬取的URLstep4調度器返回下一個要爬取的URL給引擎,引擎將URL封裝成一個請求(Request),通過下載中間件轉發給下載器step5頁面下載完畢后,下載器把資源封裝成應答包(Response),并將其通過下載中間件發送給引擎step6引擎從下載器中接收到Response并通過Spider中間件發送給Spider處理step7Spider處理Response并返回爬取到的Item和新的Request發送給引擎step8引擎將爬取到的Item交給ItemPipeline,將Request給調度器Scrapy數據流運行過程step1step2step3stScrapy常用工具命令04Scrapy常用工具命令04創建一個Scrapy項目

在爬取之前,需先創建一個新的Scrapy項目。在Ubuntu16.04、Python3.7環境中,在/home/scapy/路徑下建立一個文件夾,命令為【mkdirpyscr】,接下來進入該文件夾,在終端輸入命令【scrapystartprojectpyscr】,即可創建一個名為pyscr的項目,如圖所示。創建一個Scrapy項目在爬取之前,需先創建一個新的Scr63創建一個Scrapy項目pyscr項目內容:scrapy.cfg:項目配置文件pyscr/:項目Python模塊,代碼將從這里導入pyscr/items.py:項目items文件pyscr/middlewares.py:定義spider中間件和downloader中間件pyscr/pipelines.py:項目管道文件pyscr/settings.py:項目設置文件pyscr/spiders:放置Spider的目錄【tree】命令查看項目結構,pyscr項目中包含如圖所示內容創建一個Scrapy項目pyscr項目內容:【tree】命令64Scrapy全局命令在Scrapy框架中,提供了兩種類型的命令:一種是針對項目的命令(即需要有項目,該命令才能成功運行);另一種為全局命令,這些命令不需要有項目就能運行(在有項目的情況下,這些命令也能運行)。全局命令一共有8個,具體如下:

startprojectsettingsrunspidershellfetchviewversionbenchScrapy全局命令在Scrapy框架中,提供了兩種類型的命65Scrapy全局命令startproject命令語法:scrapystartproject<project_name>功能:在目錄project_name下創建一個名為project_name的Scrapy項目。用法示例:

【scrapystartprojectmyproject】settings命令語法:

scrapy

settings

[options]功能:查看scrapy對應的配置信息,如果在項目目錄內使用該命令,查看的是對應項目的配置信息,如果在項目外使用查看的是scrapy默認配置信息。用法示例:【scrapysettings--getBOT_NAME】獲取得到蜘蛛項目的名稱,如果沒有獲取結果則返回none輸出結果:scrapybotScrapy全局命令startproject命令66Scrapy全局命令runspider命令語法:

scrapy

runspider

<spider_file.py>功能:在未創建項目的情況下,運行一個編寫好的Python文件中的spider。用法示例:【scrapyrunspidermyspider.py】輸出結果:[...spiderstartscrawling...]shell命令語法:

scrapy

shell

[url]功能:以給定的URL(如果給出)或者空(沒有給出URL)啟動Scrapyshell。用法示例:【scrapyshell】運行結束后,在終端屏幕上會出現抓取的控制信息Scrapy全局命令runspider命令67Scrapy全局命令fetch命令語法:scrapy

fetch

<url>功能:使用Scrapy下載器(downloader)下載給定的URL,并將獲取到的內容送到標準輸出。該命令以spider下載頁面的方式獲取頁面。如果實際在項目中運行,fetch將會使用項目中spider的屬性訪問,如果該命令不在項目中運行,則會使用默認Scrapydownloader設定。用法示例:【scrapyfetch--nolog】【scrapyfetch--nolog--headers】view命令語法:

scrapy

view

<url>功能:在瀏覽器中打開給定的URL,并以Scrapyspider獲取到的形式展現。有時候spider獲取到的頁面和普通用戶看到的并不相同,此該命令可以用來檢查spider所獲取到的頁面,并確認與用戶看到的一致。應用示例:【scrapyview】Scrapy全局命令fetch命令68Scrapy全局命令version命令語法:

scrapy

version

[-v]功能:輸出Scrapy版本。配合-v運行時,該命令同時輸出Python,Twisted以及平臺的信息,方便bug提交。應用示例:【scrapyversion–v】bench命令語法:scrapy

bench功能:運行benchmark測試,測試Scrapy在硬件上的效率。Scrapy全局命令version命令69Scrapy項目命令項目命令需要在有Scrapy項目的情況下,這些命令才能運行。項目命令主要有以下幾個:crawlchecklisteditparsedeploygenspiderScrapy項目命令項目命令需要在有Scrapy項目的情況下70Scrapy項目命令crawl命令語法:

scrapy

crawl

<spider>功能:運行Scrapy項目,使用spider進行爬取。應用示例:【scrapycrawlpyscr】check命令語法:

scrapy

check

[-l]

<spider>功能:運行contract檢查。應用示例:【scrapycheck–l】Scrapy項目命令crawl命令71Scrapy項目命令list命令語法:scrapy

list功能:列出當前項目中所有可用的spider。每行輸出一個spider。應用示例:【scrapylist】edit命令語法:scrapy

edit

<spider>功能:使用EDITOR中設定的編輯器編輯給定的spider。該命令僅僅是提供一個快捷方式。開發者可以自由選擇其它工具或者IDE來編寫調試spider。應用示例:【scrapyeditspider1】Scrapy項目命令list命令72Scrapy項目命令parse命令語法:【scrapy

parse

<url>

[options]】功能:獲取給定的URL并使用相應的spider分析處理。如果提供--callback選項,則使用spider中的解析方法處理,否則使用parse。支持的選項:--spider=SPIDER:跳過自動檢測spider并強制使用特定的spider--a

NAME=VALUE:設置spider的參數(可能被重復)--callback

or

–c:spider中用于解析返回(response)的回調函數--pipelines:在pipeline中處理item--rulesor-r:使用CrawlSpider規則來發現用來解析返回(response)的回調函數--noitems:不顯示爬取到的item--nolinks:不顯示提取到的鏈接--nocolour:避免使用pygments對輸出著色--depth

or

–d:指定跟進鏈接請求的層次數(默認1)--verbose

or

–v:顯示每個請求的詳細信息應用示例:【scrapyparse“/”-cparse_item】Scrapy項目命令parse命令73Scrapy項目命令deploy命令語法:scrapy

deploy[<target:project>|-l<target>|-L]功能:將項目部署到Scrapyd服務。genspider命令語法:scrapygenspider[-ttemplate]<name><domain>功能:在當前項目中創建一個新的的spiders。這僅是創建spider的一種快捷方式,該方法可以使用提前定義好的模板來生成spider,也可自己創建spider的源碼文件,應用示例如圖所示。Scrapy項目命令deploy命令74Scrapy爬蟲實戰05Scrapy爬蟲實戰05Scrapy爬蟲實戰

在Ubuntu16.04,Python3.7環境下,創建一個Scrapy項目,爬取“糗事百科”中“穿越”網頁中網友發表的糗事內容,并將內容保存在文本文件中。1.創建Scrapy項目qsbk在爬取之前,必須

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論