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

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

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

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

手机版登录页面

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

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


Form Data记录
  • 这些字段名和值需要先从登录页面抓取:
    • 密码字段名不是一个固定的值,password+随机数
    • vk, capId是隐藏字段,登录时必须
    • code 是验证码

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,398评论 19 139
  • HTML表单 在HTML中,表单是 ... 之间元素的集合,它们允许访问者输入文本、选择选项、操作对象等等,然后将...
    兰山小亭阅读 8,691评论 2 14
  • 4 创建一个社交网站 在上一章中,你学习了如何创建站点地图和订阅,并且为博客应用构建了一个搜索引擎。在这一章中,你...
    lakerszhy阅读 6,521评论 0 7
  • 第二部分 Blog例子 第八章 用户验证 大部分程序需要追踪用户身份。当用户连接到程序,通过一系列步骤使自己的身份...
    易木成华阅读 5,089评论 0 4
  • 喧闹的街头充斥着杂乱无章的声音,像是指尖从耳膜划过。刺耳。尖利。我伫立在站牌前,静候车来。 公交车淌过昨夜未干的洼...
    安详的鹰阅读 2,953评论 0 0