6.1 最简单的爬虫
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。python的urllib\urllib2等模块很容易实现这一功能,下面的例子实现的是对baidu首页的下载。具体代码如下:
import urllib2
page=urllib2.urlopen("http://www.baidu.com")
print page.read()
6.2 提交表单数据
(1)用GET方法提交数据
提交表单的GET方法是把表单数据编码至URL。在给出请示的页面后,加上问号,接着是表单的元素。如在百度中搜索“马伊琍”得到url为http://www.baidu.com/s?wd=%E9%A9%AC%E4%BC%8A%E7%90%8D&pn=100&rn=20&ie=utf-8&usm=4&rsv_page=1。其中?后面为表单元素。wd=%E9%A9%AC%E4%BC%8A%E7%90%8D表示搜索的词是“马伊琍”,pn表示从第100条信息所在页开始显示(感觉是这样,我试了几次,当写100时,从其所在页显示,但如果写10,就是从第1页显示),rn=20表示每页显示20条,ie=utf-8表示编码格式,usm=4没明白是什么意思,换了1、2、3试了下,没发现什么变化,rsv_page=1表示第几页。如果要下载以上页面比较简单的方法是直接用上面的网址进行提取。如代码:
import urllib2
keyword=urllib.quote('马伊琍')
page=urllib2.urlopen("http://www.baidu.com/s?wd="+keyword+"&pn=100&rn=20&ie=utf-8&usm=4&rsv_page=1")
print page.read()
urllib中还提供了一些辅助方法,用于对url进行编码、解码。url中是不能出现一些特殊的符号的,有些符号有特殊的用途。我们知道以get方式提交数据的时候,会在url中添加key=value这样的字符串,所以在value中是不允许有'=',因此要对其进行编码;与此同时服务器接收到这些参数的时候,要进行解码,还原成原始的数据。这个时候,这些辅助方法会很有用:
urllib.quote(string[, safe]):对字符串进行编码。参数safe指定了不需要编码的字符; urllib.unquote(string) :对字符串进行解码; urllib.quote_plus(string[, safe]) :与urllib.quote类似,但这个方法用'+'来替换' ',而quote用'%20'来代替' ' urllib.unquote_plus(string) :对字符串进行解码; urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{'name': 'dark-bull', 'age': 200}将被转换为"name=dark-bull&age=200" urllib.pathname2url(path):将本地路径转换成url路径;
urllib.url2pathname(path):将url路径转换成本地路径;
3.在 HTTP Request 中加入特定的 Header
要加入 header,需要使用 Request 对象:
import urllib2 request = urllib2.Request('http://www.baidu.com/') request.add_header('User-Agent', 'fake-client') response = urllib2.urlopen(request) print response.read()
对有些 header 要特别留意,服务器会针对这些 header 做检查 User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求 Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。常见的取值有: application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用 application/json : 在 JSON RPC 调用时使用 application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用 在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务 使用Python访问网页主要有三种方式: urllib, urllib2, httplib urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session (1)最简单的页面访问 res=urllib2.urlopen(url) print res.read() (2)加上要get或post的数据 data={"name":"hank", "passwd":"hjz"} urllib2.urlopen(url, urllib.urlencode(data)) (3)加上http头 header={"User-Agent": "Mozilla-Firefox5.0"} urllib2.urlopen(url, urllib.urlencode(data), header)
使用opener和handler opener = urllib2.build_opener(handler) urllib2.install_opener(opener) (4)加上session cj = cookielib.CookieJar() cjhandler=urllib2.HTTPCookieProcessor(cj) opener = urllib2.build_opener(cjhandler) urllib2.install_opener(opener) (5)加上Basic认证 password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() top_level_url = "http://www.163.com/" password_mgr.add_password(None, top_level_url, username, password) handler = urllib2.HTTPBasicAuthHandler(password_mgr) opener = urllib2.build_opener(handler) urllib2.install_opener(opener) (6) 使用代理 proxy_support = urllib2.ProxyHandler({"http":"http://1.2.3.4:3128/"}) opener = urllib2.build_opener(proxy_support) urllib2.install_opener(opener)