本文将和大家分享一些从互联网上爬取语料的经验。
工欲善其事必先利其器,爬取语料的根基便是基于python。
我们基于python3进行开发,主要使用以下几个模块:请求,lxml, json。
简单介绍一个各模块的功能
<强> 01 |请求/强>
请求是一个Python第三方库,处理URL资源特别方便。它的官方文档上写着大大口号:HTTP对人类(为人类使用HTTP而生)。相比Python自带的urllib使用体验,笔者认为请求的使用体验比urllib高了一个数量级。
我们简单的比较一下:
urllib:
进口urllib2 进口urllib URL_GET=" https://api.douban.com/v2/event/list " #构建请求参数 params=urllib.urlencode({“疯狂的”:“108288”,“day_type”:“周末”,“类型”:“展览”}) #发送请求 响应=urllib2.urlopen (' & # 63; ' . join ([URL_GET, ' % s ']) % params) #响应标头 print (response.info ()) #响应代码 print (response.getcode ()) #响应主体 print (response.read ())
请求:
进口的要求 URL_GET=" https://api.douban.com/v2/event/list " #构建请求参数 params={“疯狂的”:“108288”,“day_type”:“周末”,“类型”:“展览”} #发送请求 响应=requests.get (URL_GET params=params) #响应标头 打印(response.headers) #响应代码 打印(response.status_code) #响应主体 打印(response.text)
我们可以发现,这两种库还是有一些区别的:
1。参数的构建:urllib需要对参数进行urlencode编码处理,比较麻烦,请求无需额外编码处理,十分简洁。
2。请求发送:urllib需要额外对url参数进行构造,变为符合要求的形式,则请求简明很多,直接得到对应链接与参数。
3。连接方式:看一下返回数据的头信息的“连接”,使用urllib库时,“连接”:“关闭”,说明每次请求结束关掉插座通道,而使用请求库使用了urllib3,多次请求重复使用一个套接字,“连接”:“维生”,说明多次请求使用一个连接,消耗更少的资源
4。编码方式:请求库的编码方式接受编码更全,在此不做举例
综上所诉,使用请求更为简明,易懂,极大的方便我们开发。
<强> 02 | lxml 强>
BeautifulSoup是一个库,而XPath是一种技术,python中最常用的XPath库是lxml。
当我们拿到请求返回的页面后,我们怎么拿到想要的数据呢?这个时候祭出lxml这强大的HTML/XML解析工具.python从不缺解析库,那么我们为什么要在众多库里选择lxml呢?我们选择另一款出名的HTML解析库BeautifulSoup来进行对比。
我们简单的比较一下:
BeautifulSoup:
从bs4进口BeautifulSoup #导入库 #假设html是需要被解析的html #将html传入BeautifulSoup的构造方法,得到一个文档的对象 汤=BeautifulSoup (html、‘html.parser from_encoding=皍tf - 8”) #查找所有的h5标签 链接=soup.find_all (“h5”)
lxml:
从lxml进口etree #假设html是需要被解析的html #将html传入etree的构造方法,得到一个文档的对象 根=etree.HTML (html) #查找所有的h5标签 链接=root.xpath (“//h5”)
我们可以发现,这两种库还是有一些区别的:
1。解析:html BeautifulSoup的解析方式和金桥的写法类似,API非常人性化,支持css选择器;lxml的语法有一定的学习成本
2。性能:BeautifulSoup是基于DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多;而lxml只会局部遍历,另外lxml是用c写的,而BeautifulSoup是用python写的,明显的性能上lxml>祝辞BeautifulSoup。
综上所诉,使用BeautifulSoup更为简明,易用,lxml虽然有一定学习成本,但总体也很简明易懂,最重要的是它基于C编写,速度快很多,对于笔者这种强迫症,自然而然就选lxml啦。
<强> 03 | json 强>
python自带json库,对于基础的json的处理,自带库完全足够。但是如果你想更偷懒,可以使用第三方json库,常见的有demjson, simplejson。
这两种库,无论是进口模块速度,还是编码,解码速度,都是simplejson更胜一筹,再加上兼容性simplejson更好。所以大家如果想使用方库,可以使用simplejson。