网站调用新浪微博内容(当浏览器向服务器发送请求的时候,发出http请求消息报文)

优采云 发布时间: 2022-03-21 23:41

  网站调用新浪微博内容(当浏览器向服务器发送请求的时候,发出http请求消息报文)

  浏览器向服务器发送请求时,发出HTTP请求消息,服务器返回数据时,发出HTTP响应消息。两种类型的消息都由一个起始行、一个消息头、一个指示头结束的空行和一个可选的消息体组成。 http请求消息中,起始行包括请求方法、请求的资源、HTTP协议的版本号,消息头收录各种属性,消息体收录数据,GET请求没有消息体,所以它在邮件标题后的空白行中。没有其他数据。在Http响应消息中,起始行收录HTTP协议版本、HTTP状态码和状态,消息头收录各种属性,消息体收录服务器返回的数据内容。

  下图展示了从fiddler捕获的http请求和http响应。 GET请求的内容是空的,所以消息头和消息体后面的空行都是空的。

  服务器发送的响应消息如下,浏览器正常接收到服务器发送的http消息

  从上面可以看出,在http请求和http响应的头部信息中,cookie是消息头的一个非常重要的属性。

  什么是 cookie?

  当用户第一次通过浏览器访问域名时,被访问的WEB服务器会向客户端发送数据,维护WEB服务器和客户端之间的状态。这些数据是由 Internet 站点创建的 cookie。存储在用户本地终端上以识别用户身份的数据,cookie中的信息一般都是加密的,cookie存储在缓存或硬盘中,而硬盘是一些小的文本文件,当您访问网站,会读取网站对应的cookie信息,cookie可以有效改善我们的上网体验。一般来说,一旦 cookie 保存在您的计算机上,它就只能由创建 cookie 的 网站 读取。

  为什么需要 cookie

  Http 协议是一种无状态的面向连接的协议。 Http协议基于tcp/ip协议层。客户端与服务器建立连接后,它们之间的 TCP 连接始终保持不变。至于保持时间有多长,由服务器端设置。当客户端再次访问服务器时,会继续使用上次建立的连接。但是,由于Http协议是无状态的,WEB服务器并不知道这一点。两个请求是否是同一个客户端,这两个请求是独立的。为了解决这个问题,web程序引入了cookie机制来维护状态。 cookie 可以记录用户的登录状态。通常,Web服务器会在用户登录成功后进行签名,以标记会话的有效性,这样可以多次节省用户。验证并登录 网站。记录用户的访问状态。

  cookie 的类型

  会话Cookie(Session Cookie):这种类型的cookie只在会话期间有效,存储在浏览器的缓存中。当用户访问网站时,会创建一个会话cookie,当浏览器关闭时,会被浏览器移除。

  持久性Cookie(Persistent Cookie):这种类型的cookie在用户会话中长期有效。当您将 cookie 的属性 Max-Age 设置为 1 个月时,该 cookie 将收录在该月相关 URL 的每个 http 请求中。所以它可以记录很多用户初始化或者自定义的信息,比如第一次登录的时间,弱登录的状态等。

  Secure cookie:Secure cookie是https访问下的cookie形式,保证cookie在从客户端传递到服务器的过程中始终被加密。

  HttpOnly Cookie:这种类型的cookie只能在http(https)请求上传递,对客户端脚本语言无效,从而有效避免跨站攻击。

  第三方cookie:第一方cookie是在当前访问的域名或子域下生成的cookie。

  第三方 cookie:第三方 cookie 是由第三方域创建的 cookie。

  饼干成分

  Cookie是HTTP消息头中的一个属性,包括:Cookie名称(Name)、Cookie值(Value)、Cookie过期时间(Expires/Max-Age)、Cookie函数路径(Path)、 cookie 位于(域),使用 cookie 进行安全连接(安全)。

  前两个参数是cookie应用的必要条件。此外,还包括cookie大小(大小,不同浏览器对cookie的数量和大小有不同的限制)。

  python模拟登录

  设置一个cookie处理对象,负责给http请求添加cookie,可以从http响应中获取cookie,向网站登录页面发送请求,包括登录url、POST请求数据,Http头使用urllib2.urlopen发送请求,接收WEB服务器的Response。

  首先我们看登录页面源码

  当我们使用urllib处理url的时候,实际上是通过urllib2.OpenerDirector的实例来工作的,它会自己调用资源来执行各种操作,比如传递协议、打开url、处理cookie等。而urlopen 方法使用默认打开器来处理问题,基本的 urlopen() 函数不支持身份验证、cookie 或其他高级 HTTP 函数。要支持这些功能,您必须使用 build_opener() 函数来创建您自己的自定义 Opener 对象。

  cookielib 模块定义了自动处理 HTTP cookie 的类,并用于访问那些需要 cookie 数据的类网站。 cookielib 模块包括 CookieJar、FileCookieJar、CookiePolicy、DefaultCookiePolicy、Cookie 以及 FileCookieJar 的子类 MozillaCookieJar 和 LWPCookieJar,CookieJar 对象可以管理 HTTP cookie,向 http 请求添加 cookie,以及从 http 响应中获取 cookie。 FileCookieJar 对象主要是从文件中读取cookies或者创建cookies。其中,MozillaCookieJar 用于在 Mozilla 浏览器中创建 cookies.txt。兼容FileCookieJar实例,LWPCookieJar就是创建一个兼容libwww-perl的Set-Cookie3文件格式的FileCookieJar实例,用LWPCookieJar保存的cookie文件便于人阅读。默认是 FileCookieJar 没有保存功能,已经实现了 MozillaCookieJar 或 LWPCookieJar。所以你可以使用MozillaCookieJar或者LWPCookieJar来自动实现cookie保存。

  [蟒蛇]

  #! /usr/bin/env python#coding:utf-8import sysimport reimport urllib2import urllibimport requestsimport cookielib##这段代码用来解决中文报错reload(sys)sys的问题。 setdefaultencoding("utf8")########################################## ########## 登录人人网 loginurl = '#x27;logindomain = '人人网. com'class Login(object): def __init__(self):self.名称=''自己。 passwprd = ''自己。域=''自己。 cj = cookielib。 LWPCookieJar() 自我。开瓶器=urllib2。 build_opener(urllib2.HTTPCookieProcessor(self.

  cj))urllib2. install_opener(self.opener) def setLoginInfo(self,username,password,domain):'''''设置用户登录信息'''self.名称 = 用户名自己。密码=密码自己。 domain = domain def login(self):'''''login网站'''loginparams = {'domain':self.域,'电子邮件':自己。名称,“密码”:自我。 pwd}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.

  0.1650.57 Safari/537.36'}req = urllib2.请求(登录网址,urllib.urlencode(登录参数),标头=标头)响应= urllib2。 urlopen(req)self.操作=自我。开瓶器。打开(请求)页面=响应。 read()if __name__ == '__main__': userlogin = Login() username = 'username' password = 'password' domain = logindomain userlogin. setLoginInfo(username,password,domain) 用户登录。 login() 模拟登录新浪微博(Python)

  PC登录新浪微博时,用户名和密码在客户端用js预加密,一组参数在POST之前是GET,也是POST_DATA的一部分。这样一来,就无法以通常的简单方式来模拟一个 POST 登录(如人人网)。由于使用API​​获取部分要使用的微博数据不方便,所以需要自己写一个小爬虫,模拟登录必不可少。琢磨了一下这件事,终于成功登录了。 1、在提交POST请求之前,需要GET获取两个参数。地址为:(v1.3.18) 得到的数据中收录“servertime”和“nonce”的值,都是随机的,其他的值好像2、通过httpfox观察POST数据,参数比较复杂,其中“su”为加密后的用户名,“sp”为加密后的密码,“servertime”和“nonce”都是上一步得到的。其他参数不变,BASE64计算: username = base64.encodestring( urllib.quote(username) )[:-1];密码经过SHA1 3次加密,加上servertime和nonce的值干扰。

  即:经过两次SHA1加密后,将servertime和nonce的值加到结果中,再次进行SHA1计算。组织好参数,POST请求。在此之后,登录并没有成功。 POST后得到的内容收录语句location.replace(";callback=parent.sinaSSOController.feedBackUrlCallBack&retcode=101&reason=%B5%C7%C2%BC%C3%FB%BB%F2%C3%DC%C2%EB%B4 %ED%CE%F3");这是登录失败时的结果,和登录成功后的结果类似,只不过retcode的值为0。接下来再次请求这个URL,这样就可以成功登录微博了。记得提前建好缓存。这是完整的代码(未注释,只是看看):#! /usr/bin/env python#coding=utf8import urllibimport urllib2import cookielibimport base64import reimport jsonimport hashlibcj = cookielib.LWPCookieJar()cookie_support = urllib2.HTTPCookieProcessor(cj)opener = urllib2.build_opener(cookie_support, urllib< @2.HTTPHandler)urllib2.install_opener(opener)postdata = {'entry':'weibo','gateway':'1','from':'','savestate':'7', 'userticket':'1','ssosimplelogin':'1','vsnf':'1','vsnval':'','su':'','service':'miniblog','servertime': '','nonce': '','pwencode': 'wsse','sp': '','encoding': 'UTF-8' ,'url': '#x27;,'returntype': 'META '}def get_servertime():url = '(v1.3.18)&_=39'data = urllib2.urlopen(url).read()p =桩('\((.*)\)')try:json_data = p.search(data).group(1)data = json .loads(json_data)servertime = str(data['servertime']) nonce = data['nonce']return servertime, nonceexcept:print 'Get severtime error!'return Nonedef get_pwd(pwd, servertime, nonce):pwd1 = hashlib .sha1(pwd).hexdige st()pwd2 = hash lib.sha1(pwd1).hexdigest()pwd3_ ​​= pwd2 + servertime + noncepwd3 = hashlib.sha1(pwd3_).hexdigest()return pwd3def get_user(username):username_ = urllib.quote(username)username = base64.encodestring(username_)[:-1]return usernamedef login():username = '你的登录邮箱' pwd = '你的密码' url = '(v1. 3. 18)'try:servertime, nonce = get_servertime()except:returnglobal postdatapostdata['servertime'] = servertimepostdata['nonce'] = noncepostdata['su'] = get_user(username)postdata ['sp'] = get_pwd(pwd, servertime, nonce)postdata = urllib.urlencode(postdata)headers = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'}req = urllib2.Request(url=url,data=postdata,headers=headers)result=urllib 2.@ >urlopen(req)text = result.read()p = pile('location\.replace\(\'(.*?)\'\)')try:login_url = p.search(text) .group(1)#print login_urlurllib2.urlopen(login_url)print "登录成功!"except:print '登录错误!'login()

  以上是使用POST用户名/密码等参数(加密)并保存cookies模拟登录的方法。

  一般来说,为了保证安全,网站会定期更新登录的详细信息,比如修改参数名,更新加密(hash)算法等。因此,模拟登录的代码肯定会定期失败,但如果 网站 没有进行大更新,它仍然可以使用,只需稍作改动。此外,处理验证码的难度更大。虽然该程序在一定程度上可以识别验证码字符,但目前很难找到一个简单通用的验证码识别程序。

  很多豆友反映需要模拟登录新浪微博获取数据。其实对于一般的微博数据获取,比如用户信息、微博内容等,使用微博开放平台API是更明智的选择:速度更快,节省了大量的网页处理工作量。对于不开放API的数据,我们采用模拟登录的方式。熟悉网络的朋友只要定期维护模拟登录的代码,总能成功登录微博。如果不是那么熟悉,其实可以用一个比较天真的思路来解决:直接把cookie发到新浪微博,实现模拟登录。 1. 获取cookies非常简单。您可以通过Chrome浏览器的“开发者工具”或火狐浏览器的“HTTPFOX”等插件直接查看您的新浪微博cookies。 (注意:不要泄露这个私有 cookie!)

  比如Chrome视图cookies(快捷键F12可以调出chrome开发者工具)

  chrome 中的 cookie

  2、提交cookie作为访问微博的header参数 headers = {'cookie': 'your cookie'}req = urllib2.Request(url, headers=headers) #每次访问页面,带上 headers 参数 r = urllib2.urlopen(req) 看具体代码:

  本文分享自微信公众号-大数据挖掘DT数据分析(datadw)

  原文出处及转载信息在文中有详述。如有侵权,请联系我们删除。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线