python爬取网站数据保存使用的方法(精选9篇)
python爬取网站数据保存使用的方法 篇1
-12-12Python抓取Discuz!用户名脚本代码
-01-01使用cx_freeze把python打包exe示例
-12-12pymssql ntext字段调用问题解决方法
2014-06-06python实现的udp协议Server和Client代码实例
2013-02-02python创建只读属性对象的方法(ReadOnlyObject)
2014-06-06python网络编程学习笔记(三):socket网络服务器
2014-04-04python多线程抓取天涯帖子内容示例
-12-12python 多线程应用介绍
2013-02-02python中的一些类型转换函数小结
2014-01-01Python群发邮件实例代码
python爬取网站数据保存使用的方法 篇2
关键词:Session-Start;会话模型;访问日志;ASP.NET
中图分类号:TP393 文献标识码:A文章编号:1007-9599 (2011) 07-0000-03
To Achieve Site Access Log Records with Session-Start Method
Wu Mingshu
(Library,Academy of Equipment Command & Technology,Beijing101416,China)
Abstract:This paper briefly outlines the Global.asax file in ASP.NET Web site.From the four typical methods in Global.asax file compared,Session-Start method can be obtained on the Web site access records,so as to achieve the purpose of site visits statistics.In this paper,recording user IP access records taked as example,gives access logging database design and the complete code of Session_Start method for recording the user IP.Session-Start method was discussed under multi-user concurrent connection.Session-Start method relies on the user's session SessionID,because of the policy limits to the expired session,so user access in continuous time may be logged many times.But as a general statistical purposes,the log records do not need to accurately record data in each visit.According to the actual situation website access,session expiration policies can be adjusted to reducing the generation of duplicate records.
Keywords:Session-Start;Session Module;Site logging;ASP.NET
网站发布后往往需要统计网站的访问使用情况,通过每日、每周、每月等日志数据的报表,分析出网站运营现况,了解网站被哪些用户使用以及网站的哪些内容被用户关注。用户的操作包括浏览行为、检索行为和下载行为等,网站访问日志需要记录的内容以及对日志数据的挖掘深度依客户的需求有所不同。本文仅以网站访问日志记录用户端IP地址为例,介绍使用ASP.NET技术开发的网站下使用Application-Start事件处理函数实现记录网站访问日志的方法。
一、Global.asax及Session-Start方法
(一)Global.asax概述
在VS2005、VS2008和VS2010设计工具中都加入了全局控制文件Global.asax的选项。
创建Global.asax文件后会被ASP.NET编译为从Http Application类派生的类[1],然后使用该派生类表示应用程序。Global.asax文件驻留在ASP.NET应用程序的根目录中,默认的ASP.NET配置会自动拒绝对Global.asax文件的任何直接的URL请求,外部用户不能下载或查看其中的代码[1],确保了应用程序的安全性。Global.asax文件用来包含响应ASP.NET或HttpModule所引发的应用程序级别和会话级别事件的代码。
(二)选择事件方法
在ASP.NET应用程序的生命周期期间,响应应用程序和自定义模块引发事件的代码都会写在Global.asax文件中,仅应用程序级事件包括近二十个,他们的触发执行顺序不同,发挥的作用也不同,那么如何选取合适的事件触发用户访问日志的记录,下面选取典型的四个事件处理函数[2]进行比较进行取舍,这四个方法是常用的,在解决记录用户访问日志可能也会被考虑到。
1.Application-Start
在Http Application类的第一个实例被创建时,该事件处理函数被调用[2]。第一个访问该网站的用户会触发该方法,而当前正常运行状态下其他用户的请求并不会触发该方法。显然,这个方法不适用于记录用户的访问日志。
2.Init方法
在创建了所有模块之后,对Http Application类的每个实例都调用一次。每个用户请求页可能包含多个请求,对应处理请求的Http Application类的实例将不止一个,而Init方法会被执行多次,此方法也不能用来记录用户访问日志。
3.Application-BeginRequest方法
该方法在接收到一个应用程序请求时触发[3]。对于每一个请求来说,它是第一个被触发的事件,同时也意味着每个请求都会触发Application-Begin Request方法。同一个用户一段时间内的连续访问往往不止一个请求,那么在Application-Begin Request方法适用基于请求的日志记录,而不能实现无重复的用户记录访问日志。
4.Session-Start方法
Session-Start方法会在每个用户访问网站的第一个页面时触发。该方法是Global.asax文件中Session-State Module暴露出的Start事件的处理函数。Session-State Module模块是由ASP.NET提供用来在无状态的HTTP协议上实现基于会话的状态,会话状态将来自限定时间有效期内的同一浏览器的请求标识为一个会话,每一个用户第一次访问网站时将生成一个具有惟一标示符的会话,在有效期内该会话将持续保持。Session-Start方法只在用户首次请求是调用,会话有效期内的请求不会重复触发,该方法适用于记录用户的访问日志。本文采用在Session-Start方法中编写代码来实现记录用户的访问日志。会话状态下的处理流程如图1所示。
图1ASP.NET会话状态下会话处理流程图
二、访问日志的设计与实现
(一)访问日志记录的惟一标示符
每个用户访问站点的日志记录需要一个惟一标示符来区分。若仅以用户的IP地址作为标示符将不能统计同一IP地址下不同用户的访问记录,用户的IP地址不能作为日志记录的标示符。下面给出了如下两种方案。
1.GUID
GUID(Globally Unique Identifier),即全球唯一标识符,也称作UUID(Universally Unique IDentifier),是一个通过特定算法产生的二进制长度为128位的数字标识符[4],GUID在空间上和时间上具有唯一性,可以保证同一时间不同地方产生的数字不同。可以考虑每增加一条记录用一个惟一的GUID值标示。在ASP.NET中通过Guid类的静态方法NewGuid()可以初始生成一个新的Guid类实例。
2.Session ID
上面已经提到,每一个用户第一次访问网站时将生成一个具有惟一标示符的会话,这个标示符即会话Session ID值。该值是一个120位的字符串值,具有惟一性,类似GUID,那么可以采用该值作为区分用户访问日志记录的标示符,而不必再耗费服务器资源生成GUID来标示用户访问。ASP.NET中使用Session类实例的SessionID属性即可获取值。默认情况下,Session ID值存储在Cookie中。但也可以将应用程序配置为在无Cookie会话模式下URL中存储Session ID值。
ASP.NET会话状态支持多种会话数据的存储选项,可用的会话状态模式有In Proc模式、State Server模式、SQL Server模式、Custom模式和Off模式等5种。In Proc模式将会话状态存储在Web服务器上高速缓存的内存中,该模式是ASP.NET会话状态默认设置,是最快最常见的模型。本文采用ASP.NET会话状态In Proc存储模式和Session ID值存储在Cookie中的解决方案。
(二)日志数据库结构
本文仅以记录用户IP信息为统计内容,故日志数据库的结构由以下sql语句生成:
CREATE TABLE[dbo].[SiteLog](
[ID][bigint]IDENTITY(1,1)PRIMARY KEY,
[UserID][varchar](25)NOT NULL,
[ClientIp][nvarchar](30)NOT NULL,
[Time][datetime]NOT NULL
)
GO
每条日志记录的时间应该是用户首次访问网站记录下来的时间,由于日志会即时写入数据库,写入库的时间与实际访问时间相差无几,故这里把日志数据库中Site Log表中的Time字段设置默认值为GETDATE()函数。这样记录下用户访问信息后往日志数据库写数据时则不必再加入时间信息,方便了代码的实现。Time字段的默认值约束由以下SQL语句实现:
ALTER TABLE[dbo].[Site Log]ADDCONSTRAINT[DF-Site Log-Time]DEFAULT(GETDATE())FOR[Time]
(三)Session-start方法实现的代码
假定web.config中已设置日志数据库连接参数,首先通过ConfigurationManager类获取连接参数字符串;然后构造记录插入语句,用Session类的SessionID属性和Request类的UserHostAddress属性分别作为日志表中User ID字段和Client Ip字段的值;接下来就是构造SqlCommand类,执行该类实例的ExecuteNonQuery()即完成记录插入。下面是Session-Start方法中实现代码:
protected void Session_Start(object sender,EventArgse)
{
string strconn=ConfigurationManager.ConnectionStrings["AppConnectionString"].ConnectionString;
using(SqlConnection conn=new SqlConnection(strconn))
{
string sqlcmd=string.Format("INSERT INTO SiteLog(UserID,ClientIp)VALUES('{0}','{1}')",Session.SessionID,Request.UserHostAddress);
SqlCommand command=new SqlCommand(sqlcmd,conn);
conn.Open();
command.ExecuteNonQuery();
}
}
三、讨论与结论
一个网站往往可能会被不同的人同时在线浏览,那么在Session_Start方法中定义的日志记录代码是否会被并发触发呢?ASP.NET应用程序维护着一个Http Application对象池,Global.asax文件继承自Http Application类,在多用户并发的情况下会将对象池中的对象分配给应用程序,由于Http Application是线程级的,Global.asax文件中定义的Session-Start方法也会并发执行。本文通过在ASP.NET应用程序Global.asax文件中实现Session-Start方法,可以用来记录并发用户访问日志。
使用Session-Start方法也有一定的局限性,可能会记录到重复的不可靠的数据。Session-Start方法在用户第一次访问时触发,而第一次访问的判断依据是会话的Session ID,若用户的连续访问超过会话过期时间设置,将生成一个新的不同的Session ID,这样会造成日志的重复记录。当然,对于作为一般统计用途的日志记录,并不需要精确地记录每一条到访数据,可以根据网站实际访问停留情况对会话的过期策略进行相应的调整,减少重复记录的生成。
本文仅是对用户IP信息进行记录统计,在此基础上可以进一步扩展,增加统计项,实现更多统计功能。对于复杂的情况,像网站内子域或跨域访问的日志记录,仍可借助Session-Start方法,但需要另外考虑实现会话共享的技术。
参考文献:
[1]瞿杰.Jesse Liberty,Dan Hurwitz.Programming ASP.NET中文版[M].北京:电子工业出版社,2007,784
[2]李敏波,Bill Evjen,Scott Hanselman等.ASP.NET2.0高级编程(第4版)[M].北京:清华大学出版社,2006,79
[3]李敏波,Christian Nagel,Bill Evjen,Jay Glynn.C#高级编程(第4版)[M].北京:清华大学出版社,2006,846
[4]Guid结构[EB/OL].
python爬取网站数据保存使用的方法 篇3
fileno()方法返回所使用的底层实现,要求从操作系统I/O操作的整数文件描述符,
语法
以下是fileno()方法的语法:
fileObject.fileno();
参数
NA
返回值
此方法返回整数文件描述符,
例子
下面的例子显示fileno()方法的使用。
#!/usr/bin/python# Open a filefo = open(“foo.txt”, “wb”)print “Name of the file: ”, fo.namefid = fo.fileno()print “File Descriptor: ”, fid# Close opend filefo.close()
当我们运行上面的程序,它会产生以下结果:
python爬取网站数据保存使用的方法 篇4
decode()方法使用注册编码的编解码器的字符串进行解码,它默认为默认的字符串编码。
语法
以下是decode()方法的语法:
str.decode(encoding=‘UTF-8‘,errors=‘strict‘)
参数
encoding -- 这是所使用的编码。对于所有的编码方案的列表,请访问:标准编码库
errors -- 这可能是给定一个不同的错误处理机制。默认的错误是“严格”,即编码错误提出UnicodeError。其他可能的值是ignore‘, ‘replace‘, ‘xmlcharrefreplace‘, ‘backslashreplace‘ 并通过codecs.register_error().注册的任何其他名称,
返回值
此方法返回的字符串的解码版本。
例子
下面的例子显示了decode()方法的使用。
#!/usr/bin/pythonstr = “this is string example....wow!!!”;str = str.encode(‘base64‘,‘strict‘);print “Encoded String: ” + str;print “Decoded String: ” + str.decode(‘base64‘,‘strict‘)
当我们运行上面的程序,它会产生以下结果:
python爬取网站数据保存使用的方法 篇5
这篇文章主要介绍了详解Python中列表和元祖的使用方法,代码基于Python2.x版本,元祖和列表是Python学习当中的基础知识,需要的朋友可以参考下
list
Python内置的一种数据类型是列表:list,list是一种有序的集合,可以随时添加和删除其中的元素。
比如,列出班里所有同学的名字,就可以用一个list表示:
>>>classmates = [‘Michael‘, ‘Bob‘, ‘Tracy‘]>>>classmates[‘Michael‘, ‘Bob‘, ‘Tracy‘]
变量classmates就是一个list。用len函数可以获得list元素的个数:
>>>len(classmates)3
用索引来访问list中每一个位置的元素,记得索引是从0开始的:
>>>classmates[0]‘Michael‘>>>classmates[1]‘Bob‘>>>classmates[2]‘Tracy‘>>>classmates[3]Traceback (most recent call last): File “ 当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界,记得最后一个元素的索引是len(classmates) - 1。 如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素: >>>classmates[-1]‘Tracy‘ 以此类推,可以获取倒数第2个、倒数第3个: >>>classmates[-2]‘Bob‘>>>classmates[-3]‘Michael‘>>>classmates[-4]Traceback (most recent call last): File “ 当然,倒数第4个就越界了。 list是一个可变的有序表,所以,可以往list中追加元素到末尾: >>>classmates.append(‘Adam‘)>>>classmates[‘Michael‘, ‘Bob‘, ‘Tracy‘, ‘Adam‘] 也可以把元素插入到指定的位置,比如索引号为1的位置: >>>classmates.insert(1, ‘Jack‘)>>>classmates[‘Michael‘, ‘Jack‘, ‘Bob‘, ‘Tracy‘, ‘Adam‘] 要删除list末尾的元素,用pop()方法: >>>classmates.pop()‘Adam‘>>>classmates[‘Michael‘, ‘Jack‘, ‘Bob‘, ‘Tracy‘] 要删除指定位置的元素,用pop(i)方法,其中i是索引位置: >>>classmates.pop(1)‘Jack‘>>>classmates[‘Michael‘, ‘Bob‘, ‘Tracy‘] 要把某个元素替换成别的元素,可以直接赋值给对应的索引位置: >>>classmates[1] = ‘Sarah‘>>>classmates[‘Michael‘, ‘Sarah‘, ‘Tracy‘] list里面的元素的数据类型也可以不同,比如: >>>L = [‘Apple‘, 123, True] list元素也可以是另一个list,比如: >>>s = [‘python‘, ‘java‘, [‘asp‘, ‘php‘], ‘scheme‘]>>>len(s)4 要注意s只有4个元素,其中s[2]又是一个list,如果拆开写就更容易理解了: >>>p = [‘asp‘, ‘php‘]>>>s = [‘python‘, ‘java‘, p, ‘scheme‘] 要拿到‘php‘可以写p[1]或者s[2][1],因此s可以看成是一个二维数组,类似的还有三维、四维……数组,不过很少用到, 如果一个list中一个元素也没有,就是一个空的list,它的长度为0: >>>L = []>>>len(L)0 tuple 另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字: >>>classmates = (‘Michael‘, ‘Bob‘, ‘Tracy‘) 现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0],classmates[-1],但不能赋值成另外的元素。 不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。 tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如: >>>t = (1, 2)>>>t(1, 2) 如果要定义一个空的tuple,可以写成(): >>>t = ()>>>t() 但是,要定义一个只有1个元素的tuple,如果你这么定义: >>>t = (1)>>>t1 定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。 所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义: >>>t = (1,)>>>t(1,) Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。 最后来看一个“可变的”tuple: >>>t = (‘a‘, ‘b‘, [‘A‘, ‘B‘])>>>t[2][0] = ‘X‘>>>t[2][1] = ‘Y‘>>>t(‘a‘, ‘b‘, [‘X‘, ‘Y‘]) 这个tuple定义的时候有3个元素,分别是‘a‘,‘b‘和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了? 别急,我们先看看定义的时候tuple包含的3个元素: 当我们把list的元素‘A‘和‘B‘修改为‘X‘和‘Y‘后,tuple变为: 表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。即指向‘a‘,就不能改成指向‘b‘,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的! 理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。 小结 setdefault()方法类似于get()方法,但会设置字典[键]=默认情况下,如果键不是已经在字典中, 方法 以下是setdefault()方法的语法: dict.setdefault(key, default=None) 参数 key -- 这是要被搜索的键 default -- 这是没有找到键的情况下返回的值, 返回值 此方法返回字典可用的键值,如果给定键不可用,则它会返回所提供的默认值。 例子 下面的例子显示了setdefault()方法的使用。 #!/usr/bin/pythondict = {‘Name‘: ‘Zara‘, ‘Age‘: 7}print “Value : %s” % dict.setdefault(‘Age‘, None)print “Value : %s” % dict.setdefault(‘Sex‘, None) 当我们运行上面的程序,它会产生以下结果: reverse()方法代替逆转列表对象, 语法 以下是reverse()方法的语法: list.reverse() 参数 NA 返回值 此方法不返回任何值,但反转列表中的给定对象, 例子 下面的例子显示了reverse()方法的使用。 #!/usr/bin/pythonaList = [136, ‘xyz‘, ‘zara‘, ‘abc‘, ‘xyz‘,‘hema‘];aList.reverse();print “List : ”, aList; 当我们运行上面的程序,它会产生以下结果: List : [‘hema‘,‘xyz‘, ‘abc‘, ‘zara‘, ‘xyz‘, 126] ★ python使用sorted函数对列表进行排序的方法 ★ 在Python中操作文件之seek方法的使用教程 ★ 简单介绍Python中的readline方法的使用 ★ 在Word 表格中对数据进行排序 ★ python选择排序算法实例总结 ★ Python编程中用close方法关闭文件的教程 ★ 金山毒霸 SP5使用教程 ★ 使用控制面板中的“桌面主题”方法 ★ python中的实例方法、静态方法、类方法、类变量和实例变量浅析 endswith()方法返回true,如果字符串以指定后缀结尾,否则返回(False可选限制的匹配从给定的索引开始和结束), 语法 以下是endswith()方法的语法: str.endswith(suffix[, start[, end]]) 参数 suffix -- 这可能是一个字符串或者是元组用于查找后缀。 start -- 切片从此开始 end -- 切片到此为止 返回值 如果字符串以指定的后缀结束此方法返回true,否则返回false, 例子 下面的例子显示了endswith()方法的使用。 #!/usr/bin/pythonstr = “this is string example....wow!!!”;suffix = “wow!!!”;print str.endswith(suffix);print str.endswith(suffix,20);suffix = “is”;print str.endswith(suffix, 2, 4);print str.endswith(suffix, 2, 6); 当我们运行上面的程序,它会产生以下结果: 2.电池平时使用和充电:建议您在使用电源适配器时不要取下电池,以免突然断电造成硬件损坏和数据丢失。三星笔记本电脑内部有充电保护电路,电池充满后会马上切断供应到电池的电力,因此不会电池过充的情况。 3.如果您长时间不使用电池,建议您将电池放置在干燥通风处进行保存,电池的最佳保存温度是10~30摄氏度,电池建议每月至少进行一次充放电,充放电后再充电到50%左右取下保存即可, 4.若笔记本为内置电池,无法拆卸,建议将电池设置为电池寿命延长器模式,设置方法如下: 1)打开随机软件Easy Settings 常规选项下—电池寿命延长器将其开启,电池电量只能充到80%,之后将会自动停止充电。 2)开机出现sansung时按F2键进入BIOS设置,找到Advanced菜单—Battery Life Cycle Extension开启其状态,F10键保存退出,打开电池寿命延长器。 5.目前新型号的内置电池笔记本已经无需手动设置电池寿命延长器模式,若您的内置电池笔记本并没有以上两种设置方法,则无需设置,电池已经自带此功能,正常使用即可。 【python爬取网站数据保存使用的方法】推荐阅读: python采集百度百科的方法08-01 python运动数据分析10-10 Python实现动态添加类的属性或成员函数的解决方法06-09 Python编程07-15 Python脚本06-13 Python语言06-26 Python技术08-27 python语法汇总08-03 python基础总结09-11python爬取网站数据保存使用的方法 篇6
python爬取网站数据保存使用的方法 篇7
python爬取网站数据保存使用的方法 篇8
python爬取网站数据保存使用的方法 篇9