Python之pip安装,数值运算,爬虫实践_第1页
Python之pip安装,数值运算,爬虫实践_第2页
Python之pip安装,数值运算,爬虫实践_第3页
Python之pip安装,数值运算,爬虫实践_第4页
Python之pip安装,数值运算,爬虫实践_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Pip 安装模块包下载.whl包先pip install wheel之后pip install 包名字.whl 即可安装某模块包E.g. C:Python34Scriptspip install F:课程PyOpenGL-3.1.1-cp34-cp34m-win32.whlpython常见模块命令(os/sys/platform)一、Os Python的标准库中的os模块主要涉及普遍的操作系统功能。os.sep 可以取代操作系统特定的路径分割符。 字符串指示你正在使用的平台。比如对于Windows,它是nt。os.getcwd()函数得到当前工作目录,即当前Python脚本工作的

2、目录路径。 os.getenv()和os.putenv()函数分别用来读取和设置环境变量。 os.listdir()返回指定目录下的所有文件和目录名。 os.remove()函数用来删除一个文件。 os.system()函数用来运行shell命令。os.linesep字符串给出当前平台使用的行终止符。例如,Windows使用rn。os.path.split()函数返回一个路径的目录名和文件名。os.path.isfile()和os.path.isdir()函数分别检验给出的路径是一个文件还是目录。os.path.existe()函数用来检验给出的路径是否真地存在os.listdir(dirna

3、me):列出dirname下的目录和文件os.getcwd():获得当前工作目录os.curdir:返回但前目录(.)os.chdir(dirname):改变工作目录到dirnameos.path.isdir(name):判断name是不是一个目录,name不是目录就返回falseos.path.isfile(name):判断name是不是一个文件,不存在name也返回falseos.path.exists(name):判断是否存在文件或目录nameos.path.getsize(name):获得文件大小,如果name是目录返回0Los.path.abspath(name):获得绝对路径os.

4、path.normpath(path):规范path字符串形式os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)os.path.splitext():分离文件名与扩展名os.path.join(path,name):连接目录与文件名或目录os.path.basename(path):返回文件名os.path.dirname(path):返回文件路径二、Syssys.argv: 实现从程序外部向程序传递参数。sys.exit(arg): 程序中间的退出,arg=0为正常退出。sys.get

5、defaultencoding(): 获取系统当前编码,一般默认为ascii。sys.setdefaultencoding(): 设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行 setdefaultencoding(utf8),此时将系统默认编码设置为utf8。(见设置系统默认编码 )sys.getfilesystemencoding(): 获取文件系统使用编码方式,Windows下返回mbcs,mac下返回utf-8.sys.path: 获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程

6、序中import时正确找到。sys.platform: 获取当前系统平台。sys.stdin,sys.stdout,sys.stderr stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们三、Paltformplatform.system() 获取操作系统类型,windows、linux等platform.platform() 获取操作系统,Darwin-9.8.0

7、-i386-32bitplatform.version() 获取系统版本信息 6.2.0platform.mac_ver()platform.win32_ver() (post2008Server, 6.2.9200, , uMultiprocessor Free)Summarize基本的爬虫工作原理简单爬虫设计入门库: 下载网页:urllib,Requests 解析网页:BeautifulSoup 模拟交互,处理JS动态网页:Selenium高级爬虫框架Scrapy分布式爬虫设计分布式队列布隆过滤器 (Bloom Filter)批量型爬虫批量型爬虫有明确的抓取范围和目标,当爬虫达到这个设定的

8、目标后,即停止抓取过程。增量型爬虫增量型爬虫会持续不断的抓取,对于抓取的网页,要定期更新。通用的商业搜索引擎爬虫基本都属于此类。垂直型爬虫垂直型爬虫关注特定主题内容或者属于特定行业的网页,其他主题或者其他行业的内容不再考虑范围。爬虫的分类通用爬虫框架基本工作流程网络爬虫的基本工作流程如下:1.首先选取一部分精心挑选的种子URL;2.将这些URL放入待抓取URL队列;3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将

