Python爬虫从入门到进阶(2)之urllib库的使用

1.什么是Urllib(官网地址:https://docs.python.org/3/library/urllib.html#module-urllib)

Urllib是python内置的HTTP请求库

包括以下模块:

  urllib.request 请求模块

  urllib.error 异常处理模块

  urllib.parse url解析模块

  urllib.robotparser robots.txt解析模块

2.urllib.request

  (1)urllib.request.urlopen(urldata=None, [timeout, ]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

1 参数简介:
url:是字符串类型或者 Request 对象
data:必须是指定要发送到服务器的额外数据的对象,如果不需要这样的数据,则为None。
timeout:可选,为阻塞操作指定以秒为单位的超时时间。不指定,将使用全局默认超时设置,实际上只适用于HTTP、HTTPS和FTP连接。
context:如果指定了 context,它必须是 ssl.SSLContext 的实例
cafile,capath:可选参数为HTTPS请求指定一组受信任的CA证书
2.返回值:对于HTTP和HTTPS url,该函数返回 http.client.HTTPResponse对象
 # 1.urlopen中 url 参数的使用以及 Response 的使用
def get():
request_url = 'http://www.python.org/'
# 创建请求对象
request = Request(request_url)
response = urlopen(request, context=ssl._create_unverified_context()) # 响应体:Response相关的使用
print(type(response)) # <class 'http.client.HTTPResponse'>
print(response.status) #
print(response.getheaders())
print(response.getheader('Server')) # nginx # response.read()读取网页的全部内容
data = response.read()
# response.readline() 读取网页的一行内容
data_line = response.readline()
print(data)
print(data_line) # 2.带参数的 get 方法
def get_params():
request_url = 'http://httpbin.org/get?name={}'
# 拼接参数
# keyword = 'nalanrongruo'
keyword = '纳兰容若'
final_url = request_url.format(quote(keyword))
# quote(keyword) 将包含汉字的网址进行转译,要不然会报错: UnicodeEncodeError: 'ascii' codec can't encode characters in position
# 10-11: ordinal not in range(128) python是解释性语言;解析器只支持ascii(0-127)
print(final_url)
request = Request(final_url)
response = urlopen(request) data = response.read().decode('utf-8') print(data) # 3.get的字典参数
def get_dict_params():
base_url = 'http://httpbin.org/get?'
params = {
'wd': '纳兰容若',
'name': '纳兰容若',
'age': ''
}
# 将字典或者元祖转换成URL可识别
str_params = urlencode(params)
print(str_params)
request_url = base_url + str_params # 如果你的url已经是计算机可以识别的状态,那么不转换
end_url = quote(request_url, safe=string.printable)
print(end_url) # 返回的响应对象
response = urlopen(end_url) print(response.read().decode('utf-8'))

  (2)urllib.request.build_opener([handler...])

 参数:BaseHandler的实例或者子类:ProxyHandler(如果检测到代理设置)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、
FTPHandler、FileHandler、HTTPErrorProcessor。  

  (3)class urllib.request.Request(urldata=Noneheaders={}origin_req_host=Noneunverifiable=Falsemethod=None)

  Request :这个类是URL请求的抽象。

  url:是包含可用 URL 的字符串类型

  data:必须是指定要发送到服务器的额外数据的对象,如果不需要这样的数据,则为None。对于 HTTP POST 请求data 必须是标准application/x-www-form-urlencoded格式化

  headers:是一个字典,并将被视为使用每个键和值作为参数调用add_header()。这通常用于“欺骗”用户代理头值,浏览器使用该头值来标识自身——一些HTTP服务器只允许来自普通浏览器的请求,而不允许来自脚本。如果参数不为空,则应包含Content-Type头。如果没提供 header,且 data 不是 None,则应该添加默认的Content-Type: application/x-www-form-urlencoded

  method:是一个字符串,该字符串指示将使用的HTTP请求方法。如果提供,它的值存储在方法属性中,并由get_method()使用。如果data为空,默认为“GET”,否则为“POST”。
子类可以通过在类本身中设置方法属性来指示不同的默认方法。

 # post请求
def post():
request_url = 'http://httpbin.org/post'
data = {
'wd': '纳兰容若',
'name': '纳兰容若',
'age': ''
}
# 返回的响应对象
response = urlopen(request_url, data=data)
print(response.read().decode('utf-8')) # 4.添加请求头,模拟真实浏览器器发送请求
def request_header():
request_url = 'http://httpbin.org/get'
# 创建请求对象
# 1) 添加 header
# headers = {
# 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
# 'Chrome/70.0.3538.102 Safari/537.36'
# }
# request = Request(request_url, headers=headers) # 2).动态的添加header的信息
request = Request(request_url)
request.add_header('User-Agent',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/70.0.3538.102 Safari/537.36') response = urlopen(request)
print(response.read().decode('utf-8')) # 5.随机添加User-Agent,避免被屏蔽
def random_request_header():
# 百度一下:https://blog.csdn.net/rookie_is_me/article/details/81634048
user_agent_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
'Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50',
'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET '
'CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)'] # 每次请求的浏览器都是不一样
random_user_agent = random.choice(user_agent_list)
print(random_user_agent)
request_url = 'http://www.python.org/'
request = Request(request_url)
# 增加对应请求头的信息
request.add_header("User-Agent", random_user_agent)
response = urlopen(request, context=ssl._create_unverified_context()) print(response) # 打印请求头信息
print(request.get_header("User-agent"))

  (4)各种高级用法handler

 # 6.高级用法各种handler
def http_handler_opener():
# 系统的方法_have_ssl CA证书安全 套阶层
# 系统的urlopen这个方法没有实现加ip的方法
url = "http://www.baidu.com/" # 创建自己的处理器
handler = HTTPHandler()
# 创建自己的opener
opener = build_opener(handler)
# 用自己创建的opener来发送请求
response = opener.open(url) data = response.read().decode("utf-8")
print(data) def proxy_handler():
url = "http://www.baidu.com/" # 添加代理
# 免费ip
proxy = {
"http": "http://112.87.71.146:9999"
} # 代理ip处理器
ip_handler = ProxyHandler(proxy)
# 创建自己的opener
opener = build_opener(ip_handler)
# 拿着代理ip发送网络请求
response = opener.open(url, timeout=10)
data = response.read().decode("utf-8")
print(data) def random_proxy_handler():
proxy_list = [
{"http": "http://119.101.116.204:9999"},
{"http": "hhttp://119.101.119.33:9999"},
{"http": "http://117.85.49.123:9999"},
{"http": "http://112.85.167.223:9999"},
{"http": "http://119.101.112.145:9999"}
]
for proxy in proxy_list:
# print(proxy)
# 利用对应遍历出来的ip地址创建处理器
ip_handler = ProxyHandler(proxy)
# 利用处理器创建opener
opener = build_opener(ip_handler)
try:
response = opener.open("http://www.baidu.com", timeout=10)
data = response.read()
print(data)
except Exception as e:
print(e) def auth_user():
# 1.定义账号和密码
user = "admin"
pwd = ""
nei_url = "http://www.baidu.com" # 创建密码管理器
pwd_manager = HTTPPasswordMgrWithDefaultRealm() pwd_manager.add_password(None, nei_url, user, pwd) # 创建认证处理器
auth_handler = HTTPBasicAuthHandler() opener = build_opener(auth_handler) response = opener.open(nei_url, timeout=10)
print(response.read())

3.urllib.error

是urllib.request引发的异常定义异常类。基本异常类是URLError

urllib.error.URLError

urllib.error.HTTPError

 def error():
url = "https://blog.csdn.net/weidan0302/article/details/110" try:
urlopen(url, context=ssl._create_unverified_context())
except urllib.error.HTTPError as error:
print(error.code) except urllib.request.URLError as error:
print(error)

点击下载代码

上一篇:从创建webservice到发布webservice的一些相关总结


下一篇:Lost's revenge - HDU 3341 (自动机+DP)