爬虫学习:使用urllib库

urllib库

是Python中一个最基本的网络请求库,可以模拟浏览器行为,向指定的服务器发送请求,接收数据。

urlopen函数

向服务器发送请求,并接收返回值。基本使用:

from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read().decode())

urlopen函数常用参数:

  1. url: 请求的url
  2. data: 请求的data。urlopen默认使用get请求,如果传递了data参数,则变成post请求。
  3. 返回值:是一个http.client.HTTPResponse对象,该对象是一个类文件句柄对象,可以使用read(size)、readline、readlines以及getcode等方法。

urlretrieve函数

向服务器发送请求,接收返回的数据并保存到文件。常用于下载图片等文件。

常用的有两个参数: 一个是url,是网页请求的地址;另一个是filename,是保存下载内容的文件路径和文件名。如果有需要,还可以象urlopen一样使用data参数。

from urllib import request
request.urlretrieve("http://www.baidu.com", "baidu.html")

urlencode函数

如果url中包含了中文或其它特殊字符,就必须进行编码。urlencode可以把字典数据转换为URL编码的数据。

from urllib import request, parse

base_url = 'http://www.baidu.com/s?'
params = {'name':'张三','age':18,'greet':'hello world'}
q_string = parse.urlencode(params)
print(q_string)
url = base_url + q_string

输出结果:

name=%E5%BC%A0%E4%B8%89&age=18&greet=hello+world

parse_qs函数

可以将经过编码后的url参数进行解码。

from urllib import parse

qs = "name=%E5%BC%A0%E4%B8%89&age=18&greet=hello+world"
data = parse.parse_qs(qs)
print(data)

输出结果:

{'name': ['张三'], 'age': ['18'], 'greet': ['hello world']}

urlparse和urlsplit函数

都是用来解析请求url的,urlparse的结果比urlsplit的结果多了一个params,path项的内容也不一样。

from urllib import parse, request

url = "http://www.baidu.com/s;hello?wd=python&username=abc#1"

result1 = parse.urlparse(url)  # 多了个params参数
print(result1)
result2 = parse.urlsplit(url)
print(result2)

输出结果:

ParseResult(scheme='http', netloc='www.baidu.com', path='/s', params='hello', query='wd=python&username=abc', fragment='1')

SplitResult(scheme='http', netloc='www.baidu.com', path='/s;hello', query='wd=python&username=abc', fragment='1')

request.Request类

如果想要在请求的时候增加一些请求头,可以使用request.Request类来实现。比如要增加一个User-Agent,示例代码如下:

from urllib import request

url = 'https://www.lagou.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}

req = request.Request(url, headers=headers)
resp = request.urlopen(req)
print(resp.read().decode())

ProxyHandler处理器(代理):

  1. 代理的原理:在请求目的网站之前,先请求代理服务器,由代理服务器去请求目的网站,拿到目的网站数据后,再转发给我们。
  2. http://httpbin.org: 这个网站可以方便的查看http请求的一些参数。
  3. 在代码中使用代理:
    • 使用urllib.request.ProxyHandler,传入一个代理,这个代理是一个字典,字典的key依赖于代理服务器能够接收的类型,一般是httphttps,值是ip:port
    • 使用上一步创建的handler,以及request.build_opener创建一个opener对象。
    • 使用上一步创建的opener,调用open函数,发起请求。

示例代码如下:

from urllib import request

#网页地址
url = 'http://httpbin.org/ip'

#创建handler
handler = request.ProxyHandler({'http':'223.241.78.43:8010'})

#创建opener
opener = request.build_opener(handler)

#打开网页,返回网页内容
resp = opener.open(url)

#打印网页内容
print(resp.read().decode())

你可能感兴趣的:(爬虫学习:使用urllib库)