(个人经验,仅供参考,错误之处,敬请谅解)
学到python的爬虫,有个链接是黑板课闯爬虫关的,于是去试了下
第一关
第二关
第三关:链接以此类推,不过有个防护,登陆之后才显示。
这里直接给出代码,个人直接抓取
#Encoding=utf-8
import requests
import re
url_start = "http://www.heibanke.com/lesson/crawler_ex00";
r = requests.get(url_start);
number = re.findall('.*?(\d{5}).*',r.text)
while number:
r = requests.get(url_start+'/'+number[0])
number = re.findall('.*?(\d{5}).*',r.text)
print(number)
第二关的话,需要查看源代码,里面有一个hidden文本框,需要同用户名和密码一起提交给服务器进行校验(也存在cookie中)
方法就是先抓取token值,再构造数据进行post请求,三十次终归会破解。这里不给出代码,第三关包含了
注册登陆之后,再进入ex02,才是第三关,否则无法进入,所以这里比第二关多了一个登陆验证。
代码如下:
#Encoding=utf-8
import requests
import re
url_login = "http://www.heibanke.com/accounts/login"
url = "http://www.heibanke.com/lesson/crawler_ex02"
user = {
'csrfmiddlewaretoken':'',
'username':'wiahu',
'password':'123456'
}
data = {
'csrfmiddlewaretoken':'',
'username':'a',
'password':0
}
s = requests.Session()
r = s.get(url_login)
token = re.findall('value=\'(.*?)\'',r.text)
user['csrfmiddlewaretoken'] = token[0]
print(user)
s.post(url=url_login,data=user)
for i in range(0,30):
m = s.post(url)
token = re.findall('value=\'(.*?)\'',m.text)
data['csrfmiddlewaretoken'] = token[0]
data['password'] = i
p = s.post(url=m.url,data=data)
error = re.findall('密码错误',p.text)
if not error:
print('password is ',i)
个人给出的方法与前两关类似,都是使用正则抓取token值,再进行post。
注意点:
个人闯第三关诶研究了两天,一直卡在token校验上,找了网上不同的答案,最终比较发现,不止是要post上一个get到的url,而且还存在headers、session机制的验证,所以只好用request.Session 再传递数据给所请求到的页面。
很多答案使用cookie获取token值,个人觉得爬虫闯关还是用正则来‘爬’吧