Python——新浪微博爬虫之模拟登陆

  在编写微博爬虫的过程中,免不了要进行模拟登录,因为新浪微博不登陆只能访问少量的微博信息。

  然而,由于新浪微博的反爬虫功能在不断更新,例如改变了密码的加密算法(RSA),以前的一些模拟登陆方式已经不适用了。所以一开始试了好几种方法,均不能成功。后来受http://www.jb51.net/article/46053.htm启发,已经实现了。

  目前,亲测能用的步骤是:①通过预登录,使用GET方法,获得登录所需的servertime, nonce, pubkey, rsakv;②使用encode64加密用户名,使用RSA算法加密密码;③登录。

  步骤一:

  response格式为(换行是我自己加上去的):

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1430743809,"pcid":"gz-9e4ab7356f6545655af2a97e1cad7aa86446","nonce":"VA2IUS","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":3})

  python代码为:

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)‘ % username
response = urllib2.urlopen(prelogin_url)
p = re.compile(r‘\((.*?)\)‘) #用来解析括号中的json格式内容
strurl = p.search(response.read()).group(1)
dic = dict(eval(strurl)) #json格式的response
pubkey = str(dic.get(‘pubkey‘))
servertime = str(dic.get(‘servertime‘))
nonce = str(dic.get(‘nonce‘))
rsakv = str(dic.get(‘rsakv‘))

  步骤二:

  加密用户名:

username_ = urllib.quote(username)
username = base64.encodestring(username_)[:-1]

  加密密码:

rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
message = servertime + ‘\t‘ + nonce + ‘\n‘ + password #拼接明文js加密文件中得到
passwd = rsa.encrypt(message, key) #加密
passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。

  完整代码:

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

Python——新浪微博爬虫之模拟登陆的相关文章

最新Python新浪微博爬虫2014-07

之前微博的登陆密码加密是三层sha1算法,现在更改为rsa2算法 下面是python脚本,并把首页账号首页微博抓取下来. 亲测可行. #! /usr/bin/env python # -*- coding: utf-8 -*- import sys import urllib2 import urllib import json import re import base64 import hashlib import rsa import binascii import cookielib b

利用Python与selenium自动化模拟登陆12306官网!

近年来,12306的反爬越来越来严重,从一年前的 获取tk参数后到现在增加了 JS.CSS等加密方式! 目前大部分人利用的登陆方式都是利用selenium ,此文也不例外. 环境:        Windows python 3.6.5 模块:      selenium pyautogui      time 第一步: 实例化一款浏览器,并进入到12306官网 driver = webdriver.Chrome() driver.get('https://kyfw.12306.cn/otn/r

python 2.7 简单模拟登陆网站

举个栗子,首先创建网络会话, 然后就可以用创建的session来访问网页了. session.get(URL) #-*- coding:utf-8 -*- import requests import re from hashlib import md5 domain = 'http://*********:0000' def login_session(username, password): data = { 'method': 'verify', 'USERNAME': username,

爬虫实现模拟登陆豆瓣

一: # -*- encoding:utf-8 -*- import requests from bs4 import BeautifulSoup import urllib import re loginUrl = 'http://accounts.douban.com/login' formData={ "redir":"http://movie.douban.com/mine?status=collect", "form_email":&q

爬虫模拟登陆校园网并抓取作业

首先打开校园网的网络教学平台http://eol.zhbit.com/homepage/common/ 找到相应的表单代码 用户名的name是IPT_LOGINUSERNAME 密码的name是IPT_LOGINPASSWORD 提交的地址是http://www.zhbit.com/homepage/common/login.jsp 通过浏览器的抓包发现确实只有这两个数据提交 提交成功后页面变成这样 点击进入 发现地址已经变成http://eol.zhbit.com/main.jsp 所以我们的

python爬虫 模拟登陆校园网-初级

最近跟同学学习爬虫的时候看到网上有个帖子,好像是山大校园网不稳定,用py做了个模拟登陆很有趣,于是我走上了一条不归路..... 先上一张校园网截图 首先弄清一下模拟登陆的原理: 1:服务器判定浏览器登录使用浏览器标识,需要模拟登陆 2: 需要post账号,密码,以及学校id python走起,我用的2.7版本,用notepad++写的,绑定python可以直接运行 由于是模拟网页登陆,需要导入urllib urllib2 cookielib库,前两个有与网页直接的接口,cookielib就是用来

运维学python之爬虫高级篇(六)scrapy模拟登陆

上一篇介绍了如何爬取豆瓣TOP250的相关内容,今天我们来模拟登陆GitHub. 1 环境配置 语言:Python 3.6.1 IDE: Pycharm 浏览器:firefox 抓包工具:fiddler 爬虫框架:Scrapy 1.5.0 操作系统:Windows 10 家庭中文版 2 爬取前分析 分析登陆提交信息分析登陆信息我使用的是fiddler,fiddler的使用方法就不作介绍了,大家可以自行搜索,首先我们打开github的登陆页面,输入用户名密码,提交查看fiddler获取的信息,我这

Python爬虫者的福音!一个神库,汇总了数十个主流网站的模拟登陆方法

网络上有形形×××的网站,不同类型的网站爬虫策略不同,难易程度也不一样.从是否需要登陆这方面来说,一些简单网站不需要登陆就可以爬,比如之前爬过的猫眼电影.东方财富网等.有一些网站需要先登陆才能爬,比如知乎.微信等.这类网站在模拟登陆时需要处理验证码.js 加密参数这些问题,爬取难度会大很多.费很大力气登陆进去后才能爬取想要的内容,很花时间. 是不是一定要自己动手去实现每一个网站的模拟登陆方法呢,从效率上来讲,其实大可不必,已经有前人替我们造好轮子了. 最近发现一个神库,汇总了数十个主流网站的模拟

Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

本篇博客主要用于介绍如何使用selenium+phantomJS模拟登陆豆瓣,没有考虑验证码的问题,更多内容,请参考:Python学习指南 #-*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time #如果获取页面时获取不到文本内容,加入下面参数 driver = webdriver.PhantomJS(service_args=[