网上的一些案例比如模拟登陆豆瓣,其实已经不适用了因为验证码已经不是以前的那种看图输文字。这次我们以自己学校的教务网为案例,大家也可以去尝试一下
- 重点一 scarpy中的post提交:scrapy.FormRequest
def start_request(self):
url=''#提交的网页
data={'email':'aaa','password':'aaa'}#提交的data参数
request=scrapy.FormRequest(url,formdata=data,callback=self.parse)#post提交
yield request#s
- 重点二 scarpy中的传递登陆的cookie
重难点在传递cooki的值上,比如下载二维码每次访问的值都是不同我们要传递某次访问二维码的cookie去登陆
(即登陆页面的二维码与下载的二维码是同一个)
在发送请求时cookie的操作, meta={'cookiejar':1}表示开启cookie记录,首次请求时写在Request()里
meta={'cookiejar':response.meta['cookiejar']}表示使用上一次response里的cookiex
写在FormRequest.from_response()里post授权
meta={'cookiejar':True}表示使用上一个请求后响应的cookie(授权后的cookie访问需要登录查看的页面)
- 实践才是真理
class SpiderSpider(scrapy.Spider):
name = 'spider'
allowed_domains = ['kdjw.hnust.cn']
#获取二维码
def start_requests(self):#这里重写了start_requests方法:strat_url请求的方法
yield scrapy.Request("http://kdjw.hnust.cn/kdjw/verifycode.servlet",callback=self.pic_download,meta={'cookiejar':1})
#下载二维码并登陆
def pic_download(self, response):
#获取图片的下载内容
print("*" * 30)
print(response)
print("*"*30)
fp=open('验证码.png','wb')
fp.write(response.body)
fp.flush()
fp.close()
yanzhengma=input('请输入验证码')
data = {'dlfl': '0', "USERNAME": '1608050156', "PASSWORD": '1608050156', 'RANDOMCODE': yanzhengma, 'useDogCode': '',
'x': '37', 'y': '13'}
yield scrapy.FormRequest(url='http://kdjw.hnust.cn/kdjw/Logon.do?method=logon',meta={'cookiejar': response.meta['cookiejar']},formdata=data,callback=self.post_parse)
#请求登陆后的页面显示
def post_parse(self,response):
print("*" * 30)
#print(response.body)
print(response.text)
ke = 'http://kdjw.hnust.cn/kdjw/tkglAction.do?method=goListKbByXs&istsxx=no&xnxqh=2018-2019-1&zc=&xs0101id=1608050156'
print("*" * 30)
yield scrapy.Request(ke,callback=self.detail,meta={'cookiejar':True})
def detail(self,response):
print("*" * 30)
print(response.text)
print("*" * 30)
当然setting中还要设置headers和user-agent 否则一切都是浮云
以上的账号密码非正确只是演示以下具体过程,请自行去自己学校的教务网尝试