广西互联网金融平台系列-Scrapy爬虫爬取够力金融Ajax api数据

1、背景

以前有爬取过乐助贷的api,实际上方式是同样的。这篇写够力金融,其实是由于它的翻页比乐助贷的翻页麻烦,因此记录一下。够力金融的平台交易量挺大,数据量也较多,我就不完整爬取了,记录一下爬虫的逻辑。css

2、目的

经过接口请求,获取够力金融的标的详细信息及投资人详细信息html

3、条件

1.标的列表页是html/css渲染json

2.标的详情页的标的数据是html/css渲染api

3.投资人列表是Apidom

4、示例

代码逻辑记录一下:scrapy

1.parse方法中将当前列表页的每条标的连接拿到,并传给detail进行深刻爬取,已知页码能够在url中循环 就不用翻页,直接循环取页码便可。ide

2.因为够力金融的投资记录页码是经过api的total字段显示投资笔数的,因此parse_nexts中对投资人投资记录翻页根据投资记录条数计算页码数量,循环页码数 并构造url调用parse_detail进行记录的爬取。ui

3.parse_detail执行具体的取值操做url

import scrapy
import json
from scrapy.http import Request
from ..items import GljrItemLoader,GljrItem,GljrListItemLoader,GljrListItem
import re


class GljrSpider(scrapy.Spider):
    name = 'gljr'
    allowed_domains = ['www.gljr.com']
    start_urls = ['http://www.gljr.com/invest/index.html?page=1']


    def parse(self, response):
        """
        将当前列表页的每条标的连接拿到
            并传给detail进行深刻爬取
            已知页码能够在url中循环  就不用翻页了
        """
        total = response.css('.invest_bbox .item-list')

        for x in total:
            loaders = GljrItemLoader(item=GljrItem(), response=response)
            loaders.add_value("title", x.css('a.item-tit::text').extract())
            loaders.add_value("amount", x.css('dl.clearfix dd.item-money span::text').extract())
            loaders.add_value("profit", x.css('dl.clearfix .item-yqsy font.item-rates::text').extract())
            loaders.add_value("terms", x.css('dl.clearfix dd:nth-child(5) span::text').extract())
            loaders.add_value("target_urls",  x.css('a.item-tit::attr(href)').extract())
            loaders.add_value("target_urls_id", x.css('a.item-tit::attr(href)').extract())
            loaders.add_value("protype", x.css('a.item-tit::text').extract())
            loaders_item = loaders.load_item()
            yield loaders_item

            """ 获取url的id,构造api的url传递给parse_detail进行投资记录的抓取 """
            t_url = x.css('a.item-tit::attr(href)').extract_first("")  # 获取当前url
            matchObj = re.search('\d+',t_url)  # 匹配出数字
            if matchObj:
                bid = matchObj.group(0)
            # 构造api地址  调用parse_nexts获取投资记录条数
                yield Request(url='http://www.gljr.com/invest/detailTenderForJson.html?uid=0&borrowid=%s&page=1' %(bid) ,meta={"bid":bid},callback=self.parse_nexts)

        #循环页码
        for i in range(2, 560):
            next_pages = "http://www.gljr.com/invest/index.html?page=%s" % (i)
            yield Request(url=next_pages, callback=self.parse)

    def parse_nexts(self, response):
        """
        投资人投资记录翻页
            根据投资记录条数计算页码数量
            循环页码数 并构造url调用parse_detail进行记录的爬取
        """
        sites = json.loads(response.body_as_unicode())
        total = sites['data']['page']['total']
        bid = response.meta.get("bid", "")
        if total > 10:
            pages = int(total/10) + 1
            for i in range(1, pages + 1):
                yield Request(
                    url='http://www.gljr.com/invest/detailTenderForJson.html?uid=0&borrowid=%s&page=%s' % (bid, i),
                    meta={"bid": bid}, callback=self.parse_detail)
        else:
            yield Request(url='http://www.gljr.com/invest/detailTenderForJson.html?uid=0&borrowid=%s&page=1' %(bid),meta={"bid":bid},callback=self.parse_detail)

    def parse_detail(self, response):
        """ 根据传递进来的投资记录页码api进行投资记录的抓取 """
        sites = json.loads(response.body_as_unicode())
        target_urls = "https://www.gljr.com/invest/detail.html?borrowid=%s" % (response.meta.get("bid"))
        invest = sites['data']['list']
        for i in range(0,len(invest)):

            """ 
            在循环中获取投资人的信息,包括标的id/用户名/金额/投资终端等 
            """
            iloaders = GljrListItemLoader(item=GljrListItem(), response=response)
            iloaders.add_value("invest_username", invest[i]['user']['username'])
            iloaders.add_value("invest_amount", invest[i]['account'])
            iloaders.add_value("target_urls", target_urls)
            iloaders.add_value("target_id", target_urls)
            iloaders.add_value("invest_id", invest[i]['user']['userId'])
            iloaders.add_value("invest_stats", invest[i]['fromType'])

            iloaders_item = iloaders.load_item()
            yield iloaders_item

5、数据利用与价值

总的来讲,不管是像泛湾天域经过html/css渲染数据,仍是像福金贷经过JS渲染数据,或者像够力金融、乐助贷这样经过Ajax api渲染数据,都是能够经过爬虫把数据爬取下来的。spa

尤为是Ajax api这种类型的数据,虽然在取值的时候弯弯绕绕,可是取下来的值是比较完整的,好比够力金融,在api字段里就有userid(投资人)和broworid(借款人),那么将全部数据爬取下来后,经过userid和投资记录,就能够分析出平台的投资人组成质量,好比投资频率、投资偏好、风险偏好、投资能力。结合平台所作的营销活动、推广平台和一些运营行为,取估算这个平台的运营轨迹,包括增加期、爆发期和平稳期都在什么时间段,若是数据详细,甚至能够推算出哪一个推广平台的投入产出比RIO比较好。

再者,经过平台借款人ID能够推测平台标的真实性、连贯性和是否存在借新还旧这种状况。数据越多、越详细,获得的结果就越准确,反之则然。

相关文章
相关标签/搜索