此次爬的网站 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