標籤:

如何爬取全網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 |