Python2
import urllib2
response = urllib2.urlopen('http://www.baidu.com')
Python3
import urllib.request
respnse = urllib.request.urlopen('http://www.baidu.com')
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
import urllib.request
response = urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode('utf-8'))
post请求:
ttp://httpbin.org HTTP测试的网址
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode(('world','hello')),encodeing='utf8')
response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read())
超时的设置:
import urllib.request
response = urllib.request.urlopen("http://httpbin.org/get",timeout=1)
print(response.read().decode('utf-8'))
import socket
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.1)
except urllib.error.URLError ad e:
if isinstance(e.reason,socket.timeout);
print("TIME OUT")
import urllib.request
response = urllib.request.urlopen("http://httpbin.org")
print(type(response))
import urllib.request
response = urllib.request.urlopen("http://httpbin.org")
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))
import urllib.request
response = urllib.request.urlopen("http://httpbin.org")
print(response.read().decode('utf-8'))
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
import urllib.request
request = urllib.request.Request("https://python.org")
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
增加headers信息:
from urllib import request, parse
url = 'http://httpbin.org/post'
headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Host': 'httpbin.org'
}
dict = {
'name': 'Germey'
}
data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
通过4个参数构造了一个请求,其中url即请求URL,headers中指定了User-Agent和Host,参数data用urlencode()和bytes()方法转成字节流。另外,指定了请求方式为POST。
from urllib import request,parse
#构造一个POST请求
url='http://httpbin.org/post'
dict={
'name':'Germey'
}
data=bytes(parse.urlencode(dict),encoding='utf8')#fontdata数据
req=request.Request(url=url,data=data,method='POST')#构建一个Request()的一个结构
req.add_header('User-Agent','................')#用add_header方法来添加header信息
response = request.urlopen(req)
print(response.read().decode('utf-8'))
add_header()方法作为添加header的另一种方式,可以用来比较复杂的情况,比如要添加许多键值对,那么可以用一个for循环来不断调用这个方法,这也是比较方便的
Headler相当于一个辅助工具,来帮助我们处理一些额外的工作,比如FTP、Cache等等操作,我们都需要借助Headler来实现。比如在代理设置的时候,就需要用到一个ProxyHandler。更多的用法,请参阅官方文档。
用来对ip地址进行伪装成不同地域的,防止ip在爬虫运行时被封掉。
from urllib import request
proxy_handler = request.ProxyHandler( #构建ProxyHandler,传入代理的网址
{'http':'http://127.0.0.1:9743',
'https':'https://127.0.0.1:9743'
}) #实践表明这个端口已经被封了,这里无法演示了
opener = request.build_opener(proxy_handler)#再构建一个带有Handler的opener
response = opener.open('http://www.baidu.com')
print(response.read())
Cookie是在客户端保存的用来记录用户身份的文本文件。
在爬虫时,主要是用来维护登录状态,这样就可以爬取一些需要登录认证的网页了。
from urllib import request
from http import cookiejar
cookie =cookiejar.CookieJar()#将cookie声明为一个CookieJar对象
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response =opener.open('https://www.hao123.com')#通过opener传入,并打开网页
for item in cookie:#通过遍历把已经赋值的cookie打印出来
print(item.name+'='+item.value)#通过item拿到每一个cookie并打印
我们还可以把cookie保存成文本文件,若cookie没有失效,我们可以从文本文件中再次读取cookie,在请求时把cookie附加进去,这样就可以继续保持登录状态了。
from urllib import request
from http import cookiejar
filename="cookie.txt"
cookie=cookiejar.MozillaCookieJar(filename)
#把cookie声明为cookiejar的一个子类对象————MozillaCookieJar,它带有一个save方法,可以把cookie保存为文本文件
handler=request.HTTPCookieProcessor(cookie)
opener=request.build_opener(handler)
response=opener.open('https://www.hao123.com')
cookie.save(ignore_discard=True,ignore_expires=True)#调用save方法
执行代码后,我们就可以在运行目录下找到已经保存好的cookie文本文件了:
还有另外一种格式:
在上面那段代码的基础上,换一个子类对象就可以了:
cookie=cookiejar.LWPCookieJar(filename)
from urllib import request
from http import cookiejar
filename="cookie.txt"
cookie=cookiejar.LWPCookieJar(filename)
#把cookie声明为cookiejar的一个子类对象————MozillaCookieJar,它带有一个save方法,可以把cookie保存为文本文件
handler=request.HTTPCookieProcessor(cookie)
opener=request.build_opener(handler)
response=opener.open('https://www.hao123.com')
cookie.save(ignore_discard=True,ignore_expires=True)#调用save方法
我们可以选择相对应的格式来完成读取。以上面的LWP格式为例:
from urllib import request
from http import cookiejar
cookie=cookiejar.LWPCookieJar() #z注意选择相应的格式,这里是LWP
cookie.load('cookie.txt',ignore_discard=True,ignore_expires=True)#load方法是读取的关键
handler=request.HTTPCookieProcessor(cookie)
opener=request.build_opener(handler)
response=opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
以上的代码就可以完成读取了。这样,我们就可以在对网页进行请求时,自动把之前的cookie附着进去,以保持一个登录的状态了。
这是属于urllib的另一大模块
from urllib import request,error
#我们试着访问一个不存在的网址
try:
response = request.urlopen('http://www.cuiqingcai.com/index.html')
except error.URLError as e:
print(e.reason)#通过审查可以查到我们捕捉的异常是否与之相符
可以看到,返回了错误信息。这样的异常处理可以保证爬虫在工作时不会轻易中断。
那么,urllib可以捕捉哪些异常呢?详见官方文档。
其实一般碰到有两个:HTTP和URL。我们一般只需要捕捉这两个异常就可以了。
from urllib import request,error
#我们试着访问一个不存在的网址
try:
response = request.urlopen('http://www.cuiqingcai.com/index.html')
except error.HTTPError as e:#最好先捕捉HTTP异常,因为这个异常是URL异常的子类
print(e.reason,e.code,e.headers,sep='\n')
except error.URLError as e:
print(e.reason)
else:
print('Request Successfully!')
如上,打印出了错误的相关信息。
此外,e.reason也是一个类,它可以得到异常的类型。
我们试着看看:
from urllib import request,error
import socket
try:
response = request.urlopen('http://www.baidu.com',timeout = 0.01)#超时异常
except error.URLError as e:
print(type(e.reason))
if isinstance(e.reason,socket.timeout):#判断error类型
print('TIME OUT')
这是一个工具性质的模块,即拿即用就行。
官方文档
这个方法将将url进行分割,分割成好几个部分,再依次将其复制。
urllib.parse.urlparse(urlstring,scheme=‘’,allow_fragments = True)
#分割成(url,协议类型,和#后面的东西)
urllib.parse.urlparse将一个url解析成6个组件,返回一个6个项目名元组:scheme(协议), netloc(域名), path(相对路径),params(参数), query(请求), fragment(片段识别)
来看具体的例子:
from urllib.parse import urlparse
result = urlparse('https://www.baidu.com/s?wd=urllib&ie=UTF-8')
print(type(result), result) #
# 无协议类型指定,自行添加的情况
result1 = urlparse('www.baidu.com/s?wd=urllib&ie=UTF-8', scheme='https')
print(result1)
# 有指定协议类型,默认添加的情况?
result2 = urlparse('http://www.baidu.com/s?wd=urllib&ie=UTF-8', scheme='https')
print(result2)
# allow_fragments参数使用
result3 = urlparse('http://www.baidu.com/s?#comment', allow_fragments=False)
print(result3)
result4 = urlparse('http://www.baidu.com/s?wd=urllib&ie=UTF-8#comment', allow_fragments=False)
print(result4)
# allow_fragments=False表示#后面的东西不能填,原本在fragment位置的参数就会往上一个位置拼接,可以对比result1和result2的区别
这个函数用来拼接url。
看看这个例子:
from urllib.parse import urlunparse
#注意即使是空符号也要写进去,不然会出错
data = ['http', 'www.baidu.com', 'index.html','user','a=6' 'comment',' ']
print(urlunparse(data))
这个函数用来拼合url。
通过例子感受以下:
以后面的参数为基准,会覆盖掉前面的字段。如果后面的url,存在空字段而前面的url有这个字段,就会用前面的作为补充。
from urllib.parse import urljoin
print(urljoin('http://www.baidu.com','FQA.html'))
#http://www.baidu.com/FQA.html
print(urljoin('http://www.baidu.com','http://www.caiqingcai.com/FQA.html'))
#http://www.caiqingcai.com/FQA.html
print(urljoin('https://www.baidu.com/about.html','http://www.caiqingcai.com/FQA.html'))
#http://www.caiqingcai.com/FQA.html
print(urljoin('http://www.baidu.com/about.html','https://www.caiqingcai.com/FQA.html'))
#https://www.caiqingcai.com/FQA.html
from urllib.parse import urlencode
params = {
'name': 'zhuzhu',
'age': '23'
}
base_url = 'http://www.baidu.com?'
url = base_url + urlencode(params) # 将params对象编码转换
print(url)
用来解析robot.txt。用的比较少,这里不再赘述。详情参考