之前已经聊过了HTTP协议 爬虫 | 浅析HTTP协议 和 requests 库爬虫 | 优雅的HTTP库—requests
是时候实战一波了!既然属于气象领域,那你应该就知道气象家园论坛。逛家园下载资料时是需要积分的,而签到,回复,串门是能够获取积分的,为了让积分快点往上去,以便以后需要的时候下载更多的资料,你就要经常签到。作为小小程序猿,那么当然想自动化这部分工作了!
工具:Fiddler
使用Fiddler 分析工具分析气象家园论坛登录地址,签到地址以及一些其他登录所需要的信息。
具体的分析流程这里不再赘述。
气象家园论坛的登录地址为:
'http://bbs.06climate.com/member.php'
使用 Fiddler 分析出的登录链接附加了一些参数,都已经添加到程序中。
在分析的过程中没有找到一些参数的计算方式,所以不能直接给定用户名密码进行登录,还需要获取一些额外的参数值。
比如以下四个参数(图1绿色方框标注内容,主要在 Cookies 中获取):
bdshare_firstime
yuS3_2132_saltkey
yuS3_2132_auth
yuS3_2132_dsu_amupper
利用 浏览器或是 Fiddler 找到上述四个参数,将其值复制留用。
为了能够签到,还需要找到 formhash 参数值,这个利用 Fiddler 分析工具点击家园网页的签到按钮时会找到签到链接(图2蓝色方框),然后在右侧的数据中找到表单项(右侧蓝色方框),即可找到 formhash 值。
找到上述信息之后就不需要用户名和密码了,但是不能留空,可以是任意内容。
下面上代码:
import hashlib
import requests
from bs4 import BeautifulSoup
username = 'anything'
passwd = 'anything'
formhash = formhash
kwparm = {'saltkey' : yuS3_2132_saltkey,\
'auth' : yuS3_2132_auth, \
'dsu_amupper' : yuS3_2132_dsu_amupper}
psw = hashlib.md5(passwd.encode('ascii'))
password = psw.hexdigest()
loginurl = 'http://bbs.06climate.com/member.php'
autourl = 'http://bbs.06climate.com/plugin.php'
homeurl = 'http://bbs.06climate.com/forum.php'
followurl = 'http://bbs.06climate.com/home.php'
header = {'Host': 'bbs.06climate.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0',
'Referer': 'http://bbs.06climate.com/forum.php',
'Connection': 'keep-alive'}
params = {'mod': 'logging',
'action': 'login',
'loginsubmit': 'yes',
'infloat': 'yes',
'lssubmit': 'yes',
'inajax': 1}
foparam = {'mod' : 'follow',
'do': 'follower'}
loginData = {'fastloginfield': 'username',
'username' : username,
'password' : password,
'quickforward' : 'yes',
'handlekey' : 'ls'}
cookie_value = 'bdshare_firstime=1476108193500; \
yuS3_2132_saltkey=%(saltkey)s; \
yuS3_2132_auth=%(auth)s; \
yuS3_2132_dsu_amupper=%(dsu_amupper)s' % kwparm
cookie = {'Cookie': cookie_value}
s = requests.session()
getinfo = s.post(loginurl, params = params,
data = loginData, headers = header,
cookies = cookie)
if getinfo.text.find(username) > 0:
logout = True
print(u'用户:%s 成功登录!' % username)
homeinfo = s.get(homeurl, headers = header, cookies = cookie)
hc = BeautifulSoup(homeinfo.text, 'lxml')
rems = hc.find('a', {'id': 'myprompt'})
rr = rems.get_text()
ss = rr.replace(')', '(').split('(')
auparams = {'id' : 'dsu_amupper',
'ppersubmit' : 'true',
'formhash': formhash,
'infloat': 'yes',
'handlekey': 'dsu_amupper',
'inajax' : 1,
'ajaxtarget' : 'fwin_content_dsu_amupper'}
autoinfo = s.get(autourl, params = auparams, cookies = cookie)
if len(ss) > 1:
message = u'%s 有 %s 条信息!请查看!' % (username, ss[1])
elif len(ss) == 1:
print(u'无新消息!')
else:
message = u'未知情况!'
if autoinfo.text.find(u'累计签到') > 0:
print(u'用户:%s 签到成功!' % username)
elif autoinfo.text.find(u'无需再次签到!') > 0:
print(u'用户:%s 已签到成功,无需再次签到!' % username)
else:
message = u'用户:%s 签到出现问题!' % username
print(message)
else:
logout = False
message = u'用户:%s 登录失败!' % username
print(message)
只需要将 formash, yuS3_2132* 等值替换为你所获取到的你的帐号相关值即可。
支持python2.x 和 python3.x,测试了2.7,3.5,3.6版本。
目前只支持登录,签到和查看有无消息并发送邮件到指定邮箱。