1.python http请求模块
1.1 python http请求常识介绍
首先要清楚http协议信息包含:uri、body和headers等部分;http请求方式有以下几种:
- Get
- Post
- Put
- Delete
- Head
- Patch
- Options
- Propfind
- Copy
- Move
常见的http请求有:get、post和head;在python常用的http网络请求模块随着python版本的不同,大致如下所示:
- python2.X 有这些库名可用: urllib, urllib2, urllib3, httplib, httplib2, requests。
- python3.X 有这些库名可用: urllib, urllib3, httplib2, requests。
两者都有的urllib3和requests, 它们不是标准库. urllib3 提供线程安全连接池和文件post支持,与urllib及urllib2的关系不大. requests 自称HTTP for Humans, 使用更简洁方便。
在这里我们只讲解python2.X的http网络请求模块。
- Urllib和urllib2的区别:
- urllib2可以接受Request对象为URL设置头信息,修改用户代理,设置cookie等, urllib只能接受一个普通的URL。
- urllib提供一些比较原始基础的方法而urllib2没有这些, 比如 urlencode。
- httplib 和 httplib2的区别:
- httplib 是http客户端协议的实现,通常不直接使用, urllib是以httplib为基础 ;httplib2 是第三方库, 比httplib有更多特性。
1.2 http请求经验
经验具体如下所示:
- 合理使用gzip,使发送的请求可以更快的响应。
- requests 是一款非常人性化的 python http 库,但起对网页的编码识别却一直很蛋疼,时常出现乱码。可以从官方的 API 文档中找出乱码的根本原因;可见,requests 是通过 http header 猜测页面编码,如果 header 中不存在charset 就认为编码为 ISO-8859-1。这样的话,对于返回头中没有指定页面编码的情况,自然就出现乱码了。通常的解决办法如下所示:
1.3 cookie的使用
在网络请求中cookie的使用是个很重要的方面,其中保存记录重要请求行为的cookie,可以将使用的cookie保存到本地,可以从本地加载需要的cookie。
创建cookielib.CookieJar对象自动管理Cookie稍繁琐一些,但是一旦创建,可供urllib2创建opener,后续的所有cookie更新和过期删除都是自动处理的。
可用网址:
- http://www.lijiejie.com/python-http-request-with-cookie-string-part-2/ 其中例子的作用和模拟登陆一样
- http://cuiqingcai.com/968.html 介绍python cookie的使用
- http://www.jb51.net/article/46499.htm 介绍python cookie的使用,侧重点介绍cookie
- http://www.lijiejie.com/python-http-request-with-cookie-string/
1.4 其它http请求模块
可用的其它python http请求模块:
u frequests
u grequests
其中frequests和grequests的使用方式相同,其中frequests的稳定性高于grequests;简单使用如下所示:
2.响应结果数据格式
一般常见的响应结果格式为:
- json数据
- html数据
- 纯文本
3.各种数据格式的解析方法
3.1 Html解析方法
常见的html数据解析方法为:
- XPATH选择器
- CSS选择器
- 正则表达式
3.2 纯文本解析方法
常见的纯文本解析方法为:
- 正则表达式
- Python字符串处理,index、find、split、join等函数
3.3网页正文提取
网页正文提取重要性:
- 对于Web信息检索来说,网页正文抽取是后续处理的关键。
正则表达式可以准确的抽取某一固定格式的页面,但面对形形色色的HTML,使用规则处理难免捉襟见肘。能不能高效、准确的将一个页面的正文抽取出来,并做到在大规模网页范围内通用,这是一个直接关系上层应用的难题。
调研的方案:
- Joyhtml
JoyHTML的目的是解析HTML文本当中的链接和正文,利用超链接密度法为主要判断依据的标记窗算法,采用DOM树解析模式。
- Boilerpipe
这个Java类库提供算法来探测和删除在一个网页中主文本内容旁多余的重复内容。它已经有提供特殊的策略来处理一些常用的功能如:新闻文章提取。
- cx-extractor
本算法首次将网页正文抽取问题转化为求页面的行块分布函数,并完全脱离HTML标签。通过线性时间建立行块分布函数图,由此图可以直接高效、准确的定位网页正文。同时采用统计与规则相结合的方法来解决系统的通用性问题。
- Readability
在这里我们只使用其中cx-extractor和readability;这里对cx-extractor和readability做个对比,如下所示:
- cx-extractor优于readability(自己也在实际任务中验证过)。
- 简单:java代码不超过400行
- 准确率高:> 95%
- 算法时间复杂度为线性
cx-extractor使用实例如下图所示:
4.数据解析细节
建议:
- 使用xpath或者css selector替代正则
- 为什么建议使用xpath代替正则?
- 对于固定场景,合适的正则表达式解析的效率是会高于xpath的,之所以提倡使用xpath,是因为程序可维护性,xpath的可读性远高于正则表达式,开发调试和维护效率会大大提高。