@glidedsky爬虫基础第二关通关涉及知识点
- 模拟登录
- 正则提取
- for循环嵌套
- xpath提取
- 数值累加
简介:glidedsky是一个爬虫专用的练习网站,上面有很多关卡,通过第一关可以看到第二关,通过第二关可以看见所有关卡,写爬虫就像玩游戏一样。
下面我们开始本次的内容:
首先我们要先导入本次需要使用的模块requests、re和xpath。
import requests
import re
from lxml import etree
然后基本的UA伪装要加上
header = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
}
接下来开始模拟登录,首先使用requests的session函数,保持请求过程中一直是同一个会话连接,然后开启请求登录页面。
s = requests.session()
url = 'http://www.glidedsky.com/login'
login_text = s.get(url,headers=header).text
拿到网页源码后通过re正则表达式提取出token,注意:这里的token每次请求网页都会变化,所以这也是为什么要保持同一个会话连接的原因。
token = re.findall('<input type="hidden" name="_token" value="(.*?)">',login_text)
print(token) #验证是否正确提取到token
然后开始构建post请求表单,第一行就是刚刚获取带的token,第二行是你的账户名,第三行代表你的账号密码。
data = {
'_token': token,
'email': '这里放你的登录账号',
'password': '这里放你的登录密码',
}
然后开始发送post请求,携带参数请求登录网站。
login_url = 'http://www.glidedsky.com/login'
get_login = s.post(url=login_url,headers=header,data=data).text
接下来定义一个变量保存计算后的值,然后写循环嵌套部分,先写一个外循环,以为网页有1000页,同时网页没有0页,所以range(1,1001),并赋值给x,下面放上翻页链接,用format函数代入,print输出查看是否正确。
result = 0
for x in range(1,1001):
all_url = 'http://www.glidedsky.com/level/web/crawler-basic-2?page={}'.format(x)
print(all_url)
因为现在是在循环内部,所以请求的时候会每一个url都请求一次,我们在将请求到的网页源码转换成xpath解析,因为解析出来的是多个整数,所以需要用到循环将每个提取出来的内容都循环一次,再用strip()去掉左右空格个,并赋值给num,然后开始计算结果,因为num是字符串,所以需要用int将其转换成整数才能相加,最后打印输出结果,将结果填入答题框内,即可通关。
get_text = s.get(all_url,headers=header).text
html = etree.HTML(get_text)
for number in html.xpath('//div[@class="row"]/div/text()'):
num = number.strip()
result += int(num)
print(result)
下面是完整代码:
import requests
import re
from lxml import etree
header = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
}
s = requests.session()
url = 'http://www.glidedsky.com/login'
login_text = s.get(url,headers=header).text
token = re.findall('<input type="hidden" name="_token" value="(.*?)">',login_text)
print(token)
data = {
'_token': token,
'email': '这里放你的登录账号',
'password': '这里放你的登录密码',
}
login_url = 'http://www.glidedsky.com/login'
get_login = s.post(url=login_url,headers=header,data=data).text
result = 0
for x in range(1,1001):
all_url = 'http://www.glidedsky.com/level/web/crawler-basic-2?page={}'.format(x)
print(all_url)
get_text = s.get(all_url,headers=header).text
html = etree.HTML(get_text)
for number in html.xpath('//div[@class="row"]/div/text()'):
num = number.strip()
result += int(num)
print(result)
感谢阅读,我们下次再会!