此次爬的網站 xx貸 - 散標 是一個客戶要求爬的,數據一共是148w多條,不事後來發現有絕大部分是無效數據,也就是那個頁面不存在,不過我看網上不少人爬這個網站都是用什麼 BeautifulSoup、Selenium,首先 BeautifulSoup 提供 Cookie 應該是能爬,不過之前的頁面和如今的頁面有些不一樣,應該有點麻煩,我沒試過;而 Selenium 能夠直接放棄了,就一個緣由,慢,你若是是爬幾十個、幾百個頁面你也許能忍;我此次用的方法有些不一樣,不須要 Cookie,並且用 Scrapy 速度也挺快;(如下測試用到的網頁都是 www.renrendai.com/loan-299665…html
在抓取每一個網站前確定是須要分析它的結構的,我隨便點了一個最新的散標網頁,以下圖可見沒登錄僅能顯示一小部分信息python
再看看其源碼,毛都沒有,只有登錄後纔有內容,?git
那可不必定哦,切換到 Network 而後刷新網頁,從中獲取返回的response,翻到最下面的 js 代碼部分,大概400行處github
能夠看到有些js變量內容是unicode,而後還有用到了json解析方法,將這部分代碼複製而後切換到 console 粘貼json
隨便用一個變量讓其彈出代碼提示,能夠看到有不少json key測試
borrower 應該是借款人的意思,能夠看到其內容就是借款人的信息網站
那麼只須要用正則獲取到這些json而後解析就能獲取其全部信息,不過目前還不知道哪些 key 表明哪部分信息,不過想了一想,既然全部信息都返回了那確定有對應的js來解析,接着我從以前刷新的內容中發現一個js文件就是須要的spa
將其下載下來便於以後寫代碼分析3d
一、首先獲取js變量info、detail,這兩個保存了全部信息,而上面保存的js文件就是對其解析用的code
html = resp.text
pattern = "var.?info.?=.?'(.*?)';?\n+?var.?detail.?=.?'(.*?)';?\nvar isTransfer"
info, detail = re.findall(pattern, html)[0]
複製代碼
二、接着用json.loads對其轉換,不過在此以前先得把其中得unicode給轉換一下,由於從requests獲取到的都是直接轉義過了的,因此我直接寫了一個方法,其中的內容僅針對人人貸散標網頁
def de_unicode(text):
""" unicode轉換,由於從response獲取到的內容沒法直接decode """
return text.replace('\\u0022', '"').replace('\\u005C', '').replace('\\u002D', '-')
複製代碼
不過還不能用json.loads,由於其中 [] 中括號是加了雙引號的緣由會讓其報錯,因此我又寫了一個方法
def de_json_str(text):
""" 替換[]括號,直接json.loads會由於 "[,]" 的緣由報錯 """
return text.replace('"[', '[').replace(']"', ']')
複製代碼
接着就能直接轉換了
# 獲取info
info = json.loads(de_json_str(de_unicode(info)))
# 獲取detail
detail = json.loads(de_json_str(de_unicode(info)))
複製代碼
獲取到json對象的info、detail後就開始解析,在此以前先分析一下直接下載的js解析文件
createLeftDom 方法解析的是咱們沒登錄看到的部分借款信息
createTransferHtml 方法是借款人的信息解析
getMarriage 方法是婚姻信息解析,由於你在info裏獲取到的婚姻狀態是英語表示的
還有想獲取什麼信息直接看那個js代碼便可,我就再也不分析了,不過我客戶有個需求是獲取散標狀態,也就是散標是否還款完、違約等狀態,不過那個信息是張圖,因此咱們須要接着分析js,這裏是個switch(我不會js,ase應該是相似case)
其中 OVERDUE 是表示逾期,BADDEBT 是壞帳 應該是欠帳的意思把,而其對應的圖片關係到status這個變量,status這個變量就是所判斷的值,status是從loan中獲取的
loan是在info中獲取的,嘗試獲取,其內容是 IN_PROGRESS
不過若是直接將 IN_PROGRESS 替換到那個圖片連接中是沒有這個圖片的,status通過 utils.loanAllType 方法處理過,這個方法來源於 common_wdg_6fdbabe.js 文件
從這能夠看到若是 status == IN_PROGRESS,那麼sta就等於 REPAYING,這個就是返回的內容,接着按照你的需求寫代碼便可
項目:renrendai