如何爬取全網1200本Python書|爬蟲實戰篇
這是菜鳥學Python的第98篇原創文章
閱讀本文大概需要3分鐘
前面寫了一篇文章關於爬取市面上所有的Python書思路,這也算是我們數據分析系列講座裡面的一個小的實戰項目。上次代碼沒有寫完,正好周末有時間把代碼全部完成並且存入了資料庫中,今天就給大家一步步分析一下是我是如何爬取數據,清洗數據和繞過反爬蟲的一些策略和點滴記錄。
1目標網站分析-主頁面爬取
1).市面上所有的Python書,都在京東,淘寶和豆瓣上,於是我選擇了豆瓣來爬取
2).分析網站的結構,其實還是比較簡單的,首先有一個主的頁面,裡面有所有python的鏈接,一共1388本(其中有100多本其實是重複的),網頁底部分頁顯示一共93頁
3).這個頁面是靜態頁面,url頁比較有規律,所以很容易構造出所有的url的地址
4).爬蟲每個分頁裡面的所有的Python書和對應的url,比如第一頁裡面有"笨辦法這本書",我們只需要提取書名和對應的url
2.單個頁面分析爬取
1).上面我們已經提取了93個頁面的所有的Python書和對應的url,一共是93*15大概1300多本書,首先先去重,然後我們可以把它存到內存裡面用一個字典保存,或者存到一個csv文件中去(有同學可能奇怪為啥要存到文件裡面呢,用字典存取不是方便嗎,先不說最後揭曉)
2).我們接著分析每本書頁面的特徵:
上一片文章說過我們需要分析:
作者/出版社/譯者/出版年/頁數/定價/ISBN/評分/評價人數
看一下網站的源碼,發現主要的信息在div id="info" 和div class="rating_self clearfix"
3).這一部分的數據清洗是比較麻煩的,因為不是每一本書都是有點評和評分系統的,而且不是每一本書都有作者,頁面,價格的,所以提取的時候一定要做好異常處理,比如有的頁面長的這樣:
原始數據採集的過程中有很多不一致的數據:
- 書的日期表示格式,各種各樣都有:
有的書的日期是:September 2007,October 22, 2007,2017-9,2017-8-25
- 有的書的價格是貨幣單位不統一,有美金,日元,歐元和人民幣
比如:CNY 49.00,135,19 €,JPY 4320, $ 176.00
3.多線程爬取
1).有的同學後台問我,你是用scrapy框架還是自己動手寫的,我這個項目是自己動手寫的,其實scrapy是一個非常棒的框架,如果爬取幾十萬的數據,我一定會用這個超級武器.
2).我用的是多線程爬取,把所有的url都扔到一個隊列裡面,然後設置幾個線程去隊列裡面不斷的爬取,然後循環往複,直到隊列里的url全部處理完畢
3).數據存儲的時候,有兩種思路:
- 一種是直接把爬取完的數據存到SQL資料庫裡面,然後每次新的url來了之後,直接查詢資料庫裡面有沒有,有的話,就跳過,沒有就爬取處理
- 另一種是存入CSV文件,因為是多線程存取,所以一定要加保護,不然幾個線程同時寫一個文件的會有問題的,寫成CSV文件也能轉換成資料庫,而且保存成CSV文件還有一個好處,可以轉成pandas非常方便的處理分析.
4.反爬蟲策略
1).一般大型的網站都有反爬蟲策略,雖然我們這次爬的數量只有1000本書,但是一樣會碰到反爬蟲問題
2).關於反爬蟲策略,繞過反爬蟲有很多種方法。有的時候加時延(特別是多線程處理的時候),有的時候用cookie,有的會代理,特別是大規模的爬取肯定是要用代理池的,我這裡用的是cookie加時延,比較土的方法.
3).斷點續傳,雖然我的數據量不是很大,千條規模,但是建議要加斷點續傳功能,因為你不知道在爬的時候會出現什麼問題,雖然你可以遞歸爬取,但是如果你爬了800多條,程序掛了,你的東西還沒用存下來,下次爬取又要重頭開始爬,會吐血的(聰明的同學肯定猜到,我上面第二步留的伏筆,就是這樣原因)
5.代碼概述篇
1).整個的代碼架構我還沒有完全優化,目前是6個py文件,後面我會進一步優化和封裝的
- spider_main:主要是爬取93個分頁的所有書的鏈接和書面,並且多線程處理
- book_html_parser:主要是爬取每一本書的信息
- url_manager:主要是管理所有的url鏈接
- db_manager:主要是資料庫的存取和查詢
- util:是一個存放一些全局的變數
- verify:是我內部測試代碼的一個小程序
2).主要的爬取結果的存放
all_books_link.csv:主要存放1200多本書的url和書名
python_books.csv:主要存放具體每一本書的信息
3).用到的庫
爬虫部分:用了requests,beautifulSoup
數據清洗:用了大量的正則表達式,collection模塊,對書的出版日期用了datetime和calendar模塊
多線程:用了threading模塊和queue
歡迎大家關注 菜鳥學Python",更多好玩有趣的Python原創教程,趣味演算法,經驗技巧,行業動態,盡在菜鳥學Python,一起來學python吧
歷史人氣文章
Python語言如何入門
Python寫個迷你聊天機器人|生成器的高級用法
同學,學Python真的不能這樣學
全網爬取6500多隻基金|看看哪家基金最強
用Python破解微軟面試題|24點遊戲
一道Google的演算法題 |Python巧妙破解
推薦閱讀:
TAG:Python |