9、URL放入待抓取URL队列,从而进入下一个循环。从爬虫的角度对互联网进行划分从爬虫的角度对互联网进行划分对应的,可以将互联网的所有页面分为五个部分:1.已下载未过期网页2.已下载已过期网页:抓取到的网页实际上是互联网内容的一个镜像与备份,互联网是动态变化的,一部分互联网上的内容已经发生了变化,这时,这部分抓取到的网页就已经过期了。 3.待下载网页:也就是待抓取URL队列中的那些页面4.可知网页:还没有抓取下来,也没有在待抓取URL队列中,但是可以通过对已抓取页面或者待抓取URL对应页面进行分析获取到的URL,认为是可知网页。5.还有一部分网页,爬虫是无法直接抓取下载的。称为不可知网页。抓取策略

10、在爬虫系统中,待抓取URL队列是很重要的一部分。待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取哪个页面。而决定这些URL排列顺序的方法,叫做抓取策略。下面重点介绍几种常见的抓取策略: 1.深度优先遍历策略 2.宽度优先遍历策略 3.反向链接数策略4.Partial PageRank策略抓取策略depth-first:遍历的路径:A-F-G E-H-I B C Dbreadth-first:遍历的路径:A-B-C-D-E-F G H I网页更新策略 互联网是实时变化的,具有很强的动态性。网页更新策略主要是决定何时更新之前已经下载过的页面。常见

11、的更新策略又以下三种:1.历史参考策略 顾名思义,根据页面以往的历史更新数据,预测该页面未来何时会发生变化。一般来说,是通过泊松过程进行建模进行预测。网页更新策略 2.用户体验策略 尽管搜索引擎针对于某个查询条件能够返回数量巨大的结果,但是用户往往只关注前几页结果。因此,抓取系统可以优先更新那些显示在查询结果前几页中的网页,而后再更新那些后面的网页。这种更新策略也是需要用到历史信息的。用户体验策略保留网页的多个历史版本,并且根据过去每次内容变化对搜索质量的影响,得出一个平均值,用这个值作为决定何时重新抓取的依据网页更新策略 3.聚类抽样策略前面提到的两种更新策略都有一个前提:需要网页的历史信息

12、。这样就存在两个问题:第一,系统要是为每个系统保存多个版本的历史信息,无疑增加了很多的系统负担;第二,要是新的网页完全没有历史信息,就无法确定更新策略。这种策略认为,网页具有很多属性,类似属性的网页,可以认为其更新频率也是类似的。要计算某一个类别网页的更新频率,只需要对这一类网页抽样,以他们的更新周期作为整个类别的更新周期。分布式抓取系统结构 一般来说,抓取系统需要面对的是整个互联网上数以亿计的网页。单个抓取程序不可能完成这样的任务。往往需要多个抓取程序一起来处理。一般来说抓取系统往往是一个分布式的三层结构。如图所示:分布式抓取系统结构 最下一层是分布在不同地理位置的数据中心,在每个数据中心里

13、有若干台抓取服务器,而每台抓取服务器上可能部署了若干套爬虫程序。这就构成了一个基本的分布式抓取系统。对于一个数据中心内的不同抓去服务器,协同工作的方式有几种: 1.主从式(Master-Slave) 2.对等式(Peer to Peer)主从式抓取系统结构主从式抓取系统结构对于主从式而言,有一台专门的Master服务器来维护待抓取URL队列,它负责每次将URL分发到不同的Slave服务器,而Slave服务器则负责实际的网页下载工作。Master服务器除了维护待抓取URL队列以及分发URL之外,还要负责调解各个Slave服务器的负载情况。以免某些Slave服务器过于清闲或者劳累。这种模式下,Ma

14、ster往往容易成为系统瓶颈。对等式抓取系统结构对等式抓取系统结构 在这种模式下,所有的抓取服务器在分工上没有不同。每一台抓取服务器都可以从待抓取在URL队列中获取URL,然后对该URL的主域名的hash值H,然后计算H mod m(其中m是服务器的数量,以上图为例,m为3),计算得到的数就是处理该URL的主机编号。这种模式有一个问题,当有一台服务器死机或者添加新的服务器,那么所有URL的哈希求余的结果就都要变化。也就是说,这种方式的扩展性不佳。对等式抓取系统结构 在这种模式下,所有的抓取服务器在分工上没有不同。每一台抓取服务器都可以从待抓取在URL队列中获取URL,然后对该URL的主域名的h

