• 32
基于Python的网络爬虫技术的关键性问题探索
大连理工大学城市学院  唐  琳  董依萌  何天宇
0  引言
随着网络的不断发展,大量数据以文本形式、图片甚至视频的形式存储,通过网络爬虫(Crawler )获取网络数据是一种非常流行的方法。本文将基于Python 的网络爬虫技术的关键性问题以及一些相应的解决方法进行讨论。
1  相关性问题介绍
数据爬取任务通常是基于Robots 协议进行,再分析网站DOM 树爬取所需要的数据。在解析过程中主要使用正则表达式进行筛选和匹配,针对网站的反爬取机制采取一些措施和手段。下面分别针对这些具体知识点和解决方案进行介绍:1.1  Robots协议
Robots 协议的全称是网络爬虫排除标准(即Robots Exclusion Protocol ),网站通过Robots 协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。它是Web 站点和搜索引擎爬虫交互的一种方式,并不是一个规范,所以并不能保证网站隐私。在互联网世界中,每天都有不计其数的爬虫在日夜不息地爬取数据,其中恶意爬虫的数量甚至高于非恶意爬虫。遵守Robots 协议的爬虫才是好爬虫,但是并不是每个爬虫都会主动遵守Robots 协议。1.2  分析网站DOM树爬取数据
网站结构分析是进行数据采集的必备技能,在编写爬虫之前我们需要知道数据所在的位置,之后才能通过遍历节点树或查子节点到目标数据。Google 浏览器的开发者模式就是分析网站结构的强力工具,利用好这个工具就可以轻松分析出目标数据的位置,还能获取渲染内容、cookies 等信息。1.3  正则表达式
正则表达式是一种基于规则进行字符串匹配的工具,不同编程语言都有正则表达式使用的场景。通常我们利用正则表达式从复杂的内容种,提取出我们想要的部分内容。1.4  模拟浏览器
动态的网站由于不能直接获得想要数据,需要得到渲染之后的网页等内容加载完成之后在进行下载。其
中,模拟翻页可以使用Sele-nium 与PhantomJS 模拟浏览器方法实现,具体实现就是通过模拟鼠标
点击页码请求后台,获取到新数据后重新渲染html 的表格部分。
1.5  伪装爬虫头部
某些网页具有反爬取机制,为了不让爬虫爬取数据,有些时候会检查浏览器头Request Header ,然后直接断网从而拒绝爬取。一个很好的方法就是在Google 浏览器开发者模式中Network 查看生成的请求html 文件获取Request Headers ,再通过Google 工具Postman 转换为Python 代码。1.6  伪装IP
在爬取网站信息的过程中,网站可能会限制每个IP 的访问速度或访问次数。对于限制访问速度的情况,通过time.sleep 使程序进行短暂休眠后再发出请求进行爬取。对于限制IP 访问次数的时候我们需要通过多个代理IP 构建代理IP 池轮换访问。1.7  多线程与多进程
多线程与多进程都能成倍的提高爬虫的速度,进程的问题是不同进程之间的内存空间不共享,进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。而所有线程在同一个进程下,共享内存空间,通讯效率高,切换开销小。线程为了保护内存空间的数据安全,引入了”互斥锁”。线程的问题是在Python 里由于GIL 全局解释器锁的存在,一个线程需要执行任务必须获取GIL ,在Python 的进程里只有一个GIL ,但是,在I/O 阻塞的时候,解释器会释放GIL 。所以密集CPU 任务,需要充分使用多核CP
U 资源(服务器,大量的并行计算)的时候,用多进程。密集I/O 任务(网络I/O ,磁盘I/O ,数据库I/O )使用多线程合适。根据爬虫自身检索页面(I/O )的行为比较多,还是分析页面(CPU )的行为更复杂来选择使用多线程与多进程就好了。
2  解决方案介绍
2.1  分析网站DOM树爬取数据
在爬虫开始之前,首先需要我们掌握一些HTML5的基本知识。可以通过在网上或者查阅一些书籍来学习它。可以看懂页面的源代码,掌握页面源代码的基本结构和可以到想要元素所在的标签位置。然后在python 2.x 中可以通过pip install beautifulsoup4来安eau -tifulsoup4库和pip install requests 来安装requests 库。python 3.x 可以通过pip3 install beautifulsoup4来安eautifulsoup4库和pip3 install requests 来安装requests 库。然后学习requests 库和BeautifulSoup4库的使用。
基金项目:辽宁省大学生创新创业训练计划项目基于网络大数据的大学生旅游网(项目编号:201713198000006);大连理工大学城市学院院级课题“新课程‘Python语言程序设计’在软件专业转型试点中实验、实践教学研究与应用”(JXYJ12017003);辽宁省教育科学规划项目“辽宁省应用型大数据人才培养目标及实现路径探究”(JG17DB083);辽宁省普通高等学校转型发展试点专业——大连理工大学城市学院计算机工程分院软件工程专业(辽教发[2016]23号)研究成果。
• 33
2.2  正则表达式
Python中正则表达式需通过import re来导入re库来使用。程序种最为常用的功能函数。搜索字符串,以列表类型返回全部能匹配的子串的findall();在一个字符串中替换所有匹配正则表达式的子串,返回替换之后的字符串sub();将一个字符串按照正则表达式匹配结果进行分割,返回列表类型split()等。
python网络爬虫书籍推荐
2.3  模拟浏览器
爬取动态网站数据还需要使用模拟浏览器。一般客户端常见的浏览器需要渲染出图形,因此执行效率较慢。如chrome、firefox。另一种浏览器没有GUI界面,被称为无头浏览器,这类浏览器占用的空间少,
执行效率高。如PhantomJS。适合linux这种纯CLI界面服务器来执行,所以在爬虫程序中,如果是需要使用模拟浏览器则需要使用无GUI的浏览器。
网络中数据较多时通常分页存储,因此,爬虫代码中敬仰需要实现翻页功能。常见翻页的实现主要有两种方法。第一种方法是在每次点击下一页按钮的时候,可以看到对应页面的url是在不停变化的,也就是静态的生成了一个新的页面,并且可以看到每次生成的新的页面的url是有规律可循的。那么我们就可以根据这一情况,在编写代码的循环里面实现对url的不停更新,也就实现了翻页的功能。第二种方法就是,每次在点击下一页的时候,当前页面的url并没有变化,变化的是这个页面的内容。也就是在点击下一页的时候这个网页动态的加载了新的内容。这就意味在每次翻页的时候都需要人为的去点击下一页按钮。为了解决这一问题就有了模拟浏览器,让这个模拟浏览器去模拟人为点击下一页按钮的动作,实现翻页的功能,然后就可以继续去分析获取页面的内容,并得到需要的内容。
还有有一些网页是隐含分页形式显示的,即在显示的时候只显示一部分,只有在鼠标向下滚动的时候才会继续显示,这样的话就存在爬虫爬取下来一个不完整的内容,那么我们就可以让这个模拟浏览器来模拟这个动作,从而可以获得完整的页面内容。
2.4  伪装爬虫头部
对于一些网站,如果不是从浏览器发出的请求,则得不到响应。所以,我们需要将爬虫程序发出的请求
伪装成浏览器发出的正常请求。具体实现:自定义网页请求报头打开工具Fiddler,然后再浏览器访问一个url,在Fiddler左侧访问记录中,到“200 HTTPS url”这一条,点击查看其对应的请求和响应报头具体内容。然后在自己的爬虫代码中加入这些内容。
2.5  多线程与多进程
(1)多线程适合IO密集型程序
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。所以python的多线程对IO密集型代码比较友好。当我们使用多线程爬取时,会出现爬虫每次都会把url列表里url在没有爬取内容的时候就已经生成了一个线程,就会出现如果断网的话,就会有很多的url其实还没有被爬取,对存储文件的处理就变得很麻烦。对于任务数量不断增加的程序来说,每有一个任务就要为这些新的链接生成新的线程,线程数量暴涨,最终线程数量就会失控。在之后的运行中,线程数量还会不停的增加,完全无法控制。所以,对于任务数量不端增加的程序,固定线程数量的线程池是必要的。
(2)多进程适合CPU密集运算型程序
因为每个进程都有单独的GIL,互不干扰,这样就可以实现真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。在多核下,如果想做并行执行提升程序效率,比较常用有效的方法是使用多进程。
创建一个进程池,进程个数为cpu内核数。电脑的cpu有多少内核便可以同时执行多少个进程,当然也可以填的很多,但是作用不大,并不是进程数越多程序执行就会越快。
3  总结
通过以上对基于python的网络爬虫的关键性问题的结束和解决,可以看到在网络飞速发展,信息传播快速的现在,可以知道网络爬虫是我们大量获取网络数据的主要手段。为了学好这一技术,首先我们要学会HTML5,通过一些书籍和反反复复查看一个网页的源代码结合来学习这门语言,掌握它的基本语法和结构。学会使用F12:快捷键,(更多工具——开发者工具)。接下来就要学会bs4和re结合使用,bs4可以到需要的标签,re可以从这个标签中获得需要的内容,从而可以在页面中解析和获得我们想要的内容。在学习一个模拟浏览器,实现翻页和加载完毕页面内容,这样一个简单的爬虫就实现了。可以继续改进代码结合数据库来实现一个简单的网页去重,伪装一下爬虫的首部,以及通过多线程或者多进程来提高爬虫的效率。最后要注意爬虫的时效性,作为一个网络爬虫开发者,我们应该随时关注我们正在爬取的网站的网页的结构,一旦发生了变化,我们就要及时更新爬虫的解析规则,以确保爬虫的正常运行。
参考文献
[1]刘顺程,岳思颖.大数据时代下基于Python的网络信息爬取技术[J].电子技术与软件工程,2017(21):160-160.
[2]李琳.基于Python的网络爬虫系统的设计与实现[J].信息通信,2017(9):26-27.
[3]王朝阳.基于Python的图书信息系统的设计与实现[D].吉林大学,2016.
[4]刘艳平,俞海英,戎沁,等.Python模拟登录网站并抓取网页的方法[J].微型电脑应用,2015,31(2):58-60.
作者简介:
唐琳【通讯作者】(1980—),女,辽宁大连人,硕士研究生,副教授,主要研究方向:自然语言处理,文本可视化。
董依萌(1998—),女,河北邢台人,大学本科,现就读于大连理工大学城市学院。
何天宇(1998—),男,辽宁鞍山人,大学本科,现就读于大连理工大学城市学院。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。