python--网络爬虫一

http://hankjin.blog.163.com/blog/static/3373193720105140583594/

http://blog.csdn.net/wklken/article/details/7364328

http://blog.csdn.net/pleasecallmewhy/article/details/8923067

使用Python访问网页主要有三种方式: urllib, urllib2, httplib:

urllib比较简单,功能相对也比较弱,httplib简单强大,但好像不支持session

urllib   http://docs.python.org/library/urllib.html

urllib2  http://docs.python.org/library/urllib2.html

httplib   http://docs.python.org/library/httplib.html


1. 最简单的页面访问

1 import urllib2
2 url='http://www.baidu.com/'
3 res=urllib2.urlopen(url)
4 page=res.read()
5 print page

这个半天显示不了结果~~

urllib2,urlopen()函数

urllib2.urlopen(url[, data[, proxies]]) :

url: 表示远程数据的路径

data: 以post方式提交到url的数据

proxies:用于设置代理

urlopen返回对象提供方法:

-         read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样

-         info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息

-         getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到

-         geturl():返回请求的url

2. 加上要get或post的数据

http://www.w3school.com.cn/tags/html_ref_httpmethods.asp

两种 HTTP 请求方法:GET 和 POST

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

  • GET - 从指定的资源请求数据。
  • POST - 向指定的资源提交要被处理的数据
  • GET 方法

    请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:

    /test/demo_form.asp?name1=value1&name2=value2
  • POST 方法

    请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:

    POST /test/demo_form.asp HTTP/1.1
    Host: w3schools.com
    name1=value1&name2=value2

   post是以Requst对象的形式发出的,get是以字符串的形式发出的

1. get是从服务器上获取数据,post是向服务器传送数据。

2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

建议:
1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

POST方式:

 1 import urllib2
 2 import urllib
 3 url='http://www.baidu.com/'
 4 data=urllib.urlencode({'name':'jon',
 5                        'location':'www',
 6                        'language':'py'})#data-HTML编码标准形式
 7 req=urllib2.Request (url,data)
 8 print req #<urllib2.Request instance at 0x02B85170>(url,data)的Request对象
 9 res=urllib2.urlopen(req)#也可以直接res=urllib2.urlopen(url,data)
10 print res.read()

GET方式:

如果没有传送data参数,urllib2使用GET方式的请求。

 1 import urllib2
 2 import urllib
 3 url='http://www.baidu.com/'
 4 url_values=urllib.urlencode({'name':'jon',
 5                        'location':'www',
 6                        'language':'py'})#data-HTML编码标准形式
 7 print url_values
 8 #name=jon&language=py&location=www
 9 full_url=url+'?'+url_values
10 res=urllib2.urlopen(full_url)
11 print res.read()

结果也和1一样
3. 加上http头

有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。

默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.7),

这个身份可能会让站点迷惑,或者干脆不工作。

浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。

headers={"User-Agent": 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'#模拟电脑访问,比如糗百网页就必须有这个头

      'Referer': url}

data={...}#这个一般是需要登录访问的页面,用httpfox抓取发送的POST内容

req = urllib2.Request(url, urllib.urlencode(data), headers=headers)  

#hearder也可以这样添加: req.add_header('User-Agent')

response = urllib2.urlopen(req)

最好是转化为Request对象

4 异常检查

得到 HTTP 的返回码

对于 200 OK 来说,只要使用 urlopen 返回的 response 对象的 getcode() 方法就可以得到 HTTP 的返回码。但对其它返回码来说,urlopen 会抛出异常。这时候,就要检查异常对象的 code 属性了。HTTP ,返回200正常,404错误

不过通常的Python APIs异常如ValueError,TypeError等也会同时产生。
HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

except urllib2.HTTPError,e:print e.code

except urllib2.URLError,e:print e.reason

5

原文地址:https://www.cnblogs.com/fkissx/p/3735694.html