一次爬蟲事件


0.序

    我同學論文需要數據建模,想用爬蟲軟件爬取數據,就問有沒有人會用爬蟲軟件,我回了句:我不會用爬蟲軟件,但我會寫爬蟲。然后爬蟲事件就拉開了序幕。

1.

    我同學要的數據是P2P借款人信息,她就選了翼龍貸上的數據,我先去瀏覽了翼龍貸網站,然后知道了數據的位置。先要進入產品列表頁面,這里有各期產品列表,再進入一期產品頁面,這里就有個債權列表,這就是要的借款人列表,點擊借款人就會進入借款人的詳細信息了,這要跳轉3個頁面才是我們要的最終數據。

    這是我首先想到的是,先抓取產品列表頁面的產品鏈接,再通過產品鏈接抓取債權列表頁面上的借款人鏈接,最后進入借款人信息頁面抓取所需數據。想到就做,打開瀏覽器,進入網站,按下F12,結果我懵逼了。。。

    鏈接在何方???我仔細想了想,不對,這個網站的數據根本不在頁面上,我打開頁面源代碼,果然沒有。一般數據抓取有2種方式,一種是直接抓取html源碼,然后解析html獲取數據,另一種就是通過向數據源接口(如ajax接口)發送請求來獲取數據源,再解析數據源。我再重新看了看這個網站,發現它先加載html頁面框架,再通過javascript來加載數據的,這意味着我們可以直接通過某個api接口來獲取數據。F12再刷新頁面,然后發現了

    這個網站的數據源居然都是通過同一個api來獲取json數據的,這樣不就太方便我們了嗎?再仔細研究了下POST參數,發現了要獲取數據要分三步走,第一步,獲取產品列表的id值;第二步,用第一步獲取的id值做為第二步POST表格參數的pid值,發送POST,獲取借款人id;

第三步,用第二步得到的id來作為POST表格參數的id值,發送POST,獲取最終數據。

提醒下,不同產品列表的requesturl不同,同一產品列表則相同。

    知道獲取數據的思路,那剩下的就是爬蟲邏輯的構造了,首先就是橫推過去(單線程)

# -*- coding:utf-8 -*-
import requests
Headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64;x64;rv:58.0) Gecko/20100101 Firefox/58.0",
	"Host":"licai.eloancn.com",
	"Accept": "application/json, text/javascript, */*; q=0.01",
	"Accept-Encoding": "gzip, deflate, br",
	"Content-Type": "application/x-www-form-urlencoded;charset=utf8"
	}
params = {
	"pageNo":1,
	"platform":5,
	"requesturl":"IjE9HTj42YUib_sYkABPPFnldpmC7Qbc",
	"v":0.4797244526462968
	}
params2 = {'pageNo': 1,
           'pid': '',
           'requesturl': 'IjE9HTj42YWoZVeH5M3LwlnldpmC7Qbc'
           }
params3 = {'id': '',
           'mark': 2,
           'platform': 5,
           'requesturl': 'AqeXfFgEApnttSuMj1r7BaBklHUjMROZ',
           'v': 0.29441846044222364
            }
url = "https://licai.eloancn.com/pcgway/gateway/v1/01"
PID = []
ID = []
rep = requests.post(url,data=params,headers=Headers).json()
for i in rep["data"]["data"]:
    PID.append((i["id"],i["strPhases"],i["strInterestrate"],i["title"]))
for i in PID:
    params2["pid"]=i[0]
    rep2 = requests.post(url,data=params2,headers=Headers).json()
    for j in rep2["data"]["data"]:
        ID.append((j["id"],i[1],i[2],i[3]))
for i in ID:
    params3["id"] = i[0]
    rep3 = request.post(url,data=params3,headers=Headers).json()
#數據就在rep3["data"]里,自己提取需要的數據

    我是直接用了xlwt模塊將提取到的數據做成了xls文件,然后就給了我同學。

2.

    再看了看代碼,太不優雅了,丑。。。而且速度還慢(雖然最主要還是丑0.0),就琢磨了下,要不用多線程?多線程!這個爬蟲主要是網絡IO花時間,那就搞個線程與主進程分離開來,然后就是再搞個線程來處理返回的reponse,嗯,再最后搞個線程來寫數據到xls吧,附草圖來紀念一下(額,字丑別笑)

然后就是用多線程出了種種問題,但是我還是搞定了,最完善的版本就是第四版了(別問我第二第三哪去了。。。。)在第四版里有詳細注釋,哎已經凌晨2點半了,馬上畢業了,工作還沒簽,愁!算了,還是洗洗睡吧。

源碼:https://github.com/MrLiupython/Spider/tree/master/yld

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM