版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三章數(shù)據(jù)采集進(jìn)階“Python數(shù)據(jù)采集與預(yù)處理目錄CONTENTSAjax數(shù)據(jù)的爬取3.1使用Selenium抓取動(dòng)態(tài)頁面3.2Scrapy爬蟲框架3.3爬蟲框架介紹3.4學(xué)習(xí)目標(biāo)理解什么是Ajax理解Ajax爬取的作用掌握Ajax爬取的方法理解Selenium的作用掌握Selenium的安裝掌握Selenium的使用了解Selenium中的異常掌握定位元素的方法Ajax數(shù)據(jù)的爬取013.1Ajax數(shù)據(jù)的爬取1.Ajax的定義和Ajax數(shù)據(jù)的爬取Ajax是一種創(chuàng)建交互式、快速動(dòng)態(tài)網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù),無需重新加載整個(gè)網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù)。更新的部分網(wǎng)頁其中的數(shù)據(jù)就是通過Ajax加載而來的。這種方式是一種異步加載的方式,原始的頁面最初不會(huì)包含某些數(shù)據(jù),當(dāng)原始頁面加載完后,會(huì)再向服務(wù)器請求某個(gè)接口獲取數(shù)據(jù),然后數(shù)據(jù)才被處理從而呈現(xiàn)到網(wǎng)頁上,這其實(shí)就是發(fā)送了一個(gè)Ajax請求。而現(xiàn)如今使用這種形式的Web網(wǎng)站越來越多。Ajax請求數(shù)據(jù)模型3.1Ajax數(shù)據(jù)的爬取那么如何進(jìn)行Ajax數(shù)據(jù)爬取呢?第一種就是我們?nèi)藶榈萌フ业浇馕龅刂罚ㄒ远拱觌娪胺诸惻判邪?劇情片為例)。3.1Ajax數(shù)據(jù)的爬取1打開瀏覽器的檢查功能:按F12或者右擊頁面空白位置,在彈出的菜單中單擊“檢查”命令2找到傳遞數(shù)據(jù)的真實(shí)地址:單擊頁面中的Network選項(xiàng),然后刷新網(wǎng)頁。此時(shí),Network會(huì)顯示瀏覽器從網(wǎng)頁服務(wù)器中得到的所有文件,一般這個(gè)過程稱為“抓包”3我們單擊Network中的XHR選項(xiàng),點(diǎn)擊Preview標(biāo)簽即可查看數(shù)據(jù)4用request請求這個(gè)地址來獲取數(shù)據(jù)了(代碼在備注里)3.1Ajax數(shù)據(jù)的爬取代碼運(yùn)行結(jié)果可以發(fā)現(xiàn)顯示出了數(shù)據(jù)3.2使用Selenium抓取動(dòng)態(tài)頁面1.Selenium是什么?瀏覽器驅(qū)動(dòng)的下載和配置環(huán)境變量Selenium是一個(gè)自動(dòng)化測試工具,利用它可以模擬人類操作瀏覽器來執(zhí)行一些特定的動(dòng)作,如點(diǎn)擊、下拉、填充數(shù)據(jù)等操作,同時(shí)還可以獲取瀏覽器當(dāng)前呈現(xiàn)的頁面的源代碼,做到可見即可爬。那么該如何安裝呢?對(duì)于不同的瀏覽器要安裝不同的瀏覽器驅(qū)動(dòng)程序,使用它才可以驅(qū)動(dòng)瀏覽器不同瀏覽器對(duì)應(yīng)的下載地址:①Chrome:/a//chromedriver/downloads
或者/index.html②Firefox:/mozilla/geckodriver/releases③Edge:/en-us/microsoft-edge/tools/webdriver/④Safari:/blog/6900/webdriver-support-in-safari-10/下載的瀏覽器驅(qū)動(dòng)放在同一個(gè)文件夾下,然后配置環(huán)境變量,使啟動(dòng)更加方便。點(diǎn)擊此電腦,右擊屬性,點(diǎn)擊高級(jí)系統(tǒng)設(shè)置,新建一個(gè)把驅(qū)動(dòng)文件夾添加進(jìn)去3.2使用Selenium抓取動(dòng)態(tài)頁面Selenium的安裝安裝Selenium包:打開cmd,有兩個(gè)地址,一個(gè)是pipinstallselenium,由于是國外地址,所以安裝較慢;另外一個(gè)pipinstallSelenium-i/simple/(清華大學(xué)的鏡像),安裝較快。當(dāng)然也可以在pycharm里面直接安裝Selenium包,點(diǎn)擊“File”,點(diǎn)擊“Settings”,找到以下目錄,點(diǎn)擊加號(hào)搜索添加即可。3.2使用Selenium抓取動(dòng)態(tài)頁面Selenium的安裝測試是否安裝成功:在pycharm中輸入以下代碼:fromseleniumimportwebdriver#driver=webdriver.Chrome(r'D:\ProgramFiles\chromedriver.exe’)#如果沒有配置環(huán)境變量,要寫驅(qū)動(dòng)的位置driver=webdriver.Chrome()#已經(jīng)配置了環(huán)境變量driver.get("")能成功打開網(wǎng)頁即表明安裝成功3.2使用Selenium抓取動(dòng)態(tài)頁面爬取的豆瓣電影劇情排行榜的數(shù)據(jù)代碼:fromseleniumimportwebdriverimporttime#初始化一個(gè)driver,指定Chrome瀏覽器driver=webdriver.Chrome()#請求豆瓣電影劇情排行榜driver.get("/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action=")#通過page_source獲取網(wǎng)頁源代碼time.sleep(5)#要等它加載一段時(shí)間,才會(huì)有數(shù)據(jù)print(driver.page_source.encode('GBK','ignore').decode('GBK'))#忽略掉非法字符在編譯2.Selenium的使用和等待有些同學(xué)會(huì)發(fā)現(xiàn)有時(shí)并不能爬取成功,這是因?yàn)閟elenium只是模擬瀏覽器的行為,而瀏覽器解析頁面是需要時(shí)間的。我們可以等待一些時(shí)間,等待有兩種方法,一種是隱式等待,一種是顯式等待。隱式等待是在browser.get(‘xxx’)前設(shè)置,代碼是browser.implicitly_wait(10),顯示等待是在browser.get(‘xxx‘)之后設(shè)置,代碼是:element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,"footer")))隱式等待和顯式等待的區(qū)別是:針對(duì)所有元素有效,而顯示等待是針對(duì)某一個(gè)元素有效,可以指定某個(gè)條件,然后設(shè)置最長等待時(shí)間。如果在這個(gè)時(shí)間還沒有找到元素,那么便會(huì)拋出異常。3.2使用Selenium抓取動(dòng)態(tài)頁面
顯示等待和隱式等待當(dāng)同時(shí)有顯式等待和隱式等待的時(shí)候會(huì)怎么樣呢?答:超時(shí)時(shí)間會(huì)選取兩者中較大的那個(gè)同時(shí)顯示等待有很多種,比如可以根據(jù)判斷某個(gè)元素是否被添加到了dom里并且可見,可見代表元素可顯示且寬和高都大于0。具體代碼請看書上的詳解3.2使用Selenium抓取動(dòng)態(tài)頁面try:
代碼except異常名稱:
代碼finally:Selenium的異常Selenium中有定義了很多異常,如表格所示。方法描述
依據(jù)NoSuchElementException當(dāng)選擇器沒有返回一個(gè)元素時(shí),異常拋出mon.exceptions.WebDriverExceptionElementNotVisibleException當(dāng)一個(gè)元素呈現(xiàn)在DOM,但它是不可見的,不能與之進(jìn)行交互,異常將拋出mon.exceptions.InvalidElementStateExceptionElementNotSelectableException當(dāng)嘗試選擇不可選元素時(shí),拋出異常mon.exceptions.InvalidElementStateExceptionNoSuchFrameException當(dāng)切換的目標(biāo)框架不存在時(shí),異常拋出mon.exceptions.InvalidSwitchToTargetExceptionNoSuchWindowException當(dāng)切換的目標(biāo)窗口不存在時(shí),異常拋出mon.exceptions.InvalidSwitchToTargetExceptionNoSuchAttributeException當(dāng)元素的屬性找不到時(shí),拋出異常mon.exceptions.WebDriverExceptionTimeoutException當(dāng)命令沒有足夠的時(shí)間完成時(shí),拋出異常mon.exceptions.WebDriverExceptionUnexpectedTagNameException當(dāng)支持類沒有獲得預(yù)期的We元素時(shí),拋出異常mon.exceptions.WebDriverExceptionNoAlertPresentException當(dāng)一個(gè)意外的警告出現(xiàn)時(shí),拋出異常mon.exceptions.WebDriverException3.2使用Selenium抓取動(dòng)態(tài)頁面爬取前三十的榜單,代碼見備注。代碼解釋:代碼定義了一個(gè)鼠標(biāo)滾動(dòng)函數(shù)scroll_to_Bottom,用來緩慢滑動(dòng)框來加載后面的數(shù)據(jù)。condition函數(shù)中,driver.find_element_by_xpath表示用xpath的方式來查找元素。類似的還有主函數(shù)里面的driver.find_elements_by_class_name表示用類的名字來查找元素,找到class名字為movie-name-text的元素。在condition中xpath的匹配條件可以通過查看源代碼并右鍵復(fù)制xpath格式(圖3-13),取出前三十個(gè)名稱,寫入到movie_Top30.txt文本中。3.Selenium的應(yīng)用實(shí)例爬取結(jié)果3.2使用Selenium抓取動(dòng)態(tài)頁面Selenium選擇元素的方法#4、find_element_by_tag_name.下面兩種方法等價(jià)submitTag=driver.find_element_by_tag_name('fg')submitTag=driver.find_element(By.TAG_NAME,'fg')#5、find_element_by_xpath.下面兩種方法等價(jià)submitTag=driver.find_element_by_xpath('//div/a')submitTag=driver.find_element(By.XPATH,'//div/a')#6、find_element_css_selector.下面兩種方法等價(jià)submitTag=driver.find_element_by_css_selector('.quickdelete-wrap>input')submitTag=driver.find_element(By.CSS_SELECTOR,'.quickdelete-wrap>input')
如果想查找多個(gè)元素就要把element改為elements在這些方法中xpath和css_selector是比較好的方法#1、find_element_by_id.下面兩種方法等價(jià)inputTag=driver.find_element_by_id('kw')inputTag=driver.find_element(By.ID,'kw')inputTag.send_keys('python')#2、find_element_by_class_name.下面兩種方法等價(jià)submitTag=driver.find_element_by_class_name('fg')submitTag=driver.find_element(By.CLASS_NAME,'fg')#3、driver.find_element_by_name.下面兩種方法等價(jià)submitTag=driver.find_element_by_name('fg')submitTag=driver.find_element(By.NAME,'fg')3.2使用Selenium抓取動(dòng)態(tài)頁面Selenium的操作方法常見的操作元素方法如下:Clear:清除元素的內(nèi)容?!end_keys:模擬按鍵輸入?!lick:單擊元素?!ubmit:提交表單。driver.find_element_by_id("kw").send_keys("python")#模擬輸入文字pythondriver.find_element_by_id("su").click()#id是su的是搜索的按鈕,用click方法點(diǎn)擊模擬登陸實(shí)例:登陸CSDN(代碼在下頁)3.2使用Selenium抓取動(dòng)態(tài)頁面Selenium的操作方法fromtimeimportsleep
fromseleniumimportwebdriverfromselenium.webdriver.chrome.optionsimportOptions
#登錄CSDN賬號(hào)defdo_sign():driver.get('/login?code=public')driver.implicitly_wait(20)driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div[2]/div[5]/ul/li[2]/a').click()#選擇密碼登錄#輸入賬號(hào)
輸入密碼
點(diǎn)擊登錄按鈕driver.implicitly_wait(20)driver.find_element_by_xpath('//*[@id="all"]').send_keys(input("請輸入手機(jī)號(hào)/郵箱/用戶名:"))driver.find_element_by_id('password-number').send_keys(input('請輸入密碼:'))driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div[2]/div[5]/div/div[6]/div/button').click()print("登錄成功")3.2使用Selenium抓取動(dòng)態(tài)頁面Selenium的操作方法if__name__=='__main__':#chrome瀏覽器啟動(dòng)配置chrome_options=Options()#chrome_options.add_argument('--headless')#隱藏瀏覽器#取消"Chrome正受到自動(dòng)軟件的控制"提示chrome_options.add_experimental_option('useAutomationExtension',False)chrome_options.add_experimental_option("excludeSwitches",['enable-automation'])driver=webdriver.Chrome(options=chrome_options)driver.set_window_rect(0,0,1400,1000)#設(shè)置窗口大小print('CSDN自動(dòng)登錄腳本已啟動(dòng)')do_sign()#登錄賬號(hào)sleep(30)driver.close()3.2使用Selenium抓取動(dòng)態(tài)頁面3.4Selenium高級(jí)操作當(dāng)我們用Selenium來爬取網(wǎng)頁時(shí)它的本質(zhì)就是通過模擬人的來瀏覽網(wǎng)頁,它要等待所有的元素加載完后才開始爬取內(nèi)容,所以速度往往比較慢。因此我們在爬取的時(shí)候可以禁止瀏覽器加載一些我們不需要的內(nèi)容,從而來加快速度右圖限制css,圖片,JavaScript的執(zhí)行實(shí)例(代碼在下一頁)fp.set_preference(“javascript.enabled”,False)表示不使用JavaScriptfp.set_preference(“permissions.default.stylesheet”,2)表示控制css沒有效果fp.set_preference(“permissions.default.image”,2)表示控制不顯示圖片3.2使用Selenium抓取動(dòng)態(tài)頁面3.4Selenium高級(jí)操作#--coding:utf-8--#FireFox瀏覽器fromseleniumimportwebdriverfp=webdriver.FirefoxProfile()fp.set_preference("javascript.enabled",False)fp.set_preference("permissions.default.stylesheet",2)fp.set_preference("permissions.default.image",2)#沒有配置環(huán)境變量則需要加上executable_pathdriver=webdriver.Firefox(firefox_profile=fp)driver.get("/")爬蟲框架介紹033.3.1爬蟲框架介紹1.ScarpyScrapy是一個(gè)為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。Scrapy使用了Twisted異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊,該框架用途廣泛,可以應(yīng)用在包括數(shù)據(jù)挖掘,檢測和自動(dòng)化測試,信息處理或存儲(chǔ)歷史數(shù)據(jù)等一系列的任務(wù)場景中。其最初是為了
頁面抓?。ňW(wǎng)絡(luò)抓取
)所設(shè)計(jì)的,也可以應(yīng)用在獲取API所返回的數(shù)據(jù)(例如
AmazonAssociatesWebServices)或者通用的網(wǎng)絡(luò)爬蟲。2.PySpiderPySpider是由binux做的一個(gè)爬蟲架構(gòu)的開源化實(shí)現(xiàn)。其作為一個(gè)高效的網(wǎng)絡(luò)爬蟲系統(tǒng)并帶有強(qiáng)大的WebUI??蚣懿捎肞ython語言編寫,分布式架構(gòu),支持多種數(shù)據(jù)庫后端,強(qiáng)大的WebUI支持腳本編輯器,任務(wù)監(jiān)視器,項(xiàng)目管理器以及結(jié)果查看器。Pyspider與Scrapy相比,其提供了可視化WebUI,而Scrapy則是采用的代碼和命令行操作,但Scrapy能夠適合更復(fù)雜的工作場景。3.CrawleyCrawley可以高速爬取對(duì)應(yīng)網(wǎng)站的內(nèi)容,支持關(guān)系和非關(guān)系數(shù)據(jù)庫,數(shù)據(jù)可以導(dǎo)出為JSON、XML等。Crawley作為使用python開發(fā)出來的一款爬蟲框架,一直致力于改變?nèi)藗儚幕ヂ?lián)網(wǎng)中提取數(shù)據(jù)的方式,讓大家可以更高效地從互聯(lián)網(wǎng)中爬取對(duì)應(yīng)內(nèi)容。其特點(diǎn)主要為高速、簡單、支持非關(guān)系型數(shù)據(jù)庫。3.3.1爬蟲框架介紹4.PortiaPortia是一個(gè)開源可視化爬蟲工具,可讓使用人員在不需要任何編程知識(shí)的情況下爬取網(wǎng)站,給出你要爬取的網(wǎng)頁中感興趣的數(shù)據(jù)內(nèi)容,Portia將創(chuàng)建一個(gè)爬蟲來從類似的頁面提取數(shù)據(jù)。5.GrabGrab是一個(gè)用于構(gòu)建Web刮板的Python框架。借助Grab可以構(gòu)建各種復(fù)雜的網(wǎng)頁抓取工具,從簡單的5行腳本到處理數(shù)百萬個(gè)網(wǎng)頁的復(fù)雜異步網(wǎng)站抓取工具。Grab提供一個(gè)API用于執(zhí)行網(wǎng)絡(luò)請求和處理接收到的內(nèi)容,例如與HTML文檔的DOM樹進(jìn)行交互。6.ColaCola是一個(gè)分布式的爬蟲框架,對(duì)于用戶來說,只需編寫幾個(gè)特定的函數(shù),而無需關(guān)注分布式運(yùn)行的細(xì)節(jié)。任務(wù)會(huì)自動(dòng)分配到多臺(tái)機(jī)器上,整個(gè)過程對(duì)用戶是透明的。7.NewspaperNewspaper可以用來提取新聞、文章和內(nèi)容分析。使用多線程,支持10多種語言等。作者從requests庫的簡潔與強(qiáng)大得到靈感,使用python開發(fā)的可用于提取文章內(nèi)容的程序。支持10多種語言并且所有的都是unicode編碼。3.3.2爬蟲框架機(jī)制通用爬蟲框架的工作流程如下:(1)確定種子URL,并存入待抓取的URL列表;(2)從待抓取的URL列表中隨機(jī)提取一個(gè)URL,發(fā)送到URL下載器;(3)URL下載器開始下載頁面,如果下載成功,將頁面發(fā)送給URL解析器,同時(shí)把URL存入已抓取的URL列表;如果下載失敗,將URL重新存入待抓取的URL列表,重復(fù)步驟2;(4)URL解析器開始解析頁面,將獲得的新的URL存入待抓取的URL列表,同時(shí)將需要的、有價(jià)值的數(shù)據(jù)存入數(shù)據(jù)庫;(5)重復(fù)步驟4,直到待抓取的URL列表為空。以本書使用的Scrapy框架為例,其大致的運(yùn)行流程如下:(1)首先,引擎從調(diào)度器中取出一個(gè)鏈接(URL)用于接下來的抓?。?)引擎把URL封裝成一個(gè)請求(Request)傳給下載器,下載器把資源下載下來,并封裝成應(yīng)答包(Response)。(3)爬蟲開始解析Response。(4)若是解析出實(shí)體(Item),則交給實(shí)體管道進(jìn)行進(jìn)一步的處理。(5)若是解析出的是鏈接(URL),則把URL交給Scheduler等待抓取從Scrapy和通用爬蟲框架的工作流程可以看出,基本整個(gè)爬取工作的處理原理一致,只不過Scrapy通過各種組件對(duì)不同的操作進(jìn)行了包裹與封裝,使爬取工作更加自動(dòng)和高效化。Scrapy爬蟲框架043.4.1
Scrapy的簡介與安裝①引擎(Scrapy):用來處理整個(gè)系統(tǒng)的數(shù)據(jù)流處理,觸發(fā)事務(wù)(框架核心)。②調(diào)度器(Scheduler):用來接受引擎發(fā)過來的請求,壓入隊(duì)列中,并在引擎再次請求的時(shí)候返回。可以想像成一個(gè)URL(抓取網(wǎng)頁的網(wǎng)址或者說是鏈接)的優(yōu)先隊(duì)列,<br>由它來決定下一個(gè)要抓取的網(wǎng)址是什么,同時(shí)去除重復(fù)的網(wǎng)址。③下載器(Downloader):用于下載網(wǎng)頁內(nèi)容,并將網(wǎng)頁內(nèi)容返回給蜘蛛(Scrapy下載器是建立在twisted這個(gè)高效的異步模型上的)。④爬蟲(Spiders):爬蟲主要用于從特定的網(wǎng)頁中提取自己需要的信息,即所謂的實(shí)體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續(xù)抓取下一個(gè)頁面。⑤項(xiàng)目管道(Pipeline):負(fù)責(zé)處理爬蟲從網(wǎng)頁中抽取的實(shí)體,主要的功能是持久化實(shí)體、驗(yàn)證實(shí)體的有效性、清除不需要的信息。當(dāng)頁面被爬蟲解析后,<br>將被發(fā)送到項(xiàng)目管道,并經(jīng)過幾個(gè)特定的次序處理數(shù)據(jù)。⑥下載器中間件(DownloaderMiddlewares):位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應(yīng)。⑦爬蟲中間件(SpiderMiddlewares):介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應(yīng)輸入和請求輸出。⑧調(diào)度中間件(SchedulerMiddewares):介于Scrapy引擎和調(diào)度之間的中間件,從Scrapy引擎發(fā)送到調(diào)度的請求和響應(yīng)。3.4.1
Scrapy的簡介與安裝在電腦上打開cmd,然后輸入pipinstallscrapy,如圖3-18所示。這時(shí)開始安裝Scrapy,接下來等待安裝即可。3.4.1
Scrapy的簡介與安裝安裝成功后,在cmd中輸入scrapy-h進(jìn)行測試,如圖3-19所示,至此scrapy庫安裝成功。3.4.2Scrapy的基本使用Scrapy的基本使用步驟如下:①創(chuàng)建一個(gè)工程和Spider模板②編寫Spider③編寫ItemPipeline④優(yōu)化配置策略Scrapy常用命令命令說明格式startproject創(chuàng)建一個(gè)新工程scrapystartproject<name>[dir]genspider創(chuàng)建一個(gè)爬蟲scrapygenspider[options]<name>settings獲得爬蟲配置信息scrapysettings[options]crawl運(yùn)行一個(gè)爬蟲scrapycrawl<spider>list列出工程中所有爬蟲scrapylistshell啟動(dòng)URL調(diào)試命令行scrapyshell[url]3.4.3創(chuàng)建Scrapy項(xiàng)目打開cmd,輸入d:進(jìn)入到D盤,然后通過cd命令,cdpyscrapy,即可進(jìn)入到指定的存儲(chǔ)地址D:\pyscrapy中。本節(jié)以爬取股票交易為例,進(jìn)行網(wǎng)頁爬取,HTML頁面地址為:/stocklist.html,網(wǎng)頁爬取名稱為stocks.html,存儲(chǔ)地址為D:\pyscrapy3.4.3創(chuàng)建Scrapy項(xiàng)目然后創(chuàng)建工程項(xiàng)目,輸入scrapystartprojectBaiduStocks,然后cdBaiduStocks,至此工程創(chuàng)建成功,如左圖所示。接下來可以打開文件查看創(chuàng)建的內(nèi)容,如右圖所示3.4.3創(chuàng)建Scrapy項(xiàng)目然后繼續(xù)輸入scrapygenspiderstocks,產(chǎn)生一個(gè)Scrapy爬蟲,如上圖所示,查看文件,發(fā)現(xiàn)產(chǎn)生了一個(gè)新的文件夾,名稱為__pycache__文件,如下圖所示。3.4.4編寫Spider在電腦上打開D:\pyscrapy\BaiduStocks\BaiduStocks\spiders中的stocks.py文件,,接下來編寫里面的內(nèi)容,配置產(chǎn)生Spider爬蟲,如上述代碼所示。importscrapyimportreclassStocksSpider(scrapy.Spider):name='stocks'start_urls=['/stock_list.html']defparse(self,response):forhrefinresponse.css('a::attr(href)').extract():try:stock=re.findall(r"[s][hz]\d{6}",href)[0]url='/'+stock+'/gp'yieldscrapy.Request(url,callback=self.parse_stock)except:continuedefparse_stock(self,response):infoDict={}stockName=response.css('.title_bg')stockInfo=response.css('.col-2.fr')name=stockName.css('.col-1-1').extract()[0]code=stockName.css('.col-1-2').extract()[0]info=stockInfo.css('li').extract()foriininfo[:13]:key=re.findall('>.*?<',i)[1][1:-1]key=key.replace('\u2003','')key=key.replace('\xa0','')try:val=re.findall('>.*?<',i)[3][1:-1]except:val='--'infoDict[key]=valinfoDict.update({'股票名稱':re.findall('\>.*\<',name)[0][1:-1]+\re.findall('\>.*\<',code)[0][1:-1]})yieldinfoDict3.4.5編寫ItemPipeline接下來編寫ItemPipeline,打開D:\pyscrapy\BaiduStocks\BaiduStocks中的pipelines.py文件,修改里面的代碼,如上述代碼所示。fromitemadapterimportItemAdapterclassScrapyGupiaoPipeline:defprocess_item(self,item,spider):returnitemclassScrapyGupiaoPipeline:defopen_spider(self,spider):self.f=open('gupiao.txt','w')defclose_spider(self,spider):self.f.close()defprocess_item(self,item,spider):try:line=str(dict(item))+'\n'self.f.write(line)except:passreturnitem3.4.6設(shè)置Settings模塊接下來設(shè)置settings模塊,打開D:\pyscrapy\BaiduStocks\BaiduStocks中的settings.py文件,將上述代碼的注釋取消即可。最后完成所有配置后,運(yùn)行scrapy完成爬取,在CMD中輸入scrapycrawlstocks,如下圖所示,即可完成爬取。ITEM_PIPELINES={'BaiduStocks.pipelines.BaidustocksPipeline':300,第三章BUSINESSPLANFORWORK謝謝觀看“Python數(shù)據(jù)采集與預(yù)處理第四章數(shù)據(jù)清洗“Python數(shù)據(jù)采集與預(yù)處理目錄CONTENTS數(shù)據(jù)清洗概述4.1缺失數(shù)據(jù)處理4.2異常數(shù)據(jù)和重復(fù)值處理4.3數(shù)據(jù)轉(zhuǎn)換4.4學(xué)習(xí)目標(biāo)掌握數(shù)據(jù)清洗的定義理解數(shù)據(jù)清洗的作用掌握處理缺失值的相關(guān)函數(shù)理解處理缺失值的幾種方式理解處理異常數(shù)據(jù)的方法掌握數(shù)據(jù)轉(zhuǎn)換中出現(xiàn)的函數(shù)理解數(shù)據(jù)轉(zhuǎn)換的作用了解數(shù)據(jù)轉(zhuǎn)換的幾種方法數(shù)據(jù)清洗概述014.1數(shù)據(jù)清洗概述數(shù)據(jù)清洗的定義數(shù)據(jù)清洗是指發(fā)現(xiàn)并糾正數(shù)據(jù)文件中可識(shí)別的錯(cuò)誤的最后一道程序,包括檢查數(shù)據(jù)一致性,處理無效值和缺失值等。數(shù)據(jù)清洗的原因數(shù)據(jù)收集中很大可能會(huì)存在“臟”數(shù)據(jù),在具體的運(yùn)用中需要將其剔除。數(shù)據(jù)清洗的方法數(shù)據(jù)清洗的主要方法有三個(gè)方面的內(nèi)容,分別是缺失數(shù)據(jù)處理,異常數(shù)據(jù)處理和數(shù)據(jù)轉(zhuǎn)化處理。4.1數(shù)據(jù)清洗概述缺失數(shù)據(jù)處理02數(shù)據(jù)缺失的原因04030201系統(tǒng)實(shí)時(shí)性能要求較高要求得到這些信息前迅速做出判斷或決策。需要根據(jù)不同應(yīng)用場景下缺失值可能包含的信息進(jìn)行合理填充。獲取這些信息的代價(jià)太大地質(zhì)勘探中,每次的取樣打孔花費(fèi)很高的成本,于是就只階段性的按某種規(guī)律取樣打孔。對(duì)象的某個(gè)或某些屬性是不可用,信息不重要一個(gè)未婚者的配偶;在研究海拔高度對(duì)于人身高的影響,人的體重等相關(guān)的屬性。數(shù)據(jù)暫時(shí)無法被獲取,數(shù)據(jù)遺漏醫(yī)療數(shù)據(jù)庫中,病人的體檢報(bào)告檢查結(jié)果;數(shù)據(jù)采集設(shè)備的故障等情況。4.2缺失數(shù)據(jù)處理4.2缺失數(shù)據(jù)處理刪除元組將存在遺漏信息屬性值的對(duì)象(元組,記錄)刪除,從而得到一個(gè)完備的信息表。數(shù)據(jù)補(bǔ)齊用一定的值去填充空值,使信息表完整。通?;诮y(tǒng)計(jì)學(xué)原理,根據(jù)初始數(shù)據(jù)集中其余對(duì)象取值的分布情況來對(duì)一個(gè)缺失值進(jìn)行填充。不處理補(bǔ)齊處理是將未知值以我們的主觀估計(jì)值進(jìn)行填補(bǔ),不一定完全符合客觀事實(shí),在對(duì)不完備信息進(jìn)行補(bǔ)齊處理的同時(shí),或多或少地改變了原始的信息系統(tǒng),從而產(chǎn)生誤差。4.2缺失數(shù)據(jù)處理刪除元組方法十分方便,但是局限性卻很大。它通過減少樣本數(shù)據(jù)源來換取信息的完備,同時(shí)會(huì)丟棄大量隱藏在這些對(duì)象中的信息。如果初始數(shù)據(jù)集包含的樣本數(shù)較少,簡單刪除少量數(shù)據(jù)足以嚴(yán)重影響信息的客觀性和結(jié)果的正確性。同時(shí),當(dāng)缺失數(shù)據(jù)所占比例較大,特別當(dāng)遺漏數(shù)據(jù)非隨機(jī)分布時(shí),這種方法可能導(dǎo)致數(shù)據(jù)發(fā)生偏離,從而引出錯(cuò)誤的結(jié)論。在Pandas中,一般使用isnull()函數(shù)或notnull()函數(shù)來查看列中相映的屬性值是否為缺失值,使用dropna()函數(shù)刪除所有的缺失值4.2缺失數(shù)據(jù)處理創(chuàng)建兩個(gè)數(shù)據(jù)如圖a的結(jié)果如下4.2缺失數(shù)據(jù)處理對(duì)a調(diào)notnull()函數(shù),結(jié)果如下對(duì)a調(diào)dropna()函數(shù),結(jié)果如下對(duì)a調(diào)isnull()函數(shù),結(jié)果如下4.2缺失數(shù)據(jù)處理數(shù)據(jù)補(bǔ)齊1人工填寫2特殊值填充/“平局值”填充/熱卡填充3K最近距離鄰法4組合完整化方法5建立回歸方程法6期望值最大化方法4.2缺失數(shù)據(jù)處理使用均值填充后初始化數(shù)據(jù)使用眾數(shù)填充后創(chuàng)捷一個(gè)數(shù)據(jù)數(shù)據(jù)集如下01.012.023.034.543.054.065.075.085.095.0104.5114.5126.0136.0147.01512.0162.0174.5183.0193.001.012.023.03NaN43.054.065.075.085.095.010NaN11NaN126.0136.0147.01512.0162.017NaN183.0193.001.012.023.033.043.054.065.075.085.095.0103.0113.0126.0136.0147.01512.0162.0173.0183.0193.04.2缺失數(shù)據(jù)處理補(bǔ)齊處理是將未知值以我們的主觀估計(jì)值進(jìn)行填補(bǔ),不一定完全符合客觀事實(shí),在對(duì)不完備信息進(jìn)行補(bǔ)齊處理的同時(shí),或多或少地改變了原始的信息系統(tǒng),從而產(chǎn)生誤差。而且,對(duì)空值不正確的填充往往將新的噪聲引入數(shù)據(jù)中,使挖掘任務(wù)產(chǎn)生錯(cuò)誤的結(jié)果。因此,在許多情況下,還是希望在保持原始信息不發(fā)生變化的前提下對(duì)信息系統(tǒng)進(jìn)行處理。不處理123不處理缺失值,直接在包含空值的數(shù)據(jù)上進(jìn)行數(shù)據(jù)挖掘的方法主要有貝葉斯網(wǎng)絡(luò)和人工神經(jīng)網(wǎng)絡(luò)等。貝葉斯網(wǎng)絡(luò)(Bayesiannetwork)又稱信念網(wǎng)絡(luò)(Beliefnetwork),或有向無環(huán)圖模型,是一種概率圖型模型。它提供了一種自然的表示變量間因果信息的方法,用來發(fā)現(xiàn)數(shù)據(jù)間的潛在關(guān)系。在貝葉斯網(wǎng)絡(luò)中,用節(jié)點(diǎn)表示變量,有向邊表示變量間的依賴關(guān)系。貝葉斯網(wǎng)絡(luò)僅適合于對(duì)領(lǐng)域知識(shí)具有一定了解的情況,至少對(duì)變量間的依賴關(guān)系有較清楚的認(rèn)識(shí)。否則直接從數(shù)據(jù)中學(xué)習(xí)貝葉斯網(wǎng)的結(jié)構(gòu)不但復(fù)雜性較高(隨著變量的增加,指數(shù)級(jí)增加),網(wǎng)絡(luò)維護(hù)代價(jià)昂貴,而且它的估計(jì)參數(shù)較多,為系統(tǒng)帶來了高方差,影響了預(yù)測精度。異常數(shù)據(jù)和重復(fù)值處理03刪除重復(fù)值重復(fù)值處理在Pandas工具庫下提供了drop_duplicates()函數(shù)來刪除,我們直接使用該函數(shù)便可以進(jìn)行刪除。異常值檢測首先,確定異常值的檢測標(biāo)準(zhǔn)。它有著各種標(biāo)準(zhǔn)的設(shè)定,需要具體情況具體分析。其次,需要將檢測標(biāo)準(zhǔn)寫成條件的形式。使用條件去過濾原始數(shù)據(jù)。最關(guān)鍵的步驟是如何確定異常值的檢測標(biāo)準(zhǔn)。異常值過濾檢測完成后,直接可以使用相關(guān)函數(shù)方法就可以去除。過濾異常值檢測異常值0103024.3異常數(shù)據(jù)和重復(fù)值處理010302假設(shè)現(xiàn)在需要找到數(shù)據(jù)中A所有的異常值并輸出,異常值范圍設(shè)定為成績不在(0,100]中的數(shù)據(jù)。如果需要找到A,B,C,D中的所有異常項(xiàng),可以進(jìn)行如下的操作。生成了一組含100條學(xué)生數(shù)據(jù)的DataFrame#創(chuàng)建數(shù)據(jù)data=pd.DataFrame(np.random.randint(0,101,size=400).reshape((100,4)),columns= ['A','B','C','D'])#插入數(shù)據(jù)data.iloc[[0,11,33,55,66,77],[0,1,2,3]]=np.random.randint(101,1000,size=24).reshape((6,4))添加標(biāo)題#選取A字段error_A=data['A']#使用條件表達(dá)式過濾異常值error_listA=error_A[(100<error_A)|(error_A<0)]error_listA:08321117933578557956657077181#使用條件表達(dá)式過濾異常值error=data[((100<data)|(data<0)).any(1)]error:ABCD083256074729911179282499872335785442855215579520126759566570153119699771813086872684.3異常數(shù)據(jù)和重復(fù)值處理數(shù)據(jù)轉(zhuǎn)換04數(shù)據(jù)類型轉(zhuǎn)換函數(shù)或映射進(jìn)行數(shù)據(jù)轉(zhuǎn)換重命名軸索引連續(xù)數(shù)據(jù)離散化數(shù)據(jù)標(biāo)準(zhǔn)化我們收集來的數(shù)據(jù)很可能具有不同的格式或表現(xiàn)形式,此時(shí)需要對(duì)數(shù)據(jù)進(jìn)行各種轉(zhuǎn)換,數(shù)據(jù)類型,離散化等轉(zhuǎn)換是比較常見的轉(zhuǎn)換形式,下面將對(duì)常見的幾種轉(zhuǎn)化形式進(jìn)行介紹。4.4數(shù)據(jù)轉(zhuǎn)換啞變量處理在進(jìn)行數(shù)據(jù)處理的時(shí)候,經(jīng)常會(huì)涉及到數(shù)據(jù)類型之間的轉(zhuǎn)換。例如在將用戶填寫的證件號(hào)存入時(shí)作為字符串存入,但之后會(huì)涉及到使用該數(shù)據(jù)進(jìn)行數(shù)學(xué)運(yùn)算,這時(shí)就要將數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換,即把字符串類型數(shù)據(jù)轉(zhuǎn)換為整型或者浮點(diǎn)型。這里介紹了一些常見的在python中使用的數(shù)據(jù)轉(zhuǎn)化函數(shù)。函數(shù)作用int(x)將x轉(zhuǎn)換成整數(shù)類型float(x)將x轉(zhuǎn)換成浮點(diǎn)數(shù)類型complex(real,[,imag])創(chuàng)建一個(gè)復(fù)數(shù)str(x)將x轉(zhuǎn)換為字符串repr(x)將x轉(zhuǎn)換為表達(dá)式字符串eval(str)計(jì)算在字符串中的有效Python表達(dá)式,并返回一個(gè)對(duì)象chr(x)將整數(shù)x轉(zhuǎn)換為一個(gè)字符ord(x)將字符x轉(zhuǎn)換為它對(duì)應(yīng)的整數(shù)值hex(x)將整數(shù)x轉(zhuǎn)換為一個(gè)十六進(jìn)制字符串oct(x)將整數(shù)x轉(zhuǎn)換為一個(gè)八進(jìn)制的字符串4.4數(shù)據(jù)轉(zhuǎn)換函數(shù)或映射進(jìn)行數(shù)據(jù)轉(zhuǎn)換使用函數(shù)或映射進(jìn)行數(shù)據(jù)轉(zhuǎn)換主要涉及的是key和value的一一對(duì)應(yīng)關(guān)系,這里的映射來源于數(shù)學(xué)中的概念,是指兩個(gè)元素的集之間元素相互“對(duì)應(yīng)”的關(guān)系,為名詞。在Python中主要使用map()函數(shù)來處理相關(guān)數(shù)據(jù)map()函數(shù)會(huì)根據(jù)提供的函數(shù)對(duì)指定序列做映射。使用方法為map(function,iterable,...)參數(shù)function是一個(gè)函數(shù)映射關(guān)系,可以是Python內(nèi)置的函數(shù)也可以是自定義的;參數(shù)iterable為一個(gè)可以迭代的對(duì)象,例如列表、元組、字符串等。map()函數(shù)的作用是將function應(yīng)用于iterable的每一個(gè)元素,結(jié)果以列表的形式返回。下面看一下map()在數(shù)據(jù)處理中具體是如何使用的,首先定義肉類數(shù)據(jù)和肉的來源,然后將所有的大寫變換成小寫,最后用map()函數(shù)來接收一個(gè)函數(shù)或一個(gè)包含映射關(guān)系的字典型對(duì)象。4.4數(shù)據(jù)轉(zhuǎn)換Out:foodweightanimal0bacon4.0pig1pulledpork3.0pig2bacon12.0pig3Pastrami6.0cow4cornedbeef7.5cow5Bacon8.0pig6pastrami3.0cow7honeyham5.0pig8novalox6.0salmon#我們設(shè)定的一些和肉類相關(guān)的數(shù)據(jù)data=pd.DataFrame({'food':['bacon','pulledpork','bacon','Pastrami','cornedbeef','Bacon','pastrami','honeyham','novalox'],'weight':[4,3,12,6,7.5,8,3,5,6]})#添加一列表明每種肉的來源meat_to_animal={'bacon':'pig','pulledpork':'pig','pastrami':'cow','cornedbeef':'cow','honeyham':'pig','novalox':'salmon'}#將data中的大寫的肉類變?yōu)樾慙owercased=data['food'].str.lower()#series的map方法接收一個(gè)函數(shù)或一個(gè)包含映射關(guān)系的字典型對(duì)象。data['animal']=lowercased.map(meat_to_animal)4.4數(shù)據(jù)轉(zhuǎn)換重命名軸索引:是將數(shù)據(jù)集的軸標(biāo)簽通過函數(shù)或映射進(jìn)行轉(zhuǎn)換,從而得到一個(gè)新對(duì)象。無需新建一個(gè)數(shù)據(jù)結(jié)構(gòu)。通過函數(shù)或某種形式的映射可以對(duì)軸標(biāo)簽進(jìn)行類似的轉(zhuǎn)換,生成新的且?guī)в胁煌瑯?biāo)簽的對(duì)象,可以在不生成新的數(shù)據(jù)結(jié)構(gòu)的情況下修改軸。這里主要使用map()和rename()兩個(gè)函數(shù),rename()方法主要用于更改行列的標(biāo)簽,即列名和行索引,其可以傳入一個(gè)字典或者一個(gè)函數(shù)。下面通過一個(gè)具體的例子了解其使用方法,首先定義初始數(shù)據(jù),并使用map()函數(shù)將第一次數(shù)據(jù)的index變?yōu)榇髮?,然后使用rename()函數(shù)將第二次數(shù)據(jù)的index變?yōu)榇髮懀詈髮ename()函數(shù)結(jié)合字典對(duì)象使用。重命名軸索引4.4數(shù)據(jù)轉(zhuǎn)換結(jié)果1:Out:
onetwothreefourOHIO
0
1
2
3COLORADO4
5
6
7NEWYORK
8
9
10
11#生成一串datadata=DataFrame(np.arange(12).reshape((3,4)),index=['Ohio','Colorado','NewYork'],columns=['one','two','three','four'])#1.通過map將index變?yōu)榇髮慸ata.index=data.index.map(str.upper)#2.通過rename將index大寫data_2=data.rename(index=str.title,columns=str.upper)#3.rename結(jié)合字典對(duì)象使用data.rename(index={'Ohio':'eee'},columns={'three':'三'},inplace=True)結(jié)果2:Out:
onetwothreefourOHIO
0
1
2
3COLORADO4
5
6
7NEWYORK
8
9
10
11結(jié)果3:Out:
onetwothreefourOHIO
0
1
2
3COLORADO4
5
6
7NEWYORK
8
9
10
114.4數(shù)據(jù)轉(zhuǎn)換連續(xù)數(shù)據(jù)離散化:連續(xù)數(shù)據(jù)離散化就是在數(shù)據(jù)的取值范圍內(nèi),設(shè)定若干個(gè)離散的劃分點(diǎn),將取值范圍劃分為一些離散化的區(qū)間,最后用不同的符號(hào)或整數(shù)值代表落在每個(gè)子區(qū)間中的數(shù)據(jù)值。在一些算法中,要求輸入數(shù)據(jù)類型為離散數(shù)據(jù),但是現(xiàn)實(shí)數(shù)據(jù)往往是連續(xù)和離散混合的。對(duì)于連續(xù)數(shù)據(jù),一般把數(shù)據(jù)分離成“箱子”進(jìn)行分析。在Pandas庫中,使用cut()函數(shù)用來把一組數(shù)據(jù)分割成離散的區(qū)間。如有一組年齡數(shù)據(jù),可以使用pandas.cut將年齡數(shù)據(jù)分割成不同的年齡段并打上標(biāo)簽。下面介紹cut()函數(shù)的用法。連續(xù)數(shù)據(jù)離散化4.4數(shù)據(jù)轉(zhuǎn)換Out:[(18,25],(18,25],(18,25],(25,35],(18,25],...,(25,35],(60,100],(35,60],(35,60],(25,35]]Length:12Categories(4,interval[int64]):[(18,25]<(25,35]<(35,60]<(60,100]]#設(shè)立一個(gè)年齡的一維數(shù)組ages=[20,22,25,27,21,23,37,31,61,45,41,32]#各組的下界bins=[18,25,35,60,100]#進(jìn)行分組cats=pd.cut(ages,bins)4.4數(shù)據(jù)轉(zhuǎn)換Out:([嬰兒,嬰兒,青年,壯年,壯年,...,青年,青年,中年,中年,壯年]Length:16Categories(5,object):[嬰兒<青年<中年<壯年<老年],array([0,5,20,30,50,100]))#設(shè)定一組年齡數(shù)據(jù)再返回一組binsages=np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32])#年齡數(shù)據(jù)pd.cut(ag
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年全球及中國低速自動(dòng)緊急剎車系統(tǒng)行業(yè)需求前景及營銷趨勢預(yù)測報(bào)告
- 2024-2030年全球及中國一氯二乙基鋁(DEAC)行業(yè)需求規(guī)模與前景動(dòng)態(tài)分析報(bào)告~
- 2024-2030年中國靜電消除器行業(yè)運(yùn)作模式及投資潛力研究報(bào)告版
- 2024雙方就文化傳媒企業(yè)股權(quán)融資協(xié)議
- 2024年房屋裝修合同管理與協(xié)調(diào)協(xié)議
- 2024年臨時(shí)職位聘請協(xié)議
- 2024年情侶間友好協(xié)議:共處原則與界限
- 2024年攜手共進(jìn):房地產(chǎn)掛靠合作協(xié)議書
- 2024年房產(chǎn)交換協(xié)議書
- 2024年度二手房出售合同標(biāo)的的市場價(jià)值評(píng)估報(bào)告
- 關(guān)于學(xué)習(xí)“國語普通話”發(fā)聲亮劍【三篇】
- 玻璃廠應(yīng)急預(yù)案
- 嬰幼兒游戲照料(嬰幼兒回應(yīng)性照護(hù)課件)
- 貨車進(jìn)入車間安全要求
- MAC地址-廠商對(duì)應(yīng)表
- 2022年中國出版業(yè)總體狀況分析
- BIM大賽題庫含答案
- 造紙術(shù)學(xué)習(xí)課件
- (完整版)譯林版四年級(jí)上冊Unit7單元測試
- 水上作業(yè)危險(xiǎn)源辨識(shí)與技術(shù)控制措施
- 吊索具檢查記錄表
評(píng)論
0/150
提交評(píng)論