前言
本科的毕业设计有做facebook的数据采集工作。在做的过程中,发现网上现成的资料较少,所以将我的解决办法分享出来,希望大家一起讨论并提出宝贵意见。
Facebook数据采集可以通过调用API,但是API获取数据较为混乱,没法有效的将数据组织在一起,所以就放弃了这种办法,改为采用网络爬虫的方式,但是网络爬虫个也存在各种问题。
在临近毕业的两周,我尽量每两天更新一篇文章,讨论其中一个问题的解决办法。
今天讨论的是模拟登录问题。
总的来说,使用python模拟登陆有两大类方法,一种是发送请求数据包,模拟数据交互的过程;另一种办法是使用selenium包,模拟用户的手工操作。
数据交互的方法
数据交互的方法的代码量比较多,但是运行起来速度要比使用selenium包快的多,也更容易控制。但是网上有人说,FaceBook会时常变动登陆过程中需要post的值,所以没有办法长期使用固定的代码。据我观察,近一个月的时间内,FaceBook的登陆过程没有发生变化。。。所以,自己看着办吧。反而是使用selenium包的方法有着很大的不确定性,具体情况放在下面讨论。
Facebook的登陆主要有三步,过程如下:
step 1
进入https://www.facebook.com,获取set-cookies值fr,下一步需要post的值lsd、lgnrnd、lgnjs,这三个值在html中均放在input标签下,且type均为‘hidden’,如下:
<input type="hidden" name="lsd" value="AVpI6yeG" autocomplete="off" />
<input type="hidden" name="lgnrnd" value="171524_eEMy" />
<input type="hidden" id="lgnjs" name="lgnjs" value="n" /></span>
使用正则语句将value值提取出即可,Cookie值使用cookiejar存储即可,方便下一步的使用。代码如下:
def login_first_step(self):
sent_url = 'https://www.facebook.com'
request = urllib2.Request(url=sent_url,headers=self.facebook_header)
content=self.opener.open(request)
html = content.read()
lsd=lgndim=lgnjs=lgnrnd=''
# 查找lsd
reg = r'<input type="hidden" name="lsd" value="([A-Za-z0-9]*)" autocomplete="off" />'
m = re.compile(reg)
search = re.search(m,html)
if search:
lsd = search.group(1)
# 查找lgndim lgndim可能为空
reg = r'<input type="hidden" autocomplete="off" name="lgndim" value="([A-Za-z0-9]*)"'
m = re.compile(reg)
search = re.search(m,html)
if search:
lgndim = search.group(1)
# 查找lgnrnd
reg = r'<input type="hidden" name="lgnrnd" value="([A-Za-z0-9]*_[A-Za-z0-9]*)" />'
m = re.compile(reg)
search = re.search(m,html)
if search:
lgnrnd = search.group(1)
# 查找lgnjs
reg = r'<input type="hidden" id="lgnjs" name="lgnjs" value="([A-Za-z0-9]*)" />'
m = re.compile(reg)
search = re.search(m,html)
if search:
lgnjs = search.group(1)
#设置第二步中要post的值
self.login_post_values = 'lsd='+lsd+'&email='+self.email+'&pass='+self.password+\
'&persistent=&default_persistent=1&timezone=&lgndim=&lgnrnd=&#