人人貸網的數據爬取(利用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!\n')

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訪問過多的問題),如果需要大量數據的可以考慮分批爬取,多台電腦同時進行。

  歡迎打賞點贊,如有需要轉載,請附屬作者源地址。當然運行代碼遇到問題可以@我。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM