之前寫了一篇文章,對市面上所有的Python書想法都寫了,這也算是我們數(shù)據(jù)分析系列講座中的一個小實戰(zhàn)項目。(莎士比亞,坦普林。)
上次代碼沒有寫完,正好周末有時間把代碼全部完成并且存入了數(shù)據(jù)庫中,今天就給大家一步步分析一下是我是如何爬取數(shù)據(jù),清洗數(shù)據(jù)和繞過反爬蟲的一些策略和點滴記錄。1目標網(wǎng)站分析-主頁面爬取
1).市面上所有的Python書,都在京東,淘寶和豆瓣上,于是我選擇了豆瓣來爬取
2).分析網(wǎng)站的結(jié)構(gòu),其實還是比較簡單的,首先有一個主的頁面,里面有所有python的鏈接,一共1388本(其中有100多本其實是重復的),網(wǎng)頁底部分頁顯示一共93頁
3).這個頁面是靜態(tài)頁面,url頁比較有規(guī)律,所以很容易構(gòu)造出所有的url的地址
4).爬蟲每個分頁里面的所有的Python書和對應的url,比如第一頁里面有"笨辦法這本書",我們只需要提取書名和對應的url
2單個頁面分析爬取
1).上面我們已經(jīng)提取了93個頁面的所有的Python書和對應的url,一共是93*15大概1300多本書,首先先去重,然后我們可以把它存到內(nèi)存里面用一個字典保存,或者存到一個CSV文件中去(有同學可能奇怪為啥要存到文件里面呢,用字典存取不是方便嗎,先不說最后揭曉)
2).我們接著分析每本書頁面的特征:
上一片文章說過我們需要分析:
作者/出版社/譯者/出版年/頁數(shù)/定價/ISBN/評分/評價人數(shù)
看一下網(wǎng)站的源碼,發(fā)現(xiàn)主要的信息在div id="info" 和div class="rating_self clearfix"
3).這一部分的數(shù)據(jù)清洗是比較麻煩的,因為不是每一本書都是有點評和評分系統(tǒng)的,而且不是每一本書都有作者,頁面,價格的,所以提取的時候一定要做好異常處理,比如有的頁面長的這樣:
原始數(shù)據(jù)采集的過程中有很多不一致的數(shù)據(jù):
書的日期表示格式,各種各樣都有:
有的書的日期是:'September 2007','October 22, 2007','2017-9','2017-8-25'
有的書的價格是貨幣單位不統(tǒng)一,有美金,日元,歐元和人民幣
比如:CNY 49.00,135,19 €,JPY 4320, $ 176.00
3多線程爬取
1).有的同學后臺問我,你是用scrapy框架還是自己動手寫的,我這個項目是自己動手寫的,其實scrapy是一個非常棒的框架,如果爬取幾十萬的數(shù)據(jù),我一定會用這個超級武器.
2).我用的是多線程爬取,把所有的url都扔到一個隊列里面,然后設置幾個線程去隊列里面不斷的爬取,然后循環(huán)往復,直到隊列里的url全部處理完畢
3).數(shù)據(jù)存儲的時候,有兩種思路:
一種是直接把爬取完的數(shù)據(jù)存到SQL數(shù)據(jù)庫里面,然后每次新的url來了之后,直接查詢數(shù)據(jù)庫里面有沒有,有的話,就跳過,沒有就爬取處理
另一種是存入CSV文件,因為是多線程存取,所以一定要加保護,不然幾個線程同時寫一個文件的會有問題的,寫成CSV文件也能轉(zhuǎn)換成數(shù)據(jù)庫,而且保存成CSV文件還有一個好處,可以轉(zhuǎn)成pandas非常方便的處理分析.
4反爬蟲策略
1).一般大型的網(wǎng)站都有反爬蟲策略,雖然我們這次爬的數(shù)量只有1000本書,但是一樣會碰到反爬蟲問題
2).關(guān)于反爬蟲策略,繞過反爬蟲有很多種方法。有的時候加時延(特別是多線程處理的時候),有的時候用cookie,有的會代理,特別是大規(guī)模的爬取肯定是要用代理池的,我這里用的是cookie加時延,比較土的方法.
3).斷點續(xù)傳,雖然我的數(shù)據(jù)量不是很大,千條規(guī)模,但是建議要加斷點續(xù)傳功能,因為你不知道在爬的時候會出現(xiàn)什么問題,雖然你可以遞歸爬取,但是如果你爬了800多條,程序掛了,你的東西還沒用存下來,下次爬取又要重頭開始爬,會吐血的(聰明的同學肯定猜到,我上面第二步留的伏筆,就是這樣原因)
5代碼概述篇
1).整個的代碼架構(gòu)我還沒有完全優(yōu)化,目前是6個py文件,后面我會進一步優(yōu)化和封裝的
spider_main:主要是爬取93個分頁的所有書的鏈接和書面,并且多線程處理
book_html_parser:主要是爬取每一本書的信息
url_manager:主要是管理所有的url鏈接
db_manager:主要是數(shù)據(jù)庫的存取和查詢
util:是一個存放一些全局的變量
verify:是我內(nèi)部測試代碼的一個小程序
2).主要的爬取結(jié)果的存放
all_book:主要存放1200多本書的url和書名
:主要存放具體每一本書的信息
3).用到的庫
爬蟲部分:用了requests,beautifulSoup
數(shù)據(jù)清洗:用了大量的正則表達式,collection模塊,對書的出版日期用了datetime和calendar模塊
多線程:用了threading模塊和queue
結(jié)論:
好,今天的全網(wǎng)分析Python書,爬蟲篇,就講到這里,基本上我們整個這個項目的技術(shù)點都講了一遍,爬蟲還是很有意思的,但是要成為一個爬蟲高手還有很多地方要學習,想把爬蟲寫的爬取速度快,又穩(wěn)健,還能繞過反爬蟲系統(tǒng),并不是一件容易的事情. 有興趣的小伙伴,也可以自己動手寫一下哦。源碼等后面的數(shù)據(jù)分析篇講完后,我會放github上,若有什么問題,也歡迎留言討論一下.
End.
來源:公眾號“菜鳥學python”
運行人員:中國統(tǒng)計網(wǎng)小編(微信號:itongjilove)
微博ID:中國統(tǒng)計網(wǎng)
中國統(tǒng)計網(wǎng),是國內(nèi)最早的大數(shù)據(jù)學習網(wǎng)站,公眾號:中國統(tǒng)計網(wǎng)
1.《【爬蟲社區(qū)】爬蟲實戰(zhàn)篇:如何爬取全網(wǎng)1200本Python書》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《【爬蟲社區(qū)】爬蟲實戰(zhàn)篇:如何爬取全網(wǎng)1200本Python書》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/yule/3179816.html