前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学Py日记——关于网络爬虫的一些总结

学Py日记——关于网络爬虫的一些总结

作者头像
luanhz
发布2020-03-31 16:34:12
6180
发布2020-03-31 16:34:12
举报
文章被收录于专栏:小数志小数志

学习Python网络爬虫近3周时间了,也分别针对“命运共同体”、“京东米酒”和“猎聘网Python招聘”3个事件进行了爬取和数据分析,有了初步的知识积累。现做简单总结,以资深化理解。

【0】关于python版本的选择、IDE选择和lib库安装

A.版本选择。目前python存在两类大的版本,即2.x和3.x,与其他软件向下兼容不同,这俩大的版本完全是两类版本,无论是语法风格还是功能都各有不同。总体而言,2.x偏向成熟稳定,支持各种工具库比较多,网上的各种教程和博客多是基于2.x版本;3.x则对编码问题有着更好的兼容性,更能代表未来主流。2.x和3.x的一个最简单的区别就是打印命令:print “hello world”就是2.x, print(“hello world”)则是3.x。

B.IDE,中文名称为集成开发环境,目前已接触过3个,分别是纯粹的Python Idle、Sublime text3和PyCharm,总体感觉Idle最为轻便,也是其他各类Python Ide赖以工作的前提和依据,可以理解为其他ide只是在它的基础上加装了一个外壳,更加方便简洁而已,但真正的解释执行归根结底还是要靠idle,缺点是不带编码提示、色彩区分以及各种编写上的低效;Sublime text3严谨的说算是一个多功能的文本编辑器,只不过可以通过不同的设置和插件使其适用于python编写和执行,借用大家惯用的话叫“相比Idle的纯白如雪,Sublime text3真是五彩缤纷”,而且更重要的它还是一个轻量级的,响应快速,简单使用,目前用着最为顺手;而PyCharm则相对功能十分丰富,体积也更大,也算是Python的专业开发环境,缺点是启动较慢,使用复杂,不易上手。

C.Python的强大要得益于各类第三方lib库的存在,那么就自然涉及到安装。在idle和sublime中,都可以依托cmd工具用“pip install xxx”的方式安装,非常方便,如果不能直接安装那么可以下载.whl文件安装,其中直接安装工具包可以在任意cmd路径,而安装.whl文件则要先切换到文件所在路径在pip install xxx.whl。这里还要注意pip能够使用也是有前提的,一是安装了pip包,二是加入了环境变量。

【1】爬虫的一般流程

所谓爬虫,个人理解无非就是通过一定的规则教会程序去自动遨游在广袤的网络中,提取想要的各类信息。爬虫它其实很笨,因为它只会按照编程者的既定规则去找寻目标数据,但凡有丁点的语法错误或者信息不匹配,哪怕要找的数据就在你的隔壁,它也不能完成任务;同时它又很勤劳,你只要教给它正确的方法,它便能又快又好的提取大量数据。这可能也是计算机程序执行的最大特点。欲用爬虫,先论其道,再赋其术。

A.网页响应。网络世界信息繁杂,但追根溯源还是要从一个请求——发送的响应说起。客户端(用户端)发送一个请求,里面包含着编码后的协议、目标地址和请求等信息,前往服务器(目标端)去握手和取得一致,而后再将服务器的数据带回来,经解码后显示在客户端。这是举网页的例子,那么其他软件其实是类似的,包括手机端APP,简单的理解就是给网页加装了个外壳,添加一些特定的功能而已。而爬虫要想提取数据,则就是要模拟客户端访问服务器,然后将要要得到的数据带回来,供后续选择提取。包括有时为了抓取软件的数据包,还要借助一些代理工具(fiddler比较好用),无非就是让网络信息强制的通过代理工具,进而为python提取响应提供便利,不然就不可控了。

B.解码信息。直接从服务器得到的网页响应是一片荒芜待开发的信息大海,如果不加以解析提取则就失去了自动爬虫的意义。提取的工具和提取的信息都将依不同网页类型而异。

所以,总结来看,实现一个网络爬虫总共就分两步:1.获取网页,2.解码响应得到信息。当然,仅仅做到这两步一般是不够的,所以一般需要进行多次循环:如先从一个源网页的响应中提取出若干子网页的URL信息,然后再通过各子网页URL获得响应,进而得到响应和待提取信息。甚至还可以继续从子网页的响应中继续提取子子网页URL信息,继续循环提取,直至满足一定的终止条件。

【2】获取网页响应的方法

A.常用的获取网页响应方法有两种,一个是urllib库,为python自带,另一个是第三方requests库。

Python3中的Urllib库是集成了2.x中的urllib和urllib2两个库,所以import时也可以分模块引用,如import urllib.request,import urllib.parse等,常用的获取响应方法也有两种,一个是req=urllib.request.Request(url,headers),然后req= urllib.request.urlopen(req),这是应用urllib库加模拟头的方法,如果不需要模拟头那么直接urllib.request.urlopen(url)即可得到响应(也就是说urlopen函数既可以直接接收url参数,也可以接收响应),Urlopen函数返回值加.read().decode()即可得到响应文本。

就获取网页响应而言,相比来看requests库应用更加简洁,requests库主要有7个函数,常用的就是get()和post()函数,requests.get(url,headers)

B.获取URL规律的方法

