Urllib中基本使用一(发送请求)

日常生活中我们浏览的那些网页例如:淘宝,百度,京东等等的网页,表面上看有各种特效和动画,实际上都是由后台的代码(HTML,CSS,JS等)经过浏览器解释才呈现出来的。
今天我们要做的就是爬取网页的源码。

1.urlopen:
import urllib.request

response = urllib.request.urlopen("https://www.taobao.com/")
data = response.read().decode('utf-8')
#这里获取的数据“response”的数据类型是  http.client.HTTPResponse
#所以这里需要将“response”转化,下面我会对这里进行更细一点的讲解
with open("test_one.html", "w", encoding="utf-8") as f:
    f.write(data)
#这里为了方便所以将数据写入文件中

运行结果:
(这里只是一部分截图)

在这里插入图片描述

在这里插入图片描述
这里我们输出一下获取的“response”

import urllib.request

response = urllib.request.urlopen("https://www.taobao.com/")
data = response.read().decode('utf-8')
with open("test_one.html", "w", encoding="utf-8") as f:
    f.write(data)
print(type(response))

运行结果:

<class 'http.client.HTTPResponse'>

通过输出结果可以发现它是一个 HTTPResposne 类型的对象,
它主要包含的方法有 read()、readinto()、getheader(name)、getheaders()、fileno() 等方法和 msg、version、status、reason、debuglevel、closed 等属性。
得到这个对象之后,我们把它赋值为变量,然后就可以调用这些方法和属性,得到返回结果的一系列信息了

实例:

import urllib.request

response = urllib.request.urlopen('https://www.taobao.com')
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))

运行结果:

200
[('Server', 'Tengine'), ('Content-Type', 'text/html; charset=utf-8'), ('Transfer-Encoding', 'chunked'), ('Connection', 'close'), ('Date', 'Tue, 17 Mar 2020 10:50:57 GMT'), ('Vary', 'Accept-Encoding'), ('Vary', 'Ali-Detector-Type'), ('Cache-Control', 'max-age=60, s-maxage=90'), ('X-Snapshot-Age', '2'), ('Content-MD5', 'm5cIuBeU1Bcwxv76OSJ6Vw=='), ('ETag', 'W/"2c5d-170bae03cc4"'), ('Via', 'cache17.l2nu16-1[0,304-0,H], cache28.l2nu16-1[1,0], cache15.cn1247[0,200-0,H], cache15.cn1247[1,0], cache19.cn1624[132,0]'), ('Ali-Swift-Global-Savetime', '1584348288'), ('Age', '11'), ('X-Cache', 'HIT TCP_MEM_HIT dirn:13:867073462'), ('X-Swift-SaveTime', 'Tue, 17 Mar 2020 10:50:46 GMT'), ('X-Swift-CacheTime', '90'), ('Timing-Allow-Origin', '*, *'), ('EagleId', 'dea1d52715844422576844173e, dea1d52715844422576844173e'), ('Set-Cookie', 'thw=cn; Path=/; Domain=.taobao.com; Expires=Wed, 17-Mar-21 10:50:57 GMT;'), ('Strict-Transport-Security', 'max-age=31536000')]
Tengine

三个输出分别输出了响应的状态码,响应的头信息,以及通过调用 getheader() 方法并传递一个参数 Server 获取了 headers 中的 Server 值,结果是 Tengine,意思就是服务器是 Tengine 搭建的。

这里如果我们要给链接传递一些参数怎么办?
我们先看下urlopen的参数说明:

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):

其中url是必填的其他都是选填的,下面我们说一下这些参数的用法:

url 网络地址,是str类型。也可以是一个Request对象。这里我们需要了解url中如果出现了中文或者其他字符,必须进行url编码,当然浏览器默认为我们做了这件事情。否则就会报错。
data 这个是发送求请需要传递的参数。如果要传递data参数,urlopen将使用post方式请求。
timeout 这个是求请超时时长。我们可以设置时长,如果请求时间过长,则会抛出异常。
cafile 这个是CA证书。
capath 这个是CA证书路径。
cadefault=Flase 这个已经被弃用了,不用关注这个了。
context 这个可以指定SSL安装验证设置,比如我们可以设置忽略证书验证等等。

2.Request

经过上面的讲解我们知道通过urlopen()方法我们可以实现最基本的请求的发起,但是这几个简单的参数并不足以构建一个完整的请求,这时我们就需要使用resquest类来构建一个更加完整的请求。
例子:

import urllib.request

request = urllib.request.Request('https://www.taobao.com/')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

这里我们发现我们仍然是使用 urlopen()方法发起请求,但是urlopen()的参数不在是一个路径,而是一个resquest类型的对象。
构建这个对象的优点:一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。

接下看我们看看request()的参数:

def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):

1.url Request结构中的URL字段用于表示请求行中包含的URL
2.data 参数如果要传必须传 bytes(字节流)类型的,如果是一个字典,可以先用 urllib.parse 模块里的 urlencode() 编码。
3.headers 参数是一个字典,这个就是 Request Headers 了,你可以在构造 Request 时通过 headers 参数直接构造,也可以通过调用 Request 实例的 add_header() 方法来添加, Request Headers 最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是 Python-urllib,我们可以通过修改它来伪装浏览器。
4.origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。
5.unverifiable 参数指的是这个请求是否是无法验证的,默认是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个 HTML 文档中的图片,但是我们没有自动抓取图像的权限,这时 unverifiable 的值就是 True。
6.method 参数是一个字符串,它用来指示请求使用的方法,比如GET,POST,PUT等等。

发布了12 篇原创文章 · 获赞 9 · 访问量 635

猜你喜欢

转载自blog.csdn.net/weixin_44189343/article/details/104929206