欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫基础 || 1.2 urllib.request

程序员文章站 2022-05-03 21:34:19
...

疫情爆发的第20天,更新了一点内容~~

我们知道利用 urlopen()方法可以实现最基本请求的发起,但这几个简单的参数并不足以构建一 个完整的请求。 如果请求中需要加入 Headers 等信息,就可以利用更强大的 Request 类来构建。
我们依然是用 urlopen()方法来发送这个请求,只不过这次该方法的参数不再是 URL, 而是一个 Request 类型的对象。 通过构造这个数据结构,一方面我们可以将请求独立成一个对象,另 一方面可更加丰富和灵活地配置参数。

import urllib.request 
request = urllib.request.Request('https://python.org') 
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

这样同样能得到'https://python.org'网页源码。

那么Request可以通过怎样的参数来构造,

URL,这是必传参数,其他都是可选参数。

data,必须传 bytes (字节流)类型的。 如果它是字典,可以先用 urllib.parse 模块里的 urlencode()编码。

headers,是一个字典,它就是请求头,我们可以在构造请求时通过 headers 参数直 接构造,也可以通过调用请求实例的 add_header()方法添加。 添加请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent 是Python-urllib ,我们可以通过修改它来伪装浏览器。

origin_req_host,指的是请求方的 host名称或者 IP 地址。 unverifiable,表示这个请求是否是无法验证的,默认是 False,意思就是说用户没有足够权限来选择接收这个请求的结果。 例如,我们请求一个 HTML 文档中的图片,但是我 们没有向动抓取图像的权限,这时 unverifiable的值就是 True。

method,是一个字符串,用来指示请求使用的方法,比如 GET、 POST 和 PUT 等。

下面我们传入多个参数构建请求来看一下 : 这里我们通过 4个参数构造了一个请求,其中 url 即请求 URL, headers 中指定了 User-Agent 和 Host,参数 data 用 urlencode()和 bytes()方法转成字节流。 另外,指定了请求方式为 POST。

from urllib import request,parse
url = 'http://httpbin.org/post'
headers = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
          'Host':'httpbin.org'}
dict = {'name':'Germey'}
data= bytes(parse.urlencode(dict), encoding='utf8') 
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req) 
print(response.read().decode('utf-8')) 

得到结果如下

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "Germey"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"
  }, 
  "json": null, 
  "origin": "112.49.156.179, 112.49.156.179", 
  "url": "https://httpbin.org/post"
}
# 另外, headers 也可以用 add_header()方法来添加:
req = request.Request(url=url, data=data, method= 'POST') 
req.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')

参考资料:《python3 网络爬虫开发实践》-崔庆才

相关标签: Python代码 爬虫