python爬虫功能介绍,python怎么爬虫

  python爬虫功能介绍,python怎么爬虫

  Python技术-基础篇-内置模块datetime和collections的技术博客_mb5c9304c35413c _博客

  1 .日期时间

  Datetime是Python处理日期和时间的标准库。

  获取当前日期和时间让我们先看看如何获取当前日期和时间:

  从日期时间导入日期时间

  Now=datetime.now() #获取当前日期时间

  打印(现在)

  2015-05-18 16:28:07.198690

  Print(type(now))注意到datetime是一个模块,datetime模块还包含一个datetime类,是通过从datetime导入DateTime来导入的。

  如果只导入导入日期时间,则必须引用全名datetime.datetime。

  Datetime.now()返回当前日期和时间,其类型为Datetime。

  获取日期和时间。为了指定日期和时间,我们直接用参数构造日期时间:

  从日期时间导入日期时间

  dt=datetime(2015年4月19日、12月20日)#使用指定的日期和时间创建DateTime

  打印(dt)

  2015-04-19 12:20:00datetime转换为时间戳。在计算机中,时间实际上是用数字来表示的。我们把1970年1月1日的时间称为00: 00:00:00 UTC,00:00时区epoch time,记为0(1970年之前的时间为负)。当前时间是相对于纪元时间的秒数,称为时间戳。

  你可以想:

  timestamp=0=1970-1-1 00: 00:00 UTC北京时间0:00是:

  Timestamp=0=1970-1-1 08:00:00 UTC 8:00可以看出,timestamp的值与时区无关,因为时间戳一旦确定,其UTC时间就确定了,转换成任何时区的时间也就完全确定了。这就是为什么存储在计算机中的当前时间是用时间戳来表示的,因为世界各地计算机的时间戳在任何时刻都是完全相同的(假设时间

  要将日期时间类型转换为时间戳,只需调用timestamp()方法:

  从日期时间导入日期时间

  dt=datetime(2015年4月19日、12月20日)#使用指定的日期和时间创建DateTime

  Dt.timestamp() #将日期时间转换为时间戳

  129417200.0注意Python的时间戳是浮点数,整数位代表秒。

  一些编程语言(如Java和JavaScript)的Timestamp用整数来表示毫秒。在这种情况下,只需要将timestamp除以1000就可以得到Python的浮点表示。

  若要将timestamp转换为datetime,请使用datetime提供的fromtimestamp()方法:

  从日期时间导入日期时间

  t=1429417200.0

  print(datetime.fromtimestamp(t))

  2015-04-19 12:20:00注意到时间戳是浮点数,没有时区的概念,而datetime是时区。上述转换是在时间戳和本地时间中执行的。

  本地时间是指当前操作系统设置的时区。例如,如果北京时区是东8区,则当地时间:

  2015-04-19 12:20:00实际上是8: 00 UTC时区的时间:

  2015-04-19 12:20:00 UTC 8:00而此时的格林威治时间与北京时间相差8小时,即UTC 0:00时区的时间应该是:

  2015-04-19 04: 20: 00 UTC 0: 00时间戳也可以直接换算成UTC标准时区的时间:

  从日期时间导入日期时间

  t=1429417200.0

  print(datetime . fromtimestamp(t))#本地时间

  2015-04-19 12:20:00

  print(datetime . utcfromtimestamp(t))# UTC时间

  2015-04-19 04:20:00str被转换为日期时间。很多时候,用户输入的日期和时间是字符串。要处理日期和时间,str必须首先转换为datetime。转换方法由datetime.strptime()实现,它需要日期和时间的格式化字符串:

  从日期时间导入日期时间

  cday=datetime . strptime( 2015-6-1 18:19:59 , %Y-%m-%d %H:%M:%S )

  打印(cday)

  2015-06-01 18:19:59字符串“%Y-%m-%d %H:%M:%S”指定日期和时间部分的格式。详细说明请参考Python文档。

  请注意,转换后的datetime没有时区信息。

  将日期时间转换为字符串如果您已经有一个日期时间对象,要将其格式化为字符串并显示给用户,您需要将其转换为字符串。转换方法由strftime()实现,它也需要一个日期和时间的格式化字符串:

  从日期时间导入日期时间

  now=datetime.now()

  print(now.strftime(%a,%b %d %H:%M ))

  5月5日星期一16:28日期时间加减实际上是向前或向后计算日期时间以获得新的日期时间。您可以直接使用and运算符进行加法和减法运算,但是您需要导入timedelta类:

  从日期时间导入日期时间,时间增量

  now=datetime.now()

  现在

  日期时间.日期时间(2015,5,18,16,57,3,540997)

  现在时间增量(小时=10)

  日期时间.日期时间(2015,5,19,2,57,3,540997)

  现在时间增量(天数=1)

  日期时间.日期时间(2015,5,17,16,57,3,540997)

  现在时间增量(天数=2,小时数=12)

  日期时间。可以看到日期时间(2015,5,21,4,57,3,540997)。使用timedelta可以很容易地计算出第一天和最后一天的时刻。

  将本地时间转换为UTC时间。本地时间是指系统设置的时间。例如,北京时间是UTC 8:00时区的时间,而UTC时间是指UTC 0:00时区。

  datetime类型具有时区属性tzinfo,但默认值为None,因此无法判断该datetime是哪个时区,除非为datetime强制设置了时区:

  从日期时间导入日期时间,时间增量,时区

  tz _ UTC _ 8=time zone(time delta(hours=8))#创建时区UTC 8:00。

  now=datetime.now()

  现在

  日期时间.日期时间(2015,5,18,17,2,10,871012)

  dt=now . replace(tz info=tz _ UTC _ 8)#被强制设置为8: 00 UTC。

  震颤性精神错乱(Delirium Tremens的缩写)

  日期时间。DateTime (2015,5,18,17,2,10,871012,TZINFO=DateTime。时区(日期时间。TimeDelta (0,28800)))如果系统时区恰好是UTC 8:00,那么上面的代码是正确的;否则,不能设置为UTC 8:00。

  时区转换我们可以先通过utcnow()获取当前的UTC时间,然后转换成任意时区:

  #获取UTC时间并强制时区为0: 00 UTC 0:00

  utc_dt=datetime.utcnow()。replace(tzinfo=timezone.utc)

  打印(utc_dt)

  2015-05-18 09:05:12.377316 00:00

  # astimezone()会将时区转换为北京时间:

  bj _ dt=utc _ dt . astimezone(time zone(time delta(hours=8)))

  打印(北京_dt)

  2015-05-18 17:05:12.377316 08:00

  # astimezone()会将时区转换为东京时间:

  Tokyo _ dt=utc _ dt . astimezone(time zone(time delta(hours=9)))

  打印(东京)

  2015-05-18 18:05:12.377316 09:00

  # astimezone()将bj_dt转换为东京时间:

  Tokyo _ dt2=bj _ dt . astimezone(time zone(time delta(hours=9)))

  打印(东京_dt2)

  2015-05-18 18:05:12.377316 09:00时区转换的关键是,当你得到一个datetime时,你要知道它的正确时区,然后强制将时区设置为参考时间。

  对于带时区的datetime,可以使用astimezone()方法转换为任何时区。

  注意:没有必要从UTC 0:00时区转换到其他时区。任何带时区的datetime都可以正确转换,比如上面提到的bj_dt到tokyo_dt的转换。

  总结datetime表示的时间需要时区信息来确定具体时间,否则只能视为当地时间。

  如果要存储datetime,最好的方法是转换成timestamp再存储,因为timestamp的值与时区无关。

  2 .收藏

  Collections是Python内置的一个集合模块,它提供了许多有用的集合类。

  我们知道元组可以表示一个不变集。例如,一个点的二维坐标可以表示为:

  P=(1,2)但是,看到(1,2),很难看出这个元组是用来表示一个坐标的。

  定义一个阶层又是小题大做。这时,namedtuple就派上用场了:

  从集合导入命名元组

  Point=namedtuple(Point ,[x , y])

  p=点(1,2)

  p.x

  一个

  p.y

  NamedTuple是一个函数,用来创建自定义的Tuple对象,指定元组元素的个数,可以通过属性而不是索引来引用元组的一个元素。

  这样,我们就可以很容易地用namedtuple定义一个数据类型,它具有元组的不变性,可以根据属性引用,使用起来非常方便。

  您可以验证创建的点对象是元组的子类:

  isinstance(p,点)

  真实的

  isinstance(p,元组)

  同样,如果要用坐标和半径来表示圆,也可以用namedtuple来定义它:

  # namedtuple (name ,[属性列表]):

  Circle=NamedTuple (circle ,[x , y , r])当Deque使用list存储数据时,按索引访问元素的速度很快,但插入和删除元素的速度很慢,因为list是线性存储,当数据量很大时,插入和删除效率很低。

  Deque是一个高效插入和删除的双向列表,适用于队列和堆栈:

  从集合导入队列

  q=deque([a , b , c])

  q.append(x )

  q.appendleft(y )

  q

  dequee([ y , a , b , c , x ])dequee不仅实现了list的append()和pop(),还支持appendleft()和popleft(),这样你就可以非常高效地在头中添加或删除元素。

  defaultdict使用dict时,如果引用的键不存在,就会抛出一个KeyError。如果想要在键不存在时返回默认值,可以使用defaultdict:

  从集合导入默认字典

  dd=defaultdict(lambda:不适用)

  dd[key1]=abc

  Dd[key1] # key1存在

   abc

  Dd[key2] # key2不存在,返回默认值。

  “N/A”注意,默认值是通过调用函数返回的,该函数是在创建defaultdict对象时传入的。

  除了键不存在时返回默认值,defaultdict的其他行为和dict完全一样。

  OrderedDict当使用Dict时,键是无序的。迭代dict时,我们无法确定键的顺序。

  如果希望保持键的顺序,可以使用OrderedDict:

  从集合导入订单直接

  d=字典([(a ,1),( b ,2),( c ,3)])

  d # dict的键有问题

  {a: 1, c: 3, b: 2}

  od=OrderedDict([(a ,1),( b ,2),( c ,3)])

  od # OrderedDict的关键字已排序

  OrderedDict ([(a ,1),( b ,2),( c ,3)])注意,OrderedDict的键是按插入顺序排序的,而不是按键本身排序的:

  od=OrderedDict()

  od[z]=1

  od[y]=2

  od[x]=3

  List(od.keys()) #按插入键的顺序返回

  [z , y , x] Ordereddict可以实现FIFO(先进先出)字典。当容量超过限制时,最早添加的密钥将首先被删除:

  从集合导入订单直接

  LastUpdatedOrderedDict类(OrderedDict):

  def __init__(self,capacity):

  super(LastUpdatedOrderedDict,self)。__init__()

  自我。_容量=容量

  def __setitem__(self,key,value):

  如果Key在self else 0中,则containsKey=1

  if len(self) - containsKey=self。_容量:

  last=self.popitem(last=False)

  打印(删除:,最后一个)

  如果包含密钥:

  del self[key]

  print(set:,(key,value))

  否则:

  打印(添加:,(键,值))

  有序字典。_ _ setitem _ _ (self,key,value) Chainmap Chainmap可以把一组字典串在一起,形成一个逻辑字典。ChainMap本身也是一个dict,但是搜索的时候会在内部的dict中按顺序搜索。

  什么时候使用ChainMap最好?例如,应用程序经常需要传入参数。参数可以通过命令行、环境变量或默认参数传入。我们可以使用ChainMap来查找参数的优先级,即先检查命令行参数,如果没有传入则检查环境变量,如果没有传入则使用默认参数。

  下面的代码演示了如何查找参数user和color:

  从集合导入链图

  导入操作系统,argparse

  #构造默认参数:

  默认值={

  颜色:红色,

  用户:来宾

  }

  #构造命令行参数:

  parser=argparse。ArgumentParser()

  parser.add_argument(-u ,- user )

  parser.add_argument(-c ,- color )

  namespace=parser.parse_args()

  command_line_args={ k: v for k,v in vars(命名空间)。items() if v }

  #组合成链图:

  combined=chain map(command _ line _ args,os.environ,默认值)

  #打印参数:

  打印( color=%s % combined[color])

  当print( user=% s % combined[ user ])没有参数时,将打印出默认参数:

  $ python3 use_chainmap.py

  颜色=红色

  User=guest传入命令行参数时,首选命令行参数:

  $ python3 use_chainmap.py -u bob

  颜色=红色

  User=bob同时传入命令行参数和环境变量,命令行参数具有更高的优先级:

  $ user=admin color=green python 3 use _ chain map . py-u bob

  颜色=绿色

  User=bobCounter Counter是一个简单的计数器,例如,计算出现的字符数:

  从集合导入计数器

  c=计数器()

  对于“编程”中的ch:

  .c[ch]=c[ch] 1

  .

  c

  计数器({g: 2, m: 2, r: 2, a: 1, i: 1, o: 1, n: 1, p: 1})

  C.update(hello) #也可以更新一次。

  c

  计数器({R: 2, O: 2, G: 2, M: 2, L: 2, P: 1, A: 1, I: 1, N: 1, H: 1,1

  摘要集合模块提供了一些有用的集合类,可以根据需要进行选择。

  转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: