2018-02-04更新---支付寶爬蟲(Python-Scrapy版本)

NullSpider發表於2017-11-29

問題反饋

在使用中有任何問題,可以反饋給我,以下聯絡方式跟我交流
  • Author: Leo
  • Wechat: Leo-sunhailin
  • E-mail: 379978424@qq.com
  • Github URL: 專案連結


目前的進度

  • 2018年2月4日:

  • 2018年1月:

    • 將更新提上日程,在測試二維碼登入.先上個半成品

    • 原先密碼登陸的現在基本上不能用了.因為個人頁面多了一種反爬手段,其次就是跳出二維碼頁面.

    • 上面這些問題,將在之後儘量解決.

  • 大概在2017年11月~12月的樣子:

    • 開始出現跳出驗證碼頁面了.原因應該是支付寶反爬的模型增強了.

    • 這段時間維護時間不多,都是個人測試沒有更新程式碼上去

  • 2017年10月 參加DoraHacks時:

    • 當時能夠獲取到賬單和賬戶資訊.

開發環境

  • 系統版本:Win10 x64

  • Python版本:3.4.4

    • Python庫版本列表:

      • Pillow: 5.0.0

      • Scrapy:1.4.0

      • selenium:3.8.1

      • requests:2.18.4

      • pymongo:3.6.0

      • python_dateutil:2.6.1

  • Ps: 一定要配好Python的環境,不然Scrapy的命令可能會跑不起來


安裝和執行方式

* 安裝庫
    # 專案根目錄下,開啟命令列
    pip install -r requirements.txt
複製程式碼
  • 啟動
    # 專案根目錄下,啟動爬蟲
    scrapy crawl AlipaySpider -a username="你的使用者名稱" -a password="你的密碼"
    
    # 必選引數
    -a username=<賬號>
    -a password=<密碼>
    
    # 可選引數
    -a option=<爬取型別>
    # 1 -> 購物; 2 -> 線下; 3 -> 還款; 4 -> 繳費
    # 這裡面有四種型別資料對應四種不同的購物清單
    
    #####################################################
    # 實驗版本
    scrapy crawl AlipayQR
    
    # 暫時還沒有引數, 能登陸到個人頁面了.
複製程式碼

功能

  1. 模擬登入支付寶(賬號密碼和二位都可以登陸)
  2. 獲取自定義賬單記錄和花唄剩餘額度(2017年10月份的時候個人頁面還有花唄總額度的,後面改版沒有了.再之後又出現了,應該是支付寶內部在做調整)
  3. 資料儲存在MongoDB中(暫時儲存在MongoDB,後續支援sqlite,json或其他格式的資料)
  4. 日誌記錄系統,啟動爬蟲後會在專案根目錄下建立一個Alipay.log的檔案(同時寫入檔案和輸出在控制檯)

技術點

吐槽一下: 這點可能沒啥好說,因為程式碼是從自己之前寫的用非框架的程式碼搬過來的,搬過來之後主要就是適應Scrapy這個框架,理解框架的意圖和執行順序以及專案的結構,然後進行相容和測試。

我這個專案主要就用到Spider模組(即爬蟲模組),Pipeline和item(即寫資料的管道和實體類)

Downloader的那塊基本沒做處理,因為核心還是在用selenium + webdriver,解析頁面用的是Scrapy封裝好的Selector.

Scrapy具體的流程看下圖: (從官方文件搬過來的)

image


題外話

題外話模組: 上一段講到了一個Selector,這個是東西是Scrapy基於lxml開發的,但是真正用的時候其實和lxml的selector有點區別.

舉個例子吧:

# 兩段相同的標籤獲取下面的文字的方式
# lxml
name = str(tr.xpath('td[@class="name"]/p/a/text()').strip()

# Scrapy
name = tr.xpath('string(td[@class="name"]/p/a)').extract()[0].strip()
複製程式碼

兩行程式碼對同一個標籤的文字提取的方法有些不一樣,雖然到最後的結果一樣。

lxml中有一個"string(.)"方法也是為了提取文字,但是這個方法是要在先指定了父節點或最小子節點後再使用,就可以獲取父節點以下的所有文字或最小子節點對應的文字資訊.

而Scrapy的Selector則可以在"string(.)"裡面寫入標籤,方便定位,也很清晰的看出是要去獲取文字資訊.

具體區別其實可以對比下我非框架下的和Scrapy框架下的程式碼,裡面用xpath定位的方式有點不一樣.

  1. selenium + lxml: 非框架
  2. Scrapy + selenium: Scrapy

未來的進度

  1. 資料來源儲存的可選擇性(從多源選擇單源寫入到多源寫入)
  2. 修改配置檔案的自由度(增加修改settings.py的引數)
  3. 儘可能優化爬蟲的爬取速度
  4. 研究Scrapy的自定義命令的寫法,提高擴充套件性

相關文章