1.python标准库urllib的使用[入门]

该篇文章, 主要介绍了几个urllib中常用的类函数。

1.urllib——处理URL

urllib 是一个收集了多个用到 URL 的模块的包, 是python标准库的一员

  • urllib.request 打开和读取 URL
  • urllib.error 包含 urllib.request 抛出的异常
  • urllib.parse 用于解析 URL
  • urllib.robotparser 用于解析 robots.txt 文件

1.1. urllib.request 模块——打开读取URL

urllib.request 模块定义了适用于在各种复杂情况下打开 URL(主要为 HTTP)的函数 — 例如基本认证、摘要认证、重定向、cookies 及其它。

1.1.1函数

  • urllib.request.urlopen(url,...) , 打开url指定的资源, url可以是字符串也可以是urllib.request.Request对象, 返回一个http.client.response对象

  • urllib.request.``build_opener([handler, ...])

    返回一个OpenerDirector实体


1.1.2.类

  • class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

    这个类是一个对URL 请求的抽象

    • 其中url参数, 是字符串类型, 是对应资源的url。
    • header参数, 是一个字典类型的请求消息头。
  • class urllib.request.OpenerDirector

    该类通过连接在一起的BaseHandlers打开url。它管理handlers链和从错误中恢复。

    OpenerDirector实例的open(url, data=None[, timeout]) 方法, 打开一个url。它的返回值和引起的异常和urllib.request.urlopen()一样。

  • class urllib.request.ProxyHandler(proxies=None)

    通过代理发出请求, 如果proxies参数被给与, 它必须是一个字典(从协议到IP映射的字典)


1.2. urllib.parse ——解析URL

  • urllib.parse.urlencode(query,...)

    mapping object或包含str或bytes对象的二元组的序列转换为百分比编码的ASCII文本字符串。


1.3. 示例

最简单的一个示例

# -*- coding:utf-8 -*-
from urllib import request
url = "http://www.baidu.com"
#打开url对应的资源 返回一个响应对象,类型为http.client.http.client.HTTPResponse
resp = request.urlopen(url)
#read()方法返回字节串
r_content = resp.read() 
#解码
r_text = r_content.decode("utf-8") 
print(r_text)


对于一些网站可能会通过请求头,进行反爬虫的限制。所以可以通过要Resquest对象, 设置headers, 示例如下。

# -*- coding:utf-8 -*-

# urllib 是一个收集了多个用到URL的模块包, 是python标准库中的一员

from urllib import request
import urllib.response

url = "https://tieba.baidu.com/f"
header = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36",

}
resp = request.urlopen(request.Request(url, headers=header))  # 打开指定url的资源, 可以是url可以是字符串也可以是urllib.request.Request对象, 返回一个http.client.HTTPResponse对象
r_content = resp.read() #读取响应的实体内容, 返回的是bytes型
r_text = r_content.decode("utf-8") #解码成utf-8


print(type(resp)) #打印出resp的类型
print(resp.version) #打印http协议版本
print(resp.status) # 状态码
print(resp.url) #打印url
print(resp.headers) #响应消息头
print(r_text) #打印实体内容


对于带有中文请求参数的url , 需要用到urllib.parse模板

# -*- coding:utf-8 -*-

# urllib 是一个收集了多个用到URL的模块包, 是python标准库中的一员

from urllib import request
from urllib import parse
url = "https://tieba.baidu.com/f"

data = {
    "kw":"北京"
}

data_string = parse.urlencode(data)

new_url = url+"?"+data_string

resp = request.urlopen(new_url)

text_content = resp.read().decode("utf-8")

with open("tieba.html", "w", encoding="utf-8") as fp:
    fp.write(text_content)s

代理设置 一篇讲解设置代理的文章

from urllib import request

url = "https://www.runoob.com/w3cnote/python-pip-install-usage.html"
header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'
}
req = request.Request(url, headers=header)
#实例一个代理处理的类, 参数是一个字典(字典是,协议到IP的映射)
Ip = request.ProxyHandler({
        'http':'118.187.58.34:53281',
                           })

#获取一个OpenerDirector对象
opener = request.build_opener(Ip,request.HTTPHandler)

#打开被给于的url, 返回的值或异常 与urllib.request.urlopen()方法一样
resp = opener.open(req)
text = resp.read().decode('utf-8')
print(text[:500])

参考

  • python官方文档urllib.request https://docs.python.org/zh-cn/3.7/library/urllib.request.html#request-objects
  • python官方文档urllib.parse https://docs.python.org/zh-cn/3.7/library/urllib.parse.html#module-urllib.parse
  • 陈桑啊丶. urllib库发送get和post请求 https://www.cnblogs.com/chensang/p/10096352.html
  • python官方文档http.client https://docs.python.org/zh-cn/3.7/library/http.client.html
  • python官方文档urllib https://docs.python.org/zh-cn/3.7/library/urllib.html

你可能感兴趣的:(数据采集python)