一、基础知识

http://blog.csdn.net/pi9nc/article/details/9734437

二、模拟登录

因为上学期参加了一个大数据比赛,需要抓取数据,所以就想着写个爬虫抓取新浪微博的数据。

当然抓取数据不是漫无目的的,我需要的是根据关键词来抓取相关微博。

正好微博有一个高级搜索功能,不过要获取更多的微博,需要登录,所以这时就需要模拟登录了。

以下代码是通过rsa加密算法模块来模拟的。需要注意的是,新浪有反爬虫的,所以我们登录的时候要伪装成浏览器。

代码不是自己写的,所以文章类型标为转载,因为代码大同小异,所以我就不写咯,里面的一些具体代码和问题解析,我也不一一赘述了,因为模拟登录不是我的重点,下一篇我将跟大家谈一谈登录后的抓取与网页解析部分。至于登录,文章开头的链接中有详细教程,有兴趣的可以看一下。

  1. #! /usr/bin/env python
  2. #coding=utf8
  3. import urllib
  4. import urllib2
  5. import cookielib
  6. import base64
  7. import re
  8. import json
  9. import hashlib
  10. import rsa
  11. import binascii
  12. cj = cookielib.LWPCookieJar()
  13. cookie_support = urllib2.HTTPCookieProcessor(cj)
  14. opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
  15. urllib2.install_opener(opener)
  16. postdata = {
  17. 'entry': 'weibo',
  18. 'gateway': '1',
  19. 'from': '',
  20. 'savestate': '7',
  21. 'userticket': '1',
  22. 'ssosimplelogin': '1',
  23. 'vsnf': '1',
  24. 'vsnval': '',
  25. 'su': '',
  26. 'service': 'miniblog',
  27. 'servertime': '',
  28. 'nonce': '',
  29. 'pwencode': 'rsa2', #加密算法
  30. 'sp': '',
  31. 'encoding': 'UTF-8',
  32. 'prelt': '401',
  33. 'rsakv': '',
  34. 'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
  35. 'returntype': 'META'
  36. }
  37. class WeiboLogin:
  38. def __init__(self, username, password):
  39. self.username = username
  40. self.password = password
  41. def __get_spwd(self):
  42. rsaPublickey = int(self.pubkey, 16)
  43. key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
  44. message = self.servertime + '\t' + self.nonce + '\n' + self.password #拼接明文js加密文件中得到
  45. passwd = rsa.encrypt(message, key) #加密
  46. passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
  47. return passwd
  48. def __get_suser(self):
  49. username_ = urllib.quote(self.username)
  50. username = base64.encodestring(username_)[:-1]
  51. return username
  52. def __prelogin(self):
  53. prelogin_url = 'http://login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)' % self.username
  54. response = urllib2.urlopen(prelogin_url)
  55. p = re.compile(r'(.∗?)')
  56. strurl = p.search(response.read()).group(1)
  57. dic = dict(eval(strurl)) #json格式的response
  58. self.pubkey = str(dic.get('pubkey'))
  59. self.servertime = str(dic.get('servertime'))
  60. self.nonce = str(dic.get('nonce'))
  61. self.rsakv = str(dic.get('rsakv'))
  62. def login(self):
  63. url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'
  64. try:
  65. self.__prelogin() #预登录
  66. except:
  67. print 'Prelogin Error'
  68. return
  69. global postdata
  70. postdata['servertime'] = self.servertime
  71. postdata['nonce'] = self.nonce
  72. postdata['su'] = self.__get_suser()
  73. postdata['sp'] = self.__get_spwd()
  74. postdata['rsakv'] = self.rsakv
  75. postdata = urllib.urlencode(postdata)
  76. headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0'} #伪装成浏览器
  77. req  = urllib2.Request(
  78. url = url,
  79. data = postdata,
  80. headers = headers
  81. )
  82. result = urllib2.urlopen(req)
  83. text = result.read()
  84. p = re.compile('location\.replace\'(.∗?)\'')
  85. try:
  86. login_url = p.search(text).group(1)
  87. urllib2.urlopen(login_url)
  88. print "Login Succeed!"
  89. except:
  90. print 'Login Error!'

【python网络编程】使用rsa加密算法模块模拟登录新浪微博的更多相关文章

  1. python网络编程——SocketServer/Twisted/paramiko模块

    在之前博客C/S架构的网络编程中,IO多路复用是将多个IO操作复用到1个服务端进程中进行处理,即无论有多少个客户端进行连接请求,服务端始终只有1个进程对客户端进行响应,这样的好处是节省了系统开销(se ...

  2. [Python 网络编程] TCP、简单socket模拟ssh (一)

    OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份 ...

  3. 28、Python网络编程

    一.基于TCP协议的socket套接字编程 1.套接字工作流程 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 ...

  4. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  5. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  6. Python 网络编程相关知识学习

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  7. python 网络编程 TCP/IP socket UDP

    TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...

  8. Python 网络编程Ⅱ

    客户端 接下来我们写一个简单的客户端实例连接到以上创建http://www.weixiu3721.com/的服务.端口号为 12345. socket.connect(hosname, port )  ...

  9. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

随机推荐

  1. HDU 2795 Billboard(线段树)

    题目链接: 传送门 Billboard Time Limit: 2000MS     Memory Limit: 32768 K Description At the entrance to the ...

  2. fzuoop期中练习

    5-1 科学计数法的值 科学计数法是一种数学专用术语.将一个数表示成 a×10的n次幂的形式,其中1≤|a|<10,n为整数,这种记数方法叫科学计数法.例如920000可以表示为9.2*10^5 ...

  3. 配置ASP.NET Web应用程序, 使之运行在medium trust

    这文章会向你展示, 怎么配置ASP.NET Web应用程序, 使之运行在medium trust.   如果你的服务器有多个应用程序, 你可以使用code access security和medium ...

  4. CDN网络(二)之配置和优化CDN核心缓存软件--squid

    前言 squid是众多CDN厂商使用的核心缓存软件,都在已有的基础上进行二次开发.在部署squid的时候,建议遵循下面的规范. 1. 使用大内存服务器 对于热点文件,我们让squid用内存缓存,这样大 ...

  5. Nginx系列2之Nginx+php

    preface 公司所有的大多数业务都泡在LNMP平台上,所以对PHP+Nginx有点了解,那么就做个小小的总结吧. what's FastCGi FastCGI是一个可伸缩,高速的在HTTP ser ...

  6. Saltstack数据系统Grains和Pillar(三)

    Saltstack数据系统 分为Grains和Pillar 一.Grains 静态数据,当Minion启动的时候收集的MInion本地的相关信息.(包含操作系统版本.内核版本.CPU.内存.硬盘.设备 ...

  7. 面向服务架构(SOA)和企业服务总线(ESB)

    http://www.cnblogs.com/shanyou/archive/2008/04/19/1161452.html 学习和研究在企业中实施面向服务架构(SOA),简单回顾SOA和ESB,重点 ...

  8. 爬虫2 url管理器 url_manager.py

    #coding:utf8 class UrlManager(object): def __init__(self): self.new_urls = set() self.old_urls = set ...

  9. Ubuntu下安装了java但启动eclipse报错说没装java

    参考资料:http://blog.csdn.net/happyteafriends/article/details/8290950 一.问题 在Ubuntu下安装了java并在~/.bashrc配置了 ...

  10. Fork函数初识

    fork函数用于创建子进程,典型的调用一次,返回两次的函数.其中调用进程返回子进程的PID,而子进程则返回0.但是两个进程的执行顺序是不定的. fork函数调用完成以后父进程的虚拟存储空间被拷贝给了子 ...