一般系列搜索网页都有着极强的规律,如“基准url&关键词&偏移页&网页ID”等等,个别的会加时间戳(timestamp)。可以先把几个网页一起复制下来对比,找到其中变化的部分,然后大刀阔斧的将其余都精简掉,试试能否打开得到响应内容,一般按照这个方法就能得到url变化规律,当然也可以通过分析开发者工具中给出的Query String参数来推断。在有的动态网页中,还需要单独构建json网页中的内容,这时候可借助google浏览器,在network中逐个查找响应内容,然后查找响应的请求url,再构建即可。这个是逐步积累经验的过程,看的多了可以迅速凭直觉推断。

C.构建动态url的三种方式

1.将复杂url分解为几段,如url1=固定段1,url2=变化字段,如搜索结果中偏移页面,url3=其他固定页面,然后进行直接拼接url=url1+url2+url3

2.引用字符串格式化方法,url=’http://www.{0}.{1}’.format(‘baidu’,’com’)

3.采用字典形式的参数,如params = {'key1': 'value1','key2':'value2'},应用urllib库时用urllib.parse.urlencode()函数编码成url参数,然后url = base_url + urllib.parse.urlencode(params)得到最终url,应用request库时则可以带paras参数的get函数,requests.get(url, params=params)

D.URL去重

通过源网页→子网页的方式实现网页遍历,往往带来的问题是容易存在重复(猎聘网中不同搜索页之间就存在大量重复),这是就需要构建已访问页面集合的问题,有两种思路,一种是构建一个集合或列表,每次找到新url时都先检查是否在已访问集合中,避免重复访问;另一种思路是应用数据库,每次从数据库比对。前者适用于访问规模较小时,速度快,占用内存可控;后者适用于访问规模很大时,虽然速度不快,但可避免大规模占用内存。另外,借助内存建立列表时还可考虑简化存储的问题,如只提取网页中的关键信息(如标志性ID等)或进行MD5编码存储,这都可以实现内存占用的大大降低。

E.带Cookie获取

理想情况下,掌握前面三板斧可以解决很多网页的响应问题,尤其是对于静态网页而言更是简单至极。但难点是现在很多网站都引入了反爬机制,一个简单的模拟头是不足以解决问题的,这时候就需要带着cookie去获取网页响应,有的还要模拟登录。这是下步学习重点。

【3】从网页响应中提取信息的方法

在得到网页响应后,最重要的就是如何获取感兴趣信息的问题。目前主要用到了3种方式,Beautiful soup(美丽汤),Re(Regular Expression,正则)和Xpath(XML路径)。

A.Beautifulsoup,对得到的网页响应进行beautiful soup后,实际上是相当于进行了按照一定规则进行重组,类似树,然后即可以通过一定条件查找响应的节点或者带属性查找节点,进而找到所有节点信息。

B.Re,正则表达式很强大,构建一个合理的表达式能够匹配出任何想要的信息,尤其适用于在复杂文本中提取关键信息,如提取日期、电话号等等。前提是构建一个准确的正则表达式,这是一门大学问。

C.Xpath,尤其适用于网页构建高度统一的情形,可以按照固定地址去找寻响应信息,非常好用。打个简单的比方就是知道了某省某市某区某街道后,找寻该街道上的某一属性的信息,如该街道上的所有酒店。

个人喜好的优先顺序:Xpath→Beautiful soup→Re,当然还需因情况而异。

【4】对爬取数据的清洗和处理

一般而言,直接爬取的数据会包含一些杂质,如某些信息条目缺失、数据不满足要求、数据重复等问题,这就涉及到数据清洗问题。最简单的数据清洗方法可依托Excel来进行,这也是一款极其强大的数据处理工具,解决少量的数据处理和信息提取乃至可视化都十分强大。应用Excel进行数据清洗的几个小技巧:删除重复值,按规则突出显示,排序,字符串提取,列举几个非常好用的函数,If和Ifs,IsNumber,Countif和Countifs,Sumif和Sumifs,vlookup,Left和LeftB,Len和LenB等等,这些可以实现很多常用的数据处理功能,而应用数据透视表和数据透视图即可实现很多可视化功能。工具是好工具,但要想全面深入掌握还是要下点功夫的。

【5】数据可视化的几个思维

从网页中爬取数据不是我们的最终目的,而是要将其进行挖掘提取得到有价值的信息。为了更好的彰显自己的数据分析结论,数据可视化又是最好的形式,没有之一。“一图顶千字”,“字不如表,表不如图”,都是最好的概括。

常用的分析思维(套路)包括:

A.看分布。适用于分析某一信息随单变量的分布情况。例如,随时间变化,如月初月中月末分布曲线,一年四季分布,早中晚分布等等,看随时间的相关性;随地域分布,最简单的是用python的地图显示,或者excel中的热力图,明确凸显不同地域的分布情况;随人员分布,如不同身份人员是否带来较大差异,人员性别有无明显差异,不同年龄段带来的变化。因为是单变量分析,所以更多的是用分布就能表达观点,包括常用的饼图,直方图,曲线图等等,多维时可用散点图。

B.看联系。适用于找出某两个属性间的内在关系,最多的就是查找相关性,可以用Excel中数据分析-相关系数进行分析,包括线性回归等等,这可以清晰得出二者之间关联性有多大。

C.看对比。比如分析两种条件下某一信息变化情,最适合用对比的方式给出图表,如变化曲线,直方图分布等等,这也是最能通过互相伤害得出直接结论的方式。

D.看词云。这是python最好用的一个工具,对于给定文本进行词云分析,得出不同关键词的词频,得出文本中具有一定倾向性的热词。甚至还可以进行情绪分析,得出喜好憎恶。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小数志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档