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

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参数是我们要讨论的重点:

Tkinter布局方法大全

 所有的Tkinter组件都包含专用的几何管理方法,这些方法是用来组织和管理整个父配件区中子配件的布局的。Tkinter提供了截然不同的三种几何管理类:pack、grid和place。 pack()   pack几何管理采用块的方式组织配件,在快速生成界面设计中广泛采用,若干组件简单的布局,采用pack的代码量最少。pack几何管理程序根据组件创建生成的顺序将组件添加到父组件中去。通过设置相同的锚点(anchor)可以将一组配件紧挨一个地方放置,如果不指定任何选项,默认在父窗体中自顶向下添加组件。  

Python中对类对象中成员函数进行多线程操作

最近写了一个批量下载网页图片的类,针对类中函数如何进行多线程操作:直接给出代码

import urllib2
import re
import time
import threading
class DownPic:
    def __init__(self):        
         self.user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'          
         self.headers = { 'User-Agent' : self.user_agent }   
    def geturls(self,url):
        try:
          request = urllib2.Request(url,headers = self.headers) 
          fp=urllib2.urlopen(request)  #异常处理,打开url
        except:
          print 'cannot open the URL'
        s=fp.read() #读取资源
        pattern=re.compile(r'(src=.+\.?jpg)|(src=.+\.?gif)|(src=.+\.?png)')#正则编译对象,匹配图片url
        urlss=pattern.findall(s) #匹配符合正则的存成list
        #print urlss
        urls=[]
        for items in urlss: 
            for item in items:
                if(item !=''):
                   urls.append(item)
        fp.close()
        return urls
    def saveimgs(self,url,filepath):
         urls=self.geturls(url)
         cnt=1
         for item in urls:
              if("http" in item):
                  item=item[5:]
              else:
                  item=url+item[5:]
              print item
              extendname=item[-4:]
              flock=threading.Lock()
              flock.acquire()
              try:
                  fp0=urllib2.urlopen(item)  
                  s0=fp0.read()
              except:
                  print '异常图片地址:'+ item
              filename=filepath+'\\'+str(cnt) + extendname#'\\'用到了转义字符
              op0=open(filename,'wb') #以二进制写方式打开文件
              op0.write(s0)#写入二进制图片信息
              fp0.close()
              op0.close()
              cnt=cnt+1
              flock.release()
         return 1  #如果保存成功返回1
    def thst(self,url,filepath):
        l=[]
        for i in  xrange(0,10):

            th1=threading.Thread(target=DownPic.saveimgs,args=(self,url,filepath))
            l.append(th1)
        for j in l:
            
           j.start()
        for k in l:
            
          
            k.join()
                   
 
if __name__ == "__main__":   
    print "程序执行开始时间:%s",time.ctime()
    pics=DownPic()
    pics.thst("http://news.baidu.com/", r"c:\123")
#     rest=pics.saveimgs("http://news.baidu.com/", r"c:\123")
#     if (rest ==1):
#         print "下载完成!"
    print "程序执行结束时间:%s",time.ctime()

Python中多线程及程序锁浅析

Python中多线程使用到Threading模块。Threading模块中用到的主要的类是Thread,我们先来写一个简单的多线程代码:

# coding : uft-8
 __author__ = 'Phtih0n'
 import threading
 
class MyThread(threading.Thread):
     def __init__(self):
         threading.Thread.__init__(self)
 
    def run(self):
         global n
         print n
         n += 1
 
if "__main__" == __name__:
     n = 0
     ThreadList = []
     for i in range(0, 10):
         t = MyThread()
         ThreadList.append(t)
     for t in ThreadList:
         t.start()
     for t in ThreadList:
         t.join

最普通的一个多线程小例子。我一笔带过地讲一讲,我创建了一个继承Thread类的子类MyThread,作为我们的线程启动类。按照规定,重写Thread的run方法,我们的线程启动起来后会自动调用该方法。于是我首先创建了10个线程,并将其加入列表中。再使用一个for循环,开启每个线程。在使用一个for循环,调用join方法等待所有线程结束才退出主线程。

Jquery高亮当前选中菜单,导航菜单点击切换选中时高亮状态

功能需求:
写一个站点需要用到在导航菜单点击链接跳转到新页面后,高亮当前菜单样式。
简单的说,就是我点击导航菜单中的一个栏目,跳转到该栏目下,该栏目菜单也同时高亮(可以是背景色也可以是背景图片)

解决方法:
通过查看实例,我们需要用到JS中的jquery来实现这种效果,也可以通过CSS设置不同页面的a:hover实现效果,不过这显然是比较笨拙的方法。
那么,如何用JS来实现效果呢,实现它所用的原理就是通过js中的location.href得到当前页面的地址,然后在与导航上的链接地址匹对,相同的就用一个css样式标记。此方法支持动态链接和静态链接多种形式。
效果图:

«78910111213141516»
搜索
网站分类
文章归档
最新留言
友情链接
捐助本站
Donate now!

技术支持TTF的家园

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