题目描述
题目链接:http://glidedsky.com/level/crawler-basic-1
题目分析
第一个题目相对来说比较简单,可能就是模拟登录的时候需要稍微分析一下,下面就大致的分析一下登录过程。
首先打开登录界面:http://glidedsky.com/login,因为网站用的是提交form表单的形式进行登录,所以首先查看网页的源代码,找出需要提交的字段。网页的form表单的源代码如下所示(省略了一些无关紧要的内容)。
<form method="POST" action="http://glidedsky.com/login">
<input type="hidden" name="_token" value="8pxypa3GEXwJbPlS2TTn2hHjUEOBt1lSNZyk6TsN">
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">E-Mail Address</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control" name="email" value="" required autofocus>
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">Password</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control" name="password" required>
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
Login
</button>
</div>
</div>
</form>
从上面的代码中可以看出,form表单提交的地址为:http://glidedsky.com/login,也就是登录界面的地址,需要提交的字段有三个,分别是_token
,email
和password
,email
指的是邮箱地址,password
指的是登录密码,而_token
是每次请求登录页面时,服务器动态生成的,因此我们的模拟登录策略是,在向http://glidedsky.com/login提交表单数据之前,先请求一次此页面,并从返回的html代码中提取出_token
的值,之后再构造登录表单需要的三个字段,最后携带着表单数据向登录验证地址发起POST请求即可。
当登录成功之后,再向数据页面发起GET请求就可以得到数据页的源代码,之后剩下的工作就是解析页面,提取数字。此网站的目的是练习反爬虫的方法,而不是练习页面的解析,因此网页结构比较简单,本文也就不再赘述网页的解析过程。
源代码
import requests
import re
from bs4 import BeautifulSoup
params = {
'email': '', # 你的账号
'password': '', # 你的密码
'_token': 's9OikhiHKa8CoplaD7g8sxXx6XnsCc5HRGj24znl',
}
def login():
url = 'http://glidedsky.com/login'
session = requests.Session()
r = session.get(url)
html = r.text
result = re.search('input type="hidden" name="_token" value="(.*?)"', html)
_token = result.group(1)
params['_token'] = _token
session.post(url=url, data=params)
return session
def crawler():
session = login()
r = session.get('http://glidedsky.com/level/web/crawler-basic-1')
soup = BeautifulSoup(r.text, 'lxml')
numbers = soup.find_all('div', class_='col-md-1')
ans = 0
for number in numbers:
ans += int(number.string.strip())
print(ans)
if __name__ == '__main__':
crawler()