都说好记性不如烂笔头,这是真真实实的硬道理。反观自己,不论是在学校的时候还是现在工作,你会发现很多时候很多东西明明以前会,但是因为没有去记录,等再遇到不会了;很多问题以前碰到过,解决了,还是因为没有整理记录,最后遇到同样的问题时,也许还会记得,也许只能心里暗暗悔恨没有整理记录,但是不管那种,为了给自己省去不必要的麻烦,多多记录总是好的。
最近一直在爬虫,然而代码是“代码一般仿”,一份代码成功后,一直就copy,但是突然发现其实自己并没有去深入或者说简单的了解,所以简单的记录下也让自己重新了解下基本的知识。
用到的库:urllib2
urllib2提供一个基础函数urlopen,通过向指定的URL发出请求来获取数据。
原型:urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
案例1:基本的网页抓取
import urllib2
response=urllib2.urlopen('http://www.baidu.com')
html=response.read()
#重定向的url
print response.geturl()
#响应状态码
print response.code()
#print response.getcode()
#响应信息
print response.info()
HTTP是基于请求—响应模型的,即客户端提出请求,服务端提供响应。urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,并通过调用urlopen传入该Request对象,然后返回一个相关请求response对象,可以在Response中调用read()获取到的网页内容。
response=urllib2.urlopen("http://www.baidu.com"),实际上可以看作两个步骤:
import urllib2
#指定一个域名并发送请求
request=urllib2.request('http://www.baidu.com')
#服务端响应来自客户端的请求
response=urllib2.urlopen(request)
#获取网页内容
html=response.read()
案例2:动态网页抓取
现在大多数网站都是动态网页,需要动态地传递参数给它,然后做出对应的响应。因此,在访问时需要传递数据给它。最常见的情况如登录、注册。
数据传送分为POST和GET两种方式:GET方式是直接以链接形式访问,链接中包含了所有的参数
- POST方式:
import urllib
import urllib2
values = {"username":"aaa","password":"1234"}
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)
html = response.read()
- GET方式:
import urllib
import urllib2
values = {"username":"aaa","password":"1234"}
data = urllib.urlencode(values)
#python2的编码:data = urllib.quote(values)
url = "http://passport.csdn.net/account/login"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
html = response.read()
案例3:添加Headers
有些网站不能直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,因此为了完全模拟浏览器的工作,需要设置一些Headers 的属性。
import urllib
import urllib2
url = 'http://xxx.xxx.com/xxx'
cookie_str=""
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36',
#Referer是用来应付防盗链,服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应
'Referer' : 'http://xxx.xxx.com/xxx/xxx.jsp?city=SZ',
'Connection': 'keep-alive',
'Cookie':cookie_str
}
request = urllib2.Request(url, None, headers)
#request = urllib2.Request(url)
#也可这样添加header:request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36')
#或者request.addheaders = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.9 Safari/537.36'))
response = urllib2.urlopen(request)
html = response.read()
案例4:获取Cookie
案例3中headers包含了cookie,有些场景下需要把cookie传入进去,因此需要获取cookie。
当获取一个URL使用的opener(一个urllib2.OpenerDirector的实例)是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,但是如果需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。
基本流程:创建CookieJar对象→HTTPCookieProcessor对象来创建cookie处理器→构建opener→创建请求→读取数据(保存数据)
打印cookie信息:
import urllib2
import cookielib
#声明一个CookieJar对象实例来保存cookie
cookie = cookielib.CookieJar()
#cookie = cookielib.LWPCookieJar()
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler=urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen,也可以传入request
response = opener.open('http://www.baidu.com')
for item in cookie:
print 'Name = '+item.name
print 'Value = '+item.value
保存cookie到文件:
import cookielib
import urllib2
#设置保存cookie的文件,比如保存在同级目录下的cookie.txt
filename = './cookie.txt'
#声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
#利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
#通过handler来构建opener
opener = urllib2.build_opener(handler)
#创建一个请求,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)
使用urlopen创建请求
import cookielib
import urllib2
from urllib2 import urlopen, Request
cookieFile = "cookies.txt"
testURL = 'http://maps.google.com/'
#为cookie jar 创建实例
cJar = cookielib.LWPCookieJar()
#创建HTTPCookieProcessor的opener对象
opener = urllib2.build_opener( urllib2.HTTPCookieProcessor(cJar))
#安装HTTPCookieProcessor的opener
urllib2.install_opener(opener)
#创建一个Request对象
r = Request(testURL)
#打开HTML文件
h = urlopen(r)
print "页面的头部\n======================"
print h.info()
print "页面的Cookies\n======================"
for ind, cookie in enumerate(cJar):
print "%d - %s" % (ind, cookie)
#保存cookies
cJar.save(cookieFile)
从文件中读取cookie
import cookielib
import urllib2
#创建MozillaCookieJar实例对象
cookie = cookielib.MozillaCookieJar()
#从文件中读取cookie内容到变量
cookie.load('cookie.txt', ignore_discard=True, ignore_expires=True)
#创建请求的request
req = urllib2.Request("http://www.baidu.com")
#利用urllib2的build_opener方法创建一个opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(req)
print response.read()
参考:
https://docs.python.org/2/library/urllib2.html
http://python.jobbole.com/81334/