爬虫新手一枚,因为工作原因需要学习相关的东西。发表下这段时间学习的心得,有说得不对的地方欢迎指指点点。
一.什么是爬虫
在学习爬虫之前只对爬虫有个概念性的认识。通过向服务器发送请求获取服务器传回信息,再根据其提取所需的信息。原理虽然简单,但是涉及的细节非常多,从一个坑爬出来又掉进另一个坑。
二.post和get
post和get是两种向服务器发送请求的方式,有些http基础的同学应该都清楚他们的用处,在写爬虫时,涉及到同服务器交互肯定是离不了这两种方法的。其中get请求用于一系列对服务器数据没有影响的操作,如获取html,检索等,而post一般是用于对服务器数据有影响的功能,如提交表单等。如果只是简单爬取信息,一般用get方法。除此之前,get方法的安全性较Post方式要差些,如果需要提交包含机密信息的话,建议用Post提交方式,但get的执行效率比post方法好。
三.编码方式
这是跌进的第一个坑。源于对一个网页爬取时,不管怎么样都失败,浪费了将近一天时间才发现是编码混乱的原因造成。目前大多数中文网站采用GBK,GB2312,UTF-8这三种编码方式进行编码,详细的编码原理可查阅其他资料。通常在获取一个网页的html代码后都会先根据其编码方式进行转码,下面用python对从path获取的网页根据utf-8的方式进行转码。
html=urllib.request.urlopen(path).read().decode("utf-8")
正常来说,一个网页只会有一种编码方式,通过上述的代码就能完成对其的转码。但是,如果在一个网页里存在两种编码方式的字符会怎么样?对,就是这个原因导致我在这个问题上卡了将近一天。对我这个刚接触爬虫的人,怎么也不会想到一个网页里会存在两种编码方式,所以我无论用哪种方式进行转码都会失败。当找到原因后,使用了lxml库自带的转码方法后可以顺利完成转码。
html=urllib.request.urlopen(path).read()
htmletre = etree.HTML(html)
result = etree.tostring(htmletre, encoding='utf-8', pretty_print=True, method="html")
但是后来发现,这种方法依然有很大的问题。就是如果一个网页包含有两个编码的字符时,如果对其中一种编码方式进行转码,当第一次遇到另一个编码的字符时,转码就会结束,最后导致结果缺失,对于爬取信息来说是不可接受的,特别是当另一个编码的字符出现在前半部分时会导致后半部分信息全部缺失。放弃这种方法后,通过重新分析网页的代码,发现另一种编码方式只会出现在极个别地方,如果放弃这部分编码,只对大部分有效信息进行转码也是可以接受的。查阅相关文档后,利用以下代码就可以实现对大部分编码进行转码。
html=urllib.request.urlopen(path).read().decode('gbk',errors='ignore')
四.正则表达式
在获取html代码后,就可以利用正则表达式进行信息提取了,正则表达式相关的知识也请查阅其他文档。这里想要说一下lxml库的使用,虽然大部分信息都可以通过正则表达式进行提取,但如果需要对代码本身的结构进行提取和分析就需要用到lxml库了。虽然正则表达式也能进行相关的操作,在不知道lxml库之前也利用正则表达式对标签层次关系进行过分析,但还是推荐使用lxml库,这里推荐一个链接。 Python爬虫利器三之Xpath语法与lxml库的用法 | 静觅 。
五.Chrom浏览器
Chrome浏览器对于写爬虫非常有用,Chrome自带的开发者工具能帮助分析网页的源码、资源和数据包。特别是要写表单提交一类功能时,Chrome自带的抓包功能非常好用,通过分析包结构可以实现各类复杂表单的模拟提交。如果对Chrome开发者工具不熟悉的同学,推荐下面这个链接。Google Chrome 浏览器 开发者工具 使用教程
六.爬虫与机器学习
在学习爬虫前,一直在学习机器学习。通过这段时间对爬虫的学习,我觉得机器学习跟爬虫能够很好的结合起来。一方面对某些模型的训练可以通过爬虫来获取足够多的数据样本,另一方面,因为各种网站的结构有很大的差异,利用机器学习可以对各种结构的网页进行准确分析和信息提取,最终达到相辅相成的目的。
无论是爬虫还是机器学习我都是一个初学者,上述都是这段时间的一个心得和总结,一方面希望对其他初学者有一点帮助,另一方面也希望有任何说错的和还能改进的地方大家能够指出来。