推荐星级:
  • 1
  • 2
  • 3
  • 4
  • 5

基于Python的网络爬虫技术的关键性问题探索

更新时间:2019-12-24 19:22:18 大小:2M 上传用户:songhuahua查看TA发布的资源 标签:python网络爬虫 下载积分:1分 评价赚积分 (如何评价?) 打赏 收藏 评论(0) 举报

资料介绍

0引言随着网络的不断发展,大量数据以文本形式、图片甚至视频的形式存储,通过网络爬虫(Crawler)获取网络数据是一种非常流行的方法。本文将基于Python的网络爬虫技术的关键性问题以及一些相应的解决方法进行讨论。1相关性问题介绍数据爬取任务通常是基于Robots协议进行,再分析网站DOM树爬取所需要的数据。在解析过程中主要使用正则表达式进行筛选和匹配,针对网站的反爬取机制采取一些措施和手段。下面分别针对


部分文件列表

文件名 大小
基于Python的网络爬虫技术的关键性问题探索.pdf 2M

部分页面预览

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

全部评论(0)

暂无评论

上传资源 上传优质资源有赏金

  • 打赏
  • 30日榜单

推荐下载