-专注于互联网、网络技术、网络工程、网络营销SEO、搜索引擎、社会化网络、IT技术、网络编程、网络安全、服务器管理、网站开发、移动互联网软件应用等领域的原创IT科技博客,欢迎喜欢互联网的朋友一起交流!
 

Python中的__init__,__call__

__init__函数:当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数。__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不创建实例--它仅仅是你的对象创建后执行的第一个方法。它的目的是执行一些该对象的必要的初始 化工作。通过创建自己的 __init__() 方法,你可以覆盖默认的 __init__()方法(默认的方法什么也不做),从而能够修饰刚刚创建的对象__init__()需要一个默认的参数self,相当于this。

Python爬虫模拟登录带验证码网站

Cookie的工作原理: Cookie由服务端生成,然后发送给浏览器,浏览器会将Cookie保存在某个目录下的文本文件中。在下次请求同一网站时,会发送该Cookie给服务器,这样服务器就知道该用户是否合法以及是否需要重新登录。 Python提供了基本的cookielib库,在首次访问某页面时,cookie便会自动保存下来,之后访问其它页面便都会带有正常登录的Cookie了。

爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法。python提供了强大的url库,想做到这个并不难。这里以登录学校教务系统为例,做一个简单的例子。 首先得明白cookie的作用,cookie是某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据。因此我们需要用Cookielib模块来保持网站的cookie。 这个是要登陆的地址 http://202.115.80.153/ 和验证码地址 http://202.115.80.153/CheckCode.aspx可以发现这个验证码是动态更新的每次打开都不一样,一般这种验证码和cookie是同步的。其次想识别验证码肯定是吃力不讨好的事,因此我们的思路是首先访问验证码页面,保存验证码、获取cookie用于登录,然后再直接向登录地址post数据。 首先通过抓包工具或者火狐或者谷歌浏览器分析登录页面需要post的request和header信息。以谷歌浏览器为例。

Python访问网站获得cookie,使用cookie访问网站

先看下大家都了解的登录网站方式: 这种方法有只能进入只有用户名和密码验证的网站,如果这个网站有多重验证就不行了。下面给出几种情况:

urllib2自定义opener详解及其实例应用

 urllib2.urlopen()函数不支持验证、cookie或者其它HTTP高级功能。要支持这些功能,必须使用build_opener()函数创建自定义Opener对象。

语法如下:

build_opener([handler1 [ handler2, ... ]])

 

参数handler是Handler实例,常用的有HTTPBasicAuthHandler、HTTPCookieProcessor、ProxyHandler等。

build_opener ()返回的对象具有open()方法,与urlopen()函数的功能相同。

如果要修改http报头,可以用:

import urllib2

opener = urllib2.build_opener()

opener.addheaders = [('User-agent', 'Mozilla/5.0')]

opener.open('http://www.example.com/')

2. install_opener(opener)

安装不同的opener对象作为urlopen()使用的全局opener。

3. 密码验证(HTTPBasicAuthHandler)

HTTPBasicAuthHandler()处理程序可用add_password()来设置密码。

h.add_password(realm,uri,user,passwd)

realm是与验证相关联的名称或描述信息,取决于远程服务器。uri是基URL。user和passwd分别指定用户名和密码。

import urllib2

auth=urllib2.HTTPBasicAuthHandler()

auth.add_password('Administrator','http://www.example.com','Dave','123456')

opener=urllib2.build_opener(auth)

u=opener.open('http://www.example.com/evilplan.html')

4. Cookie处理(HTTPCookieProcessor)

import urllib2,cookielib

cookie=cookielib.CookieJar()

cookiehand=urllib2.HTTPCookieProcessor(cookie)

opener=urllib2.build_opener(cookiehand)

5.代理(ProxyHandler)

ProxyHandler(proxies)参数proxies是一个字典,将协议名称(http,ftp)等映射到相应代理服务器的URL。

proxy=ProxyHandler({'http':'http://someproxy.com:8080'})

auth=HTTPBasicAuthHandler()

auth.add_password()

opener=build_opener(auth,proxy)

也可以在urlopen中使用代理

