爬虫之urllib网络库(1)

urllib(内置库)最基本的一个应用就是向服务端发送HTTP请求,然后接受返回的响应数据

  1. 用urlopen函数发送HTTP GET请求比较简单,下面举一个简单例子
    import urllib.request as ur
    response = ur. urlopen(''https://baidu.com')#urlopen返回一个对象
    print(response.read().decode('utf-8'))
    

  2. 用urlopen函数发送HTTP POST请求,该函数默认发送get请求,若要发送POST请求,需要使用data命名参数(bytes类型)如下:
    import urllib.request
    #将表单转化bytes类型,用utf-8编码
    data=bytes(urllib.parse.urlencode({'name':'Bill','age':30}),encoding='utf-8')
    print("data:",data)
    #发送http POST请求
    response=urllib.request.urlopen('http://httpbin.org/post',data=data)
    print("response:",response)
    #输出响应数据
    print(response.read().decode('utf-8'))

    这段代码一开始提供了一个字典形式的表单数据,然后使用 urlencode 方法将字典类型的表单转 换为字符串形式的表单,接下来将字符串形式的表单按 utf-8 编码转换为 bytes 类型,这就是要传给 urlopen 函数的 data 命名参数的值,要注意,一旦指定了 data命名参数,urlopen 函数就会向服务端提 交 HTTP POST 请求,这里并不需要显式指定要提交的是 POST 请求。 本例将 HTTP POST 请求提交给了 http://httpbin.org/post,这是一个用于测试 HTTP POST 请求的 网址,如果请求成功,服务端会将 HTTP POST 请求信息原封不动地返回给客户端。

前两种方法只是一个比较简单的例子,如果要是访问大量数据的话,就这样来写的会被服务端识别为爬虫,进而反爬,所以如果用爬虫向服务端发送HTTP请求,通常需要模拟浏览器的HTTP请求,也就是让服务端认为客户端是浏览器,而不是爬虫,模拟浏览器发送HTTP请求,需要设置名为user agent(用户代理)的请求头,前两个例子中发送HTTP请求,请求头使用的都是默认值。

urlopen 函数本身并没有设置 HTTP 请求头的命名参数,要想设置 HTTP 请求头,需要为 urlopen 函数传入Request 对象,可以通过 Request 类构造方法的 headers 命名参数设置 HTTP请求头。

from urllib import request
from urllib.parse import unquote,urlencode
import base64

url = 'http://httpbin.org/post'
headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
    'Host':'httpbin.org',
    'Chinese1':urlencode({'name':'李宁'}),

    'MyChinese':base64.b64encode(bytes('这是中文HTTP请求头',encoding='utf-8')),
    'who':'Python Scrapy'#自定义请求头
}
#定义表单数据
dict = {
        'name':'Bill',
        'age':30
        }
#先将表单数据进行编码,再转换为bytes形式
data = bytes(urlencode(dict),encoding='utf-8')
#创建Request对象,通过Request类的构造方法指定了表单数据和HTTP请求头
req = request.Request(url = url,data=data,headers=headers,method="POST")
#通过Request对象add_header方法添加请求头
req.add_header('Chinese2',urlencode({"国籍":"中国"}))
print(req)
#urlopen函数通过Request对象向服务端提交HTTP POST请求(带HTTP请求头的请求方法)
response = request.urlopen(req)

value = response.read().decode('utf-8')
print(value)
import json

responseObj = json.loads(value)

print(unquote(responseObj['headers']['Chinese1']))
print(unquote(responseObj['headers']['Chinese2']))
print(str(base64.b64decode(responseObj['headers']['Mychinese']),'utf-8'))


Request 类的构造方法不仅能指定请求头,还可以指定很多其他信息,下面是 Request 类构造方法 参数的作用。 

(1)url:用于发送请求的 URL,必选参数,其他参数都是可选参数。 

(2)data:要提交的数据,该参数类型必须是 bytes.形式。如果要传输的数据类型是字典,需要用 urllib,parse.urlencode 函数进行编码。

(3)headers:请求头,是一个字典类型的数据,我们可以在构造请求时通过 headers 命名参数直 接构造,也可以通过 Request 对象的 add_header 方法后期添加。 

(4)origin_req_host:请求方的 host 名称或 IP 地址。 

(5)unverifiable:表示这个请求是否是无法验证的,默认是 False,意思就是说用户没有足够的 权限来选择接收这个请求的结果。例如,请求一个 HTML 文档中的图像,但是没有自动抓取图像的权 限,这时 unverifiable 的值就是 True。 

(6)method:用来指定请求的方法,如 GET、POST、PUT 等。 如果指定了 data 参数,urlopen 函数就会发送 POST 请求,所以通常不需要指定 method 参数,不 过为了让程序更容易理解,也可以指定 method 参数。但当设置了 data 参数,而将 method 参数值设为 GET,那么 data 指定的表单数据并不提交给服务端。

以上就是urllib网络库的一些简单知识,欲知更多,关注小编,带你进入爬虫之urllib网络库(2)哦(不要总是白嫖,关注一波不迷路不香吗)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值