記得之前應同學之情,幫忙爬取人人貸網的借貸人信息,綜合網上各種相關資料,改善一下別人代碼,並能實現數據代碼爬取,具體請看我之前的博客: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×tamp=" % 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訪問過多的問題),如果需要大量數據的可以考慮分批爬取,多台電腦同時進行。
歡迎打賞點贊,如有需要轉載,請附屬作者源地址。當然運行代碼遇到問題可以@我。