人人贷网的数据爬取(利用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

人人贷网的数据爬取(利用python包selenium)

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

就是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)

相应数据图展示:
人人贷网的数据爬取(利用python包selenium)

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

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

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

上一篇:db2 SQL6036N解决办法


下一篇:Python爬虫 股票数据爬取