urllib是一个收集了多个涉及了URL的模块的包:
URL获取网页
urllibtest.pyimport urllib2
response = urllib2.urlopen('http://www.baidu.com')
print(response.read())
运行结果:
C:\Python27\python.exe H:/spiderexercise/spidertest/urllibtest.py
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><meta name="description" content="全球最大的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search"
urlopen()一般接受三个参数。
urlopen(url, data, timeout)
第一个参数 url 即为 URL,第二个参数 data 是访问 URL 时要传送的数据,第三个 timeout 是设置超时时间。 第二三个参数是可以不传送的,data 默认为空 None,timeout 默认为 socket._GLOBAL_DEFAULT_TIMEOUT 第一个参数 URL 是必须要传送的,在这个例子里面我们传送了百度的 URL,执行 urlopen 方法之后,返回一个 response 对象,返回信息便保存在这里面。
response 对象有一个 read 方法,可以返回获取到的网页内容。
print(response.read())
构造request获取网页
urlopen()参数可以传入一个request请求,即Request类的实例。构造request时传入URL,Data。
urllibtest.pyimport urllib2
url = "http://www.baidu.com"
request = urllib2.Request(url)
response = urllib2.urlopen(request)
print(response.read())
POST和GET数据传送
数据传送分为 POST 和 GET 两种方式,两种方式有什么区别呢? 最重要的区别是 GET 方式是直接以链接形式访问,链接中包含了所有的参数,当然如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。POST 则不会在网址上显示所有的参数,不过如果你想直接查看提交了什么就不太方便了
POST方式
我们引入了 urllib 库,现在我们模拟登陆 CSDN
urllibtest.pyimport urllib
import urllib2values = {"username":"1016903103@qq.com","password":"XXXX"}
data = urllib.urlencode(values)
url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print(response.read())
当然上述代码可能登陆不进去,因为 CSDN 还有个流水号的字段,没有设置全,比较复杂在这里就不写上去了,在此只是说明登录的原理。一般的登录网站一般是这种写法。 我们需要定义一个字典,名字为 values,参数我设置了 username 和 password,下面利用 urllib 的 urlencode 方法将字典编码,命名为 data,构建 request 时传入两个参数,url 和 data,运行程序,返回的便是 POST 后呈现的页面内容。
GET方式
至于 GET 方式我们可以直接把参数写到网址上面,直接构建一个带参数的 URL 出来即可。
import urllib
import urllib2values={}
values['username'] = "1016903103@qq.com"
values['password']="XXXX"
data = urllib.urlencode(values)
url = "http://passport.csdn.net/account/login"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print(response.read())
可以 print geturl,打印输出一下 url,发现其实就是原来的 url 加?然后加编码后的参数
http://passport.csdn.net/account/login?username=1016903103%40qq.com&password=XXXX