day010 【python】

PYTHON用起来!

  • 采用requests库模拟登录

  • (Tornado)模拟登录小米抢手机

  • python的核心就是使用,不要管那么多,直接找代码,或者改代码用起来就行了。

  • http://www.douban.com/note/264976536/

  • 百度 python + 新浪微博

  • http://www.jb51.net/article/46053.htm

python登陆

basic technics

  • todo这是什么意思?熟悉Web的朋友只要定期维护模拟登录的代码就可以一直成功登录微博。如果不那么熟悉的话,其实可以采用更naive的思路来解决:直接将Cookie发送给新浪微博以实现模拟登录。
    solution 我造了,第一个就是之前弄的获取server time之类的参数然后一并POST提交,还要经过RSA加密的那种方式;第二个就是在浏览器中找到cookie,然后就行了。
    #!/usr/bin/env python
    #coding=utf8
    import urllib2
    import re
    cookie = "write ur cookie here"
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0',
    'cookie': cookie
    }
    def visit():
    url = 'http://weibo.com/2430286635/profile?topnav=1&wvr=6'
    #若是个人主页地址,获取到的title是你的微博名;若是weibo.com则得到的是"visitor system"
    req = urllib2.Request(url, headers=headers)
    text = urllib2.urlopen(req).read()
    # print the title, check if you login to weibo sucessfully
    pat_title = re.compile('<title>(.+?)</title>')
    r = pat_title.search(text)
    if r:
        print r.group(1)
    if __name__ == '__main__':
    visit()
    

advance technics

  • 难点一:服务器经常更改登陆细节:修改参数名、更新加密(散列)算法

  • 难点二:客户端js预先对用户名、密码都进行了加密。

  • 难点三:POST之前先GET一些参数,中间进行一些hash计算,然后一体提交。

  • 在提交POST请求之前, 需要GET 获取两个参数。
    地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
    得到的数据中有 “servertime” 和 “nonce” 的值, 是随机的,其他值貌似没什么用。

  • 通过httpfox观察POST 的数据, 参数较复杂,其中 “su” 是加密后的username, “sp"是加密后的password。“servertime” 和 ”nonce” 是上一步得到的。其他参数是不变的。
    username 经过了BASE64 计算: username = base64.encodestring( urllib.quote(username) )[:-1];
    password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰。
    即: 两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1 算一次。

  • 将参数组织好, POST请求。 这之后还没有登录成功。
    POST后得到的内容中包含一句 location.replace(“http://weibo.com/ajaxlogin.php?framelogin=1&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,这样就成功登录到微博了。
    记得要提前build 缓存。

  • pyquery赋值id p.attr[“id”] = “ola”

  • 获取元素 p.attr(id='hello', class_='hello2')

  • ajax登陆方式,如何知道POST的参数

  • brew install mysql之后,输入mysql出现can't connect to local mysql server through socket '/tmp/mysql.sock',其实只要启动一下就好了mysql.server start

  • pyquery官网有typo developed

  • python可以干什么?,Python这东西,直接拿来用就行了,原理性的东西请移步C。

  • python的除法还挺复杂的。

  • webServer变量在这里,http://www.4399.com/js/serversda.js

  • Python修改文件名 link
    solution os.rename('/Users/yjatt/Programs/Test/first.swf','/Users/yjatt/Programs/Test/老爹圣代历险记.swf')

  • 爬游戏名:使用pyquery 获取innerHTML?
    solution doc('#gtitle')('h1')('a').text() 这样便获取到了gtitle 下面的h1标签内的a标签中的text。

python

  • 我居然这么写headers
    headers = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'
    千刀!

  • 一个python的tumblr接口!
    https://pypi.python.org/pypi/python-tumblpy

教你怎样阅读pyquery官方文档

  • http://pythonhosted.org//pyquery/
  • 分为index和module两种
  • 还有full document

python gil

  • 也许是python最麻烦的一个东西
    http://www.oschina.net/translate/pythons-hardest-problem
    http://www.chenqing.org/2013/06/python-gil-1.html
    对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。
    python不要使用多线程,请使用多进程。
    对于计算密集型的,我还是建议不要使用python的多线程而是使用多进程方式,而对于IO密集型的,还是劝你使用多进程方式,因为使用多线程方式出了问题,最后都不知道问题出在了哪里。

你可能感兴趣的:(day010 【python】)