zoukankan      html  css  js  c++  java
  • 人人贷网的数据爬取(利用python包selenium)

    记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合网上各种相关资料,改善一下别人代码,并能实现数据代码爬取,具体请看我之前的博客:http://www.cnblogs.com/Yiutto/p/5890906.html
    但过了一段时间,发现之前的代码运行不能爬取到数据,而且数据爬取过多也会出现一些错误(我估摸这后台检测到同一个帐号过多访问,给强制下线了)老是弹出下面的错误如下图: 总而言之,代码可用性不高,性能不是很好。

    def parse_userinfo(loanid):
        timestamp=str(int(time.time())) + '%03d' % random.randint(0,999)
        urll="http://www.we.com/lend/detailPage.action?loanId=%.0f&timestamp=" % loanid+timestamp
        result = s.get(urll,headers=headers)
        html = BeautifulSoup(result.text,'lxml')
        info = html.find_all('table',class_="ui-table-basic-list")
        info1= info[0]
        info2 = info1.find_all('div',class_="basic-filed")
        userinfo = {}
        for item in info2:
            vartag = item.find('span')
            var = vartag.string
            if var == '信用评级':
                var = '信用评分'
                pf1 = repr(item.find('em'))
                value = re.findall(r'd+',pf1)
            else:
                valuetag = item.find('em')
                value = valuetag.string
            userinfo[var]=value
        data = pd.DataFrame(userinfo)
        return data

    后根据错误进行分析,发现原来是根本获取不到借贷人信息出现的错误,

    就是info = html.find_all('table',class_="ui-table-basic-list")执行这条语句,info是空的,意思就是根本找class_="ui-table-basic-list"这个东东,后来思前想后,发现,原来人人贷网站需要用户登录才能看到其相应的借贷人信息。也就是说在爬取数据时,需要用户登录。回顾之前的代码,我想是保存cookie这种方法是不能用了。必须找到一种新的方法来模拟登录网站。查了许多资料,数据捉取无外乎有3种方法:1.直接抓取数据。 2.模拟浏览器抓取数据。 3.基于API接口抓取数据

    综合分析,我决定用第2种方法"模拟浏览器登录",那得找好相应的python包,网上有:mechanize,selenium等等。

    1.mechanize包的尝试

    br.select_form(nr = 0) # Find the login form
    
    br['vb_login_username'] = '你的用户名'
    
    br['vb_login_password'] = '你的注册密码'

    这段代码中老是遇到问题,第一,select_form中的nr怎么找,第二,在人人贷网站源代码中如何找所谓的'vb_login_username','vb_login_password'的专有名词。
    其实我在代码测试中还是找到对于的nr=0,但是找了好久找不到对应的'vb_login_username'。(个人不太懂html,学的比较菜,有兴趣的可以尝试一下)。后来听朋友说可以试试selenium。

     

    前面废话说了一大堆,都是我学的比较菜,也就是我的经验之谈。

    2.selenium包的尝试(重点)

    首先你得安装好它,直接pip install selenium即可。而且还要下载相应的浏览器驱动(这里我的运行环境是linux,python好像是3.0以上的,浏览器是firefox)

    驱动的下载地址为https://github.com/mozilla/geckodriver/releases(下载好自己系统的版本),然后放到相应的PATH路径中,否则找不到driver。

    Window下驱动的放置位置:

      将geckodriver.exe复制到C:Program Files (x86)mozilla firefox目录下;
      并在环境变量Path中添加路径:C:Program Files (x86)mozilla firefox;
      重启cmd,再次运行即可;
         

     

    Linux下驱动的放置位置:

       解压后将geckodriver存放至 /usr/local/bin/ 路径下即可
       sudo mv
    /Downloads/geckodriver /usr/local/bin/

    相应代码如下:

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import time
    import pandas as pd
    import re
    import numpy as np
    from bs4 import BeautifulSoup
    
    driver = webdriver.Firefox()
    
    def LoginRRD(username, password):
        try:
            print(u'准备登陆人人贷网站...')
            driver.get("https://www.we.com/loginPage.action")
            elem_user = driver.find_element_by_name("j_username")
            elem_user.send_keys(username)
            elem_pwd = driver.find_element_by_name("j_password")
            elem_pwd.send_keys(password)
            elem_rem = driver.find_element_by_name("rememberme")
            elem_rem.submit()
            time.sleep(1) #这里设置睡眠时间,是为了使浏览器有时间保存cookies
            print(u'登录 successful!')
    
        except Exception as e:
            print("Error:", e)
        finally:
            print(u'End Login!
    ')
    
    def parse_userinfo(loanid):#自定义解析借贷人信息的函数
        urll="http://www.we.com/loan/%s"  % loanid
        #这个urll我也不知道怎么来的,貌似可以用urll="http://www.we.com/loan/%f" % loanid+timestamp (就是页面本身
    
        driver.get(urll)
        html = BeautifulSoup(driver.page_source,'lxml')
        info = html.find_all('table',class_="ui-table-basic-list")
        info1= info[0]
        info2 = info1.find_all('div',class_="basic-filed")
        userinfo = {}
        for item in info2:
            vartag = item.find('span')
            var = vartag.string
            if var == '信用评级':
                var = '信用评分'
                pf1 = repr(item.find('em'))
                value = re.findall(r'd+',pf1)
            else:
                valuetag = item.find('em')
                value = valuetag.string
            userinfo[var]=value
        data = pd.DataFrame(userinfo)
        return data
    
    rrd=pd.read_csv('loanId2.csv') #loanId是之前散标数据中的loanId,将其单独整理为一个csv文档
    loanId=rrd.ix[:,'loanId']
    user_info = ['昵称', '信用评分',
    
                '年龄', '学历', '婚姻',
    
                '申请借款', '信用额度', '逾期金额', '成功借款', '借款总额', '逾期次数','还清笔数', '待还本息', '严重逾期',
    
                '收入', '房产', '房贷', '车产', '车贷',
    
    '公司行业', '公司规模', '岗位职位', '工作城市', '工作时间']
    
    table = pd.DataFrame(np.array(user_info).reshape(1, 24), columns=user_info)
    
    #帐号密码的话,你自己用手机在人人贷网上申请 username
    = "" password = u""

    LoginRRD(username, password) i = 1 for loanid in loanId: table = pd.concat([table, parse_userinfo(loanid)]) print(i) i += 1 #看一下循环多少次 table.to_csv('userinfo2.csv',header=False)

     相应数据图展示:

    PS:
      其中'loanId2.csv'是之前博客(http://www.cnblogs.com/Yiutto/p/5890906.html)爬取整理的loanId,只有通过loanId才能爬取借贷人信息。

      后来运行上述代码大概爬了3000多条就中断了(应该是同一ip访问过多的问题),如果需要大量数据的可以考虑分批爬取,多台电脑同时进行。

      欢迎打赏点赞,如有需要转载,请附属作者源地址。当然运行代码遇到问题可以@我。

  • 相关阅读:
    前端之JQuery:JQuery文档操作
    前端之JQuery:JQuery属性操作
    前端之JQuery:JQuery基本语法
    前端之JavaScript:JS之DOM对象三
    前端之JavaScript:JS之DOM对象二
    初始django
    mysql 索引
    多表查询
    单表查询
    外键的三种形式
  • 原文地址:https://www.cnblogs.com/Yiutto/p/6238946.html
Copyright © 2011-2022 走看看