import urllib2 
 
proxy = 'http://%s:%s@%s' % ('userName', 'password', 'proxy')  

inforMation = urllib2.urlopen("http://www.example.com", proxies={'http':proxy})

Python实现自动登录网页后采集信息

我的博客中曾经贴过几个爬虫程序的代码,用来批量下载图片非常方便。这样的爬虫实现起来比较简单。而有些网站需要用户登录之后才可以下载文件,之前的方法就办不到了。今天就说说用Python模拟浏览器的登录过程,为之后的登录下载做好准备。登录的情况,需要额外用到的一个模块是cookielib,用来记住登录成功之后保存到本地的cookie,方便在网站的各个页面之间穿越。
先上代码示例:

#encoding=utf8
import urllib
import urllib2
import cookielib
###登录页的url
lgurl = 'http://mlook.mobi/member/login'
###用cookielib模块创建一个对象,再用urlllib2模块创建一个cookie的handler
cookie = cookielib.CookieJar()
cookie_handler = urllib2.HTTPCookieProcessor(cookie)
###有些网站反爬虫,这里用headers把程序伪装成浏览器
hds = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36'}  

###登录需要提交的表单
pstdata = {
'formhash':'', #填入formhash	
'person[login]':'', #填入网站的用户名	
'person[password]':'', #填入网站密码
	}

dt = urllib.urlencode(pstdata) 
#表单数据编码成url识别的格式
req = urllib2.Request(url = lgurl,data = dt,headers = hds) 
#伪装成浏览器,访问该页面,并POST表单数据,这里并没有实际访问,只是创建了一个有该功能的对象
opener = urllib2.build_opener(cookie_handler) 
#绑定handler,创建一个自定义的opener
response = opener.open(req)
#请求网页,返回句柄
page = response.read()
#读取并返回网页内容
print page 
#打印到终端显示

说明一下:

我这里就不提供用户名密码了。关于需要提交的表单数据,chrome用户可以F12 -> Network -> 填好账号密码并登录 -> 在Network找到POST...,请看截图。

点击「login」进入下图界面。

1、「From Data」里面数据比较多,通常需要用户名、密码,其余的数据是否必要,需要测试一下。对于这个网站,还需要「formhash」。

2、Linux下无编码问题,win下如果出现编码问题应该是终端对编码的支持不到位。

3、登录成功之后,我们创建的cookie_handler会自动管理cookie,程序的后面如果需要访问其他页面,用opener打开其url即可。

4、「User-Agent」同样可以通过F12查看到。

5、这篇博客重点不在介绍原理,重点是记录下这个简单的代码块,其他需要登录的爬虫仿写就可以了。

 

Python的装饰器用法

装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”,听起来有点绕,没关系,直接看示意图,其中 a 为与装饰器 @a 对应的函数, b 为装饰器修饰的函数,装饰器@a的作用是: 

简而言之:@a 就是将 b 传递给 a(),并返回新的 b = a(b)

在python中常看到在定义函数是使用@func. 这就是装饰器, 装饰器是把一个函数作为参数的函数,常常用于扩展已有函数,即不改变当前函数状态下增加功能.

def run():
  print "I'm run."

 我有这么一个函数, 我想知道这个函数什么时候开始什么时候结束. 我应该这么写:

def run():
  print time.ctime()
  print "I'm run."
  print time.ctime()

但是如果不允许修改函数的话就需要装饰器了

def count(func):
  def wrapper():
    print time.ctime()
    ret = func()
    print time.ctime()
    return ret
  return wrapper
 
@count
def run():
  print "I'm run."

 再看一个例子:

def now():
  print '2016-9-10'
f = now
f()

函数有一个__name__ 对象 可通过 dir(func) func为定义的函数名

now.__name__    # print 'now'
f.__name__     # print 'now'
 
print f       # print '<function now at 0x000000000213A908>'
print now      # print '<function now at 0x000000000213A908>'

我们通过装饰器打印log日志

def log(func):
  def wrapper(*args, **kwargs):
    print "call %s()" % func.__name__
    return func(*args, **kwargs)
  return wrapper
 