15、ash值H,然后计算H mod m(其中m是服务器的数量,以上图为例,m为3),计算得到的数就是处理该URL的主机编号。这种模式有一个问题,当有一台服务器死机或者添加新的服务器,那么所有URL的哈希求余的结果就都要变化。也就是说,这种方式的扩展性不佳。布隆过滤器在构建分布式爬虫时抓取海量网页时,通常需要维护一个很长的已抓取URL集合,避免重复抓取已经下载过的网页。然而即使使用哈希表来构建这个集合,依然面临着冲突和内存利用率不高的缺点。通常的判重做法是使用Bloom Filter(布隆过滤器)来进行已抓取网页查找。布隆过滤器布隆过滤器布隆过滤器(Bloom Filter)是由布隆(Burton

16、Howard Bloom)在1970年提出的。它实际上是由一个很长的二进制向量和一系列无关的哈希函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中,但是没有识别错误的情形,如果某个元素在该集合中,那么Bloom Filter 是不会报告该元素不在集合中的,所以不会漏报。布隆过滤器相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash 函数相互之间没有关系

17、,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。Python高级爬虫框架ScrapyScrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持原来的代码我们要改的指定一个文件来存放爬出来的信息,这些信息会以txt格式来保存。f=open(D:/di

18、anping/+str(time.strftime(ISOTIMEFORMAT) +.txt,a+)这个就是多IP爬虫,一个IP很容易就被发现并禁止这个就是多客户端爬虫,单一个的客户端很容易被发现并禁掉import urllib2,urlliburllib2模块定义的函数和类帮助打开url(主要是HTTP)在一个复杂的世界-基本和简要身份验证,重定向,cookie和更多。 import re 正则表达式import time 提供各种时间函数import string 字符串处理的函数improt request 与urlib差不多,更简单 import socket套接字套接字是为特定网络协

19、议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象。它们允许程序接受并进行连接,如发送和接受数据。为了建立通信通道,网络通信的每个端点拥有一个套接字对象极为重要。Python中的random模块用于生成随机数。 import user_agents 这个比较特殊,是人为定义的库,这个库存储了许多IP或是对点评网的访问方式,目的就是随机选一个IP访问以避免网站对单一IP登陆的封杀。timeout = 60 socket.setdefaulttimeout(timeout) #设置 HTTP 或 Socket 访问超时,来防止爬虫抓取某个页面

20、时间过长。(这个时间用秒 #来算)def get_status(url): r = requests.get(url, allow_redirects = False)# allow_redirects = False不允许间接地访问,用request库中的get函数来抓取URL return r.status_code#获取网页内容def content_get(url): try:#“#”是注释的意思 # proxy_ip =random.choice(proxyIP.proxy_list) # print proxy_ip # proxy_support = urllib2.ProxyH

21、andler(proxy_ip) # opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler) # urllib2.install_opener(opener) req = urllib2.Request(url)#这个类是一个抽象的URL请求。 user_agent = random.choice(user_agents.user_agents) #在刚才的user_agents里面随机找一个登录方法 req.add_header(User-Agent,user_agent) req.add_header(Referre

22、r, url) print user_agent#python 的输出函数是print page = urllib2.urlopen(req) content = page.read() page.close() return content#正常的话就用content来保存读出的结果并且一定要关闭文件并返回content except UnicodeDecodeError as e: print(-UnicodeDecodeError url:,url) return #解码错误则输出并返回空 except urllib2.HTTPError as e: print(-HTTPError u

23、rl:,url) return #网站禁止爬虫则输出并返回空 except socket.timeout as e: print(-socket timout:,url) return #抓取超时则输出并返回空 except urllib2.URLError, e: if hasattr(e, reason): print Failed to reach a server. print Reason: , e.reason return elif hasattr(e, code):#elif相当于else if print The server couldnt fulfill the requ

24、est. print Error code: , e.code return except Exception, e: if DEBUG: print e return # if DEBUG 如果出错了print e return #获取店铺的urldef get_shopurl(url): content = content_get(url) #寻找店铺的实际url,例如/shop/6123204,用正则表达式 #find_shopurl = pile(rs*s*a href=(.*?) class=BL title=.*?,re.DOTALL) find_shopurl = pile(rs*s*) re_next = find_next.search(content) return re_pile是将字符串编译为用于python正则式的模式,字符前的r表示是纯字符,这样就不需要对元字符进行两次转义。re.findall返回的是字符串中符合results_pat的列表,由于在results_pat中使用了子表达式,所以results存储的就是子表达式所匹配的内容,即与之间的内容。斐波那契数列Fib()Fib(100)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论