记得之前应同学之情,帮忙爬取人人贷网的借贷人信息,综合网上各种相关资料,改善一下别人代码,并能实现数据代码爬取,具体请看我之前的博客: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! ') 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访问过多的问题),如果需要大量数据的可以考虑分批爬取,多台电脑同时进行。
欢迎打赏点赞,如有需要转载,请附属作者源地址。当然运行代码遇到问题可以@我。