@log
def now():
  print '2015-4-10'
 
now()        # print 'call now()'

其实装饰器修饰函数相当于, now = log(now) 也就是装饰器函数把被修饰的函数当参数后赋给同名的变量

思考的一个例子:用python 装饰器打log(不明白往后看)

#! /usr/bin/env python
# coding=utf-8
  
from time import time
def logged(when):
    def log(f,*args,**kargs):
        print("called: function:%s,args:%r,kargs:%r"%(f,args,kargs))
    def pre_logged(f):
        def wrapper(*args,**kargs):
            log(f,*args,**kargs)
            return f(*args,**kargs)
    def post_logged(f):
        def wrapped(*args,**kargs):
            now=time()
            try:
                return f(*args,**kargs)
            finally:
                log(f,*args,**kargs)
                print("time delta:%s"%(time()-now))
        return wrapped
    try:
        #从这里开始调用
        return{"pre":pre_logged,"post":post_logged}[when]
    except Exception as e:
        print(e)
  
@logged("post")
def hello(name):
    print("hello",name)
@logged("post")
def test(a,b=1):
    print(a+b)
  
hello("world")
test(1,2)

Python中的反射应用:getattr(),setattr(),delattr(),hasattr()

getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattr Getattr用于返回一个对象属性,或者方法

Python sqlite3 模块 API及增删改查示例

SQLite3 可使用 sqlite3 模块与 Python 进行集成。sqlite3 模块是由 Gerhard Haring 编写的。它提供了一个与 PEP 249 描述的 DB-API 2.0 规范兼容的 SQL 接口。您不需要单独安装该模块,因为 Python 2.5.x 以上版本默认自带了该模块。 为了使用 sqlite3 模块,您首先必须创建一个表示数据库的连接对象,然后您可以有选择地创建光标对象,这将帮助您执行所有的 SQL 语句。

Python中MYSQLdb的基本用法:数据库增删改查

MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。

windows下载地址:https://sourceforge.net/projects/mysql-python/

Linux平台可以访问:https://pypi.python.org/pypi/MySQL-python 

以下给出基本示例:

#coding:utf-8
'''#cur.execute('SET NAMES utf8;')  #设置数据库客户端
   #cur.execute('SET CHARACTER SET utf8;')  
   #cur.execute('SET character_set_connection=utf8;')  
   
#简单创建数据表并写入数据   
data=["CREATE TABLE users (login varchar(8),userid INT)","INSERT INTO users VALUES('张三',1)","insert into users values('李四',2)","insert into users values('王五',3)"]
for item in data:
    cur.execute(item)
    
'''
import MySQLdb
conn = MySQLdb.Connection(host="localhost",db="test",user="root",passwd="root",charset="utf8")#链接数据库并设置编码
cur = conn.cursor()
# data=["CREATE TABLE users (login varchar(8),userid INT)","INSERT INTO users VALUES('张三',1)","insert into users values('李四',2)","insert into users values('王五',3)"]
# for item in data:
#     cur.execute(item)
result=cur.execute("select * from users")#返回值为查询的行数
data=cur.fetchall() #返回查询数据,元组类型
for item in data:
    print "%s\t%s" % item  #将查询结果格式化输出
    #print item[0].encode("utf-8")
cur.execute("update users set userid=4 where userid=1") #更新表
cur.execute("delete from users where userid= 4") #删除数据
#cur.execute("drop table users")#删除表

cur.close
conn.commit()
conn.close()

python(py2exe)打包成exe执行文件,vista/win7下icon图标不显示问题的解决方案

windows下,在对使用python的编写的程序进行打包时,常用的工具就是py2exe了,该工具只需要一些脚本就看实现将python程序打包成一个exe文件。并且该exe程序的执行不需要系统预先安装python环境。 ​其中icon_resources参数是我们要讨论的重点:
«78910111213141516»
搜索
网站分类
文章归档
最新留言
友情链接
捐助本站
Donate now!

技术支持TTF的家园

Copyright www.ttfde.org. All Rights Reserved.站点统计 Design by TTF的家园