前言
第一第二题比较简单,也类似,就放在一起讲了
提示:题目网址:http://glidedsky.com/level/web/crawler-basic-2
一、题目描述
二、网页分析
我们需要的就是div属性下class="col-md-1"的文本内容,直接用bs4或者xpath就可以获取了,需要注意的是,访问题目需要登录状态,可以选择携带登录后的cookie信息,或者选择模拟登录。
2.模拟登录
打开网页调试工具,进行抓包分析后,我们可以看到,登录请求需要携带3个参数,分别为_token,email和password,其中token值是动态变化的:
我们需要获取的就是_token的值,我们查看栈跟踪,发现它是没有调用其他包的js的
也就是说_token大概率就藏在网页的源码中,我们进行查看源码,搜索关键词token可以发现登录页面源码中content的值很有可能就是我们需要的token,我们记录下content的值,再进行一次登录,查看_token的值进行比对,最终确定登录参数_token就是登录页面源码中csrf-token的content值。我们使用正则就能获取到,有了_token值我们也就可以实现模拟登录了
源码
import re
import time
import requests
from lxml import etree
start = time.time()
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0',
}
#获取每页的数字和
def page_sum(url):
res = s.get(url=url, headers=headers).text
page_text = etree.HTML(res)
items = page_text.xpath('//div[@class="col-md-1"]/text()')
num = 0
for i in items:
num += int(i.replace('\n', '').strip())
return num
#获取登录需要的参数_token
def get_token(url):
resp = s.get(url)
token = re.findall('<meta name="csrf-token" content="(.*?)">', resp.text)[0]
return token
#模拟登陆
def login(s):
login_url = "http://glidedsky.com/login"
data = {
'_token': get_token(login_url),
'email': '账号',
'password': "密码"
}
s.post(url=login_url, data=data)
#使用session保持登录状态
s = requests.Session()
login(s)
sum = 0
for i in range(1,1001):
url = 'http://glidedsky.com/level/web/crawler-basic-2?page={}'.format(i)
sum+= page_sum(url)
print(sum)
end = time.time()
print("爬虫耗时:{} s".format(end - start))
总耗时52s,我们后续可以通过多线程以及协程的方式提高爬取速度
爬虫基础多线程版
Glidedsky系列—爬虫基础协程版aiohttp