Scrapy 模拟登陆(验证码破解)

网上的一些案例比如模拟登陆豆瓣,其实已经不适用了因为验证码已经不是以前的那种看图输文字。这次我们以自己学校的教务网为案例,大家也可以去尝试一下

  • 重点一 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 否则一切都是浮云

以上的账号密码非正确只是演示以下具体过程,请自行去自己学校的教务网尝试

Scrapy是一个强大的Python网络爬虫框架,它可以帮助开发者抓取网站数据。模拟登录Scrapy的过程通常涉及以下几个步骤: 1. **设置请求头**:为了模拟真实用户,需要设置合适的User-Agent、Cookie等请求头信息。这可以防止目标站点识别出是爬虫。 ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } ``` 2. **创建登录请求**:创建一个登录页面的GET请求,获取初始的登录表单数据,如CSRF Token等。 ```python response = requests.get(login_url, headers=headers) login_form_data = dict(response.form.fields) ``` 3. **构造POST数据**:根据登录页面的HTML结构,填充用户名、密码和其他必填字段,并加入之前获取到的CSRF Token。 ```python data = { 'username': username, 'password': password, # 根据实际页面填写其他字段 'csrfmiddlewaretoken': login_form_data['csrfmiddlewaretoken'] } ``` 4. **发送登录请求**:使用Scrapy的`FormRequest`类发送POST登录请求。 ```python form_request = FormRequest( url=login_url, method='POST', formdata=data, headers=headers, callback=self.handle_login_response, dont_filter=True, # 防止Spider从过滤列表中移除 ) ``` 5. **处理响应**:定义`handle_login_response`函数来检查登录是否成功,如果成功,你可以继续抓取需要的数据;如果失败,则需要分析错误原因并尝试修复。 ```python def handle_login_response(self, response): if 'You are logged in.' in response.text: # 登录成功,开始抓取内容 self.crawl_urls_to_scrape() else: # 处理登录失败情况... ``` 6. **添加登录请求到Spiders**:在Scrapy Spider中,将登录请求添加到待抓取队列中。 ```python spider = MySpider() spider.start_requests.append(form_request) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值