Python爬虫 - 人人贷散标

前言

这次爬的网站 人人贷 - 散标 是一个客户要求爬的,数据一共是148w多条,不过后来发现有绝大部分是无效数据,也就是那个页面不存在,不过我看网上很多人爬这个网站都是用什么 BeautifulSoupSelenium,首先 BeautifulSoup 提供 Cookie 应该是能爬,不过以前的页面和现在的页面有些不同,应该有点麻烦,我没试过;而 Selenium 可以直接放弃了,就一个原因,慢,你如果是爬几十个、几百个页面你也许能忍;我这次用的方法有些不同,不需要 Cookie,而且用 Scrapy 速度也挺快;(以下测试用到的网页都是 https://www.renrendai.com/loan-2996659.html)

正文

一、分析站点

在抓取每个网站前肯定是需要分析它的结构的,我随便点了一个最新的散标网页,如下图可见没登陆仅能显示一小部分信息

再看看其源码,毛都没有,只有登陆后才有内容,?

那可不一定哦,切换到 Network 然后刷新网页,从中获取返回的response,翻到最下面的 js 代码部分,大概400行处

可以看到有些js变量内容是unicode,然后还有用到了json解析方法,将这部分代码复制然后切换到 console 粘贴

随便用一个变量让其弹出代码提示,可以看到有很多json key

borrower 应该是借款人的意思,可以看到其内容就是借款人的信息

那么只需要用正则获取到这些json然后解析就能获取其所有信息,不过目前还不知道哪些 key 代表哪部分信息,不过想了一想,既然所有信息都返回了那肯定有对应的js来解析,接着我从之前刷新的内容中发现一个js文件就是需要的

将其下载下来便于之后写代码分析

二、代码

1、首先获取js变量info、detail,这两个保存了所有信息,而上面保存的js文件就是对其解析用的

1
2
3
html = resp.text
pattern = "var.?info.?=.?'(.*?)';?\n+?var.?detail.?=.?'(.*?)';?\nvar isTransfer"
info, detail = re.findall(pattern, html)[0]

2、接着用json.loads对其转换,不过在此之前先得把其中得unicode给转换一下,因为从requests获取到的都是直接转义过了的,所以我直接写了一个方法,其中的内容仅针对人人贷散标网页

1
2
3
4
5
def de_unicode(text):
"""
unicode转换,因为从response获取到的内容无法直接decode
"""
return text.replace('\\u0022', '"').replace('\\u005C', '').replace('\\u002D', '-')

不过还不能用json.loads,因为其中 [] 中括号是加了双引号的原因会让其报错,所以我又写了一个方法

1
2
3
4
5
def de_json_str(text):
"""
替换[]括号,直接json.loads会因为 "[,]" 的原因报错
"""
return text.replace('"[', '[').replace(']"', ']')

接着就能直接转换了

1
2
3
4
# 获取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