python3爬虫实践(三)——urllib 库

urllib 库

  • urllib 库是 python 中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。

1、urlopen 函数

  • 在 python3 的 urllib 库中,所有和网络请求有关的方法,都被集到 urllib.request 模块下了,下面看下 urlopen 函数基本的使用:
from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read())
#print(resp.read(10))    读取10个字节
  • 输出的结果是百度网页的源代码。
  • 下面是 urlopen 函数的基本格式:
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):
  • 参数解释如下:
url请求的 URL
data请求的 data,如果设置了这个值,那么将变成 post 请求,默认是 get 请求
timeout指定超时时间
返回值是一个 http.client.HTTPResponse 对象,这个对象是一个类文件句柄对象。有 read(size)、readline、readlines 以及 getcode(获取状态码) 方法

2、urlretrieve 函数

  • 这个函数可以方便的将网页上的文件保存到内地。以下代码可以非常方便的将百度的首页下载到本地:
from urllib import request
request.urlretrieve('http://www.baidu.com','baidu.html')
  • 下面是 urlretrieve 函数的基本格式:
def urlretrieve(url, filename=None, reporthook=None, data=None):
  • filename 是 html 文件的存储路径。urlretireve 函数除了下载 html 文件,还可以下载网页上的图片文件、视频文件等,只需要变换下前两个参数即可。

3、urlencode 函数

  • 用浏览器发送请求的时候,如果 URL 中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行编码。而如果使用代码发送请求,那么就必须手动的进行编码,这时候就应该使用 urlencode 函数来实现。urlencode 可以把字典数据转换为 URL 编码的数据。实例代码如下:
from urllib import parse
data = {'name':"爬虫基础",'greet':"Hello World",'age':100}
qs = parse.urlencode(data)
print(qs)
  • 输出结果如下:

在这里插入图片描述

  • 下面是 urlencode 函数的基本格式:
def urlencode(query, doseq=False, safe='', encoding=None, errors=None,
              quote_via=quote_plus):
  • 在举个例子:
from urllib import request
from urllib import parse

url = 'http://www.baidu.com'
param = {'wd':"胡歌"}
qs = parse.urlencode(param)
url = url + '?' + qs
resp = request.urlopen(url)
print(resp.read())

4、parse_qs 函数

  • 可以将经过编码后的 URL 参数进行解码。实例代码如下:
from urllib import parse
qs ='name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=Hello+World&age=100'
print(parse.parse_qs(qs))
  • 输出结果如下:
    在这里插入图片描述

5、urlparse 和 urlsplit 函数

  • 有时候拿到一个 URL ,想要对这个 URL 中的各个组成部分进行分割,那么这时候就可以使用 urlparse 或者是 urlsplit 来进行分割。实例代码如下:
from urllib import request
from urllib import parse
rl = 'http://www.baidu.com/s?username=zhiliao'
result = parse.urlsplit(url)
#result = parse.urlparse(url)

print('scheme:',result.scheme)
print('netloc:',result.netloc)
print('path:',result.path)
print('query:',result.query)
  • 输出结果如下:
    在这里插入图片描述

6、request.Request 类

  • 如果想要在请求的时候增加一些请求头(多用于应对有反爬虫机制的网站),那么就必须使用 request.Request 类来实现。比如要增加一个 User-Agent,实例代码如下:
from urllib import request

url = 'https://www.lagou.com/zhaopin/Java/?labelWords=label'
headers = {
    'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
req = request.Request(url,headers=headers)
resp = request.urlopen(req)
print(resp.read())
  • 怎么获取 User-Agent 可以自行百度,这个很简单。在有些时候,只增加 User-Agent 仍然是不够的,还是会被拒绝访问,这个时候可以在请求头多增加一些数据。再举个例子,代码如下:
from urllib import request
from urllib import parse

headers = {
    'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"  
    'Referer':"https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput="
}
data = {
	'first' = 'true',
	'pn' = 1,
	'kd' = 'python'
}
url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
req = request.Request(url,headers = headers,data = parse.urlencode(data).encode('utf-8'),method = 'POST')
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
  • 可以看到,在请求头中添加了 Referer 参数,这个是丰富请求头,没有这个的话,在爬取网页时可能会出现“您操作太频繁,请稍后再访问”的回复。还有就是这个 URL 是通过Chrome抓包获取的,有些时候这个 URL 都不能获取,直接会提示访问过于频繁啥的,有基础的可能会想到制作一个IP池,一直更换自己的IP就不会出现访问频繁的现象。

7、ProxyHandler 处理器(代理设置)

  • 很多网站会检测某一段时间某个IP的访问次数(通过流量统计、系统日志等),如果访问次数多的不像正常人,他会禁止这个IP的访问。所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。urllib 中通过 ProxyHandler 来设置使用代理服务器,下面代码说明如何使用自定义 opener 来使用代理:
from urllib import request
# 使用代理,字典的 key 是代理IP支持的协议,value 是代理IP值,冒号后是代理服务器的端口号
handler = request.ProxyHandler({'http':''218.66.161.88:31769})
opener = request.build_opener(handler)
req = request.Request('http://httpbin.org/ip')
resp = opener.open(req)
print(resp.read())
  • 常用的代理有:西刺免费代理;快代理;云代理
  • http://httpbin.org 这个网站可以方便的查看 http 请求的一些参数
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值