Python每天写500字每天写1000字

【图解】Python模拟登录新浪微博

2016-06-11  本文已影响1958人  向右奔跑

上一篇文章《Scrapy用Cookie实现模拟登录》完成了用Cookie实现模拟登录,绕开了用户名、密码和验证码登录的步骤。今天来比较一下以常规验证(用户名密码+验证码)的方式实现新浪微博的模拟登录,看看实现的过程中有哪些要注意的点。

一、分析登录URL和表单字段

为了更好分析登录验证过程,找到登录提交的URL和表单字段,选取了新浪微博手机版的页面进行追踪分析,采用的工具是chrome开发者工具Network功能。

手机版登录页面

1、查看源代码,了解基本表单字段
通过查看登录页源代码,了解登录的url,用户名字段mobile, 密码字段password_9771(是password加上一个随机数),还有一些隐藏字段vk, capId,以及验证码。

2、Network追踪登录过程
1)登录的完整表单字段:


Form Data记录

2)登录的全过程:
新浪微博的登录过程,第一步是提交用户名密码及其他参数,POST方法,后面经过4次重定向,完成登录。


查看新浪微博登录重定向过程

重定向都是通过location发送,get方法。理论上登录流程,重定向的过程不需要我们关心,但是Scrapy在发送登录请求时,会遇到种种问题,需要调试时,了解整个过程就很关键。

二、抓取登录表单及参数

1、先发送一个登录url请求:start_requests()方法

def start_requests(self):

        return [Request("http://login.weibo.cn/login/", meta={'cookiejar': 1}, callback=self.pre_login)]

2、抓取登录的表单字段:pre_login()方法

   def pre_login(self,response):


        selector = Selector(response)
        pwdname =selector.xpath('//input[@type="password"]/@name').extract()[0]
        vk = selector.xpath('//input[@name="vk"]/@value').extract()[0]
        imgsrc = selector.xpath('/html/body/div[2]/form/div/img[1]/@src').extract()[0]
        index = imgsrc.find('cpt=')
        capId = imgsrc[index+4:]

        action = selector.xpath('/html/body/div[2]/form/@action').extract()[0]
        action = 'http://login.weibo.cn/login/'+action

        # ... ... next, 完成验证码验证,构造表单参数...

三、完成验证码的验证

在这里,我没有采用复杂的图片验证算法库,而是直接在控制台上把验证码的URL输出来,访问一下,手工填入的方式,codeimg = raw_input('please input image:'), 简单粗暴、快速准确。

查看验证码

四、构造表单参数,提交登录请求

         data = {'mobile':'name@126.com',    #你的微博帐号
                pwdname: '123456789',     #你的密码
                'code': codeimg,    #获取的验证码
                'remember':'',
                'backURL':'http://weibo.cn/u/2508944032',   #登录后要访问url
                'backTitle':u'手机新浪网',
                'tryCount':'',
                'vk':vk,            #隐藏字段
                'capId':capId,  #隐藏字段
                'submit':u'登录'}
yield FormRequest(url=action,meta={'cookiejar': response.meta['cookiejar']},headers=self.headers,formdata=data,callback=self.parse_item)

注意这里使用了FormRequest直接提交登录url和表单参数,而不是用FormRequest.from_response(),因为请求的登录url不一样。Scrapy官网FormRequest.from_response()方法模拟用户登录》

OK,使用Scrapy完成新浪微博验证登录。在实现的过程也遇到不少问题,查看错误提示,不断调试。
可能是因为新浪微博登录参数和流程的更改,大家可以对比一下网络上的代码以及Scrapy官网上的说明。

下一步就是数据提取、保存。之前文章都有讲过。

控制台信息

Github地址 https://github.com/ppy2790/weibo.git

上一篇 下一篇

猜你喜欢

热点阅读