HTTP Request 中加入特定的 Header

               

6.1 最简单的爬虫
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。python的urllib\urllib2等模块很容易实现这一功能,下面的例子实现的是对baidu首页的下载。具体代码如下:

import urllib2page=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 urllib2keyword=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 urllib2request = 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, httpliburllib比较简单,功能相对也比较弱,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和handleropener = urllib2.build_opener(handler)urllib2.install_opener(opener)(4)加上sessioncj = 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)

           

猜你喜欢

转载自blog.csdn.net/qq_44910432/article/details/89306850