python——爬虫学习day(3)

之前想着学习爬虫方面的知识,所以在一开始的时候学习做了一个小程序,提取新闻网站的新闻标题。现在要从头开始,学一点基础。以下内容是根据《Python爬虫开发与项目实战》一书学习整理的,如果内容涉及到侵权等问题,请联系本人删稿。

如果内容知识点有问题,也请联系本人,及时改正。

一、文件的读写

      1、 读:with open ('e:\text\test.txt','r') as f:

                   print (f.read())              #采用这种方式打开文件十位了防止读取文件过程中出错,而不能进行f.close()

                   #读取一行内容:readline()

                  #读取所有内容并按行返回列表:readlines()

              #将上述代码进行改进:

              with open(''e:\text\test.txt','r'') as f:

                   for line in f.readlines():

                       print (line.strip())

        写:with open ('e:\text\test.txt','w') as fw:

                    f.write('text')

    2、在python中对文件和目录的操作经常用到os模块和shuti模块,下面整理一些操作文件和目录的常用方法:

》》》os.getcwd(): 获得当前python脚本工作的目录路径

》》》os.listdir():返回指定目录下的所有文件和目录名

》》》os.remove(filepath):删除一个文件

》》》os.removedirs(filepath):删除多个空目录

》》》os.path.isfile(filepath):检验给出的路径是否是一个文件

》》》os.path.isdir(filepath):检验给出的路径是否是一个目录

》》》os.path.isabs():判断是否是绝对路径

》》》os.path.exists():检验路径是否存在

》》》os.path.split():分离一个路径的目录名和文件名,例:os.path.split('e:\text\test.txt'),返回结果是一个元组:('e:\text','test.txt')

》》》os.path.splitext():分离扩展名,例:os.path.splitext('e:\text\test.txt'),返回结果是一个元组:('e:\text\test','.txt')

》》》os.path.dirname(filename):获取路径名

》》》os.pathbasename(filename):获取文件名

》》》os.getenv()   os.putenv():读取和设置环境变量

》》》os.linesep():给出当前平台使用的终止符,win----‘\r\n’,  Linux-----'\n'     Mac------'\r'

》》》os.name():指示当前使用的平台

》》》os.rename(old,new):重命名文件和目录

》》》os.makedirs('d:\python\test'):创建多级目录

》》》os.mkdir('test'):创建单个目录

》》》os.stat(file):获取文件属性

》》》os.chmod(file):修改文件权限与时间戳

》》》os.path.getsize(filename):获取文件大小

》》》shutil.copytree('olddir','newdir'):复制文件夹,olddir和newdir都只能是目录,并且newdir必须不存在

》》》shutil.copyfile('oldfile','newfile'):复制文件,olddir和newdir都只能是文件

》》》shutil.copy('oldfile','newfile'):复制文件,oldfile只能是文件,newfile可以是文件也可以是目标目录

》》》shutil.move('oldpod','newpos'):移动文件(目录)

》》》os.rmdir('dir'):删除目录,只能删除空目录

》》》shutil.rmtree('dir'):删除目录,空目录,有内容的目录都可以删除

二、系列化操作

程序在运行时,所有的变量都是在内存中,例如在程序中声明一个dict对象,里面存储着爬取的页面的链接,页面的标题,页面的摘要等信息。

d = dict(url = 'index.html',title = '首页',content = '首页')

在程序的运行过程中,爬取的页面的链接会不断变化,比如把url改成了second.html,但是程序一结束或意外中断,程序中的内存变量都会被操作系统进行回收。如果没有吧修改过的url存储起来,下次运行程序的时候,url被初始化为index.html,又是从首页开始,这是不愿看到的,所以把内存中的变量变成可存储或可传输的过程,就是序列化。将内存中的变量序列化之后,可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上,实现程序状态的保存与共享。反过来,把变量内容从序列化的对象重新读取到内存,称为反序列化。

在python中提供了俩个模块:cPickle和pickle来实现序列化,前者是由c语言编写的,效率比后者高很多,但是俩个模块的功能是一样的。一般是先导入cPickle模块,如果此模块不存在,在导入pickle模块。示例:

try:

    import cPickle as pickle:

except ImportError:

    import pickle

pickle实现序列化主要使用的是dumps方法或dump方法。dumps方法可以将任意对象序列化成一个str,然后可以将这个str写入文件进行保存。示例:

d = dict(url = 'index.html',title = '首页',content = '首页')

pickle.dumps(d)

如果使用dump方法,可以将序列化后的对象直接写入文件中:

with open(r"dump.txt","wb+") as f:
    pickle.dump(d,f)

pickle实现序列化使用的是loads方法或load方法。把序列化后的文件从磁盘上读取为一个str,然后使用loads方法将这个str反序列化为对象,或者直接使用load方法将文件直接反序列化为对象:

with open('json.pkl', 'rb') as f:
    aa = pickle.load(f)
    print(aa)

通过反序列化,存储为文件的dict对象,又重新恢复出来,但是这个变量和原变量没有什么关系,只是内容一样。

三、进程和线程

提高爬虫的效率和打造分布式爬虫,都离不开进程和线程。

1、多进程

      python实现多进程的方式主要有俩种,一种是使用os模块中的fork方法,一种是使用multiprocessing模块。这俩种方式的区别在于前者仅适用于Unix/Linux操作系统,对windows不支持,后者则是跨平台的实现方法。

a、使用os模块中的fork方法实现多进程

      Python的os模块封装了常见的系统调用,其中就有fork方法。fork方法来自于Unix/Linux操作系统中提供的fork系统调用,调用一次,返回俩次。分别为子进程和父进程。子进程永远返回0,父进程中返回的是子进程的ID。

b、使用multiprocessing模块创建多进程

multiprocessing模块提供了一个Process类描述一个进程对象。创建子进程时,只需要传入一个执行函数和函数的参数,即可完成一个Process实例的创建,用start()方法启动进程,用join()方法实现进程的同步。

#coding=utf-8

import os
from multiprocessing import Process

#子进程要执行的代码
def run_proc(name):
    print ('child process %s (%s) Running....' %  (name,os.getpid()))

if __name__ == '__main__':
    print ('Parent process %s.' % os.getpid())
    for i in range(5):
        p = Process(target = run_proc,args=(str(i),))
        print ('Process eill start')
        p.start()
    p.join()
    print ('Process end')

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值