Q&A

Q1 如何请求一个 url

  • 通过 Request 类创建一个实例,可以通过该实例对象设置 url,请求头,请求体中的 post 内容,请求方法等内容。
  • 可以使用 urlopen 方法,后者可以接受一个 Request 类获得响应。
  • 如果想要获取 cookie,或者通过基础认证,需要用到处理器。前者用到 HandleCookieProcessor 处理器,这个处理器要接受 CookieJar 类型的参数,后者要用到 HTTPPassMgr 来管理账户密码,并使用该类作为参数构造 HTTPBasicAuthHandler 类。这些类都是 Handler 的基类,而只要是 Handler 的基类都可以作为 build_opener 函数的参数,来创建一个启动器(opener),可以用 opener 接受 Request 类型的参数来进行请求。

Q2 如何解析一个 url

  • 需要使用 urllib.parse 模块中的一些 API。
  • 例如,通过 urlparse 来解析 url 中的各个部分
  • 例如,通过 urlopen 来进行 url 之间的拼接
  • 例如,urlencode 来完成从字典到查询参数(query)之间的转换。

urllib 库

request 模块

urlopen 函数

url: 接受一个字符串,代表网址;
data:接受一个字符串,代表数据的内容,注意这里的参数并非 url 中的参数,而是 post 请求中的提交的内容。一般使用 urlencode 函数完成从字典类型到满足格式的字符串的转化。
timeout: 接受一个数字,代表能最大程度接受的响应时长。如果对 url 的请求无法在 timeout 时间内得到响应,那么程序将会抛出异常 urllib.error.URLError
返回值类型为 http.client.HTTPResponse 类。
或者接受一个 Request 类型的参数,将请求抽象成一个 Request 类的实例。使用 Request 类的时候同样可以设定 timeout。

http.client.HTTPResponse 类

  1. 调用 read() 方法,可以返回类中文本内容的二进制字节序列(bytes 类),后者再可以通过调用 decode() 方法,接受一个字符串参数(表示编码方法)对二进制字节序列进行编码。不指定直接输出二进制字节序列,会使用默认编码方式。
  2. status 属性,返回一个整型变量,代表此次响应的状态码。
  3. getheaders() 方法,返回一个列表,列表中的每个元素都是一个元组,每一个元组的第一个元素是响应头中的某个属性
  4. getheader() 方法,接受一个字符串类型,表示想要查找的响应头中的属性名称,返回一个字符串,表示对应属性,没有返回none(nonetype 类)。

Request 类

  1. 构造函数:
    url,字符串类型,代表请求发送到的网址。
    data,bytes类型,代表需要 post 的数据,需要用 bytes 和 urllib.parse.urlencode 对字典类型的 POST 数据进行处理,处理成 bytes 类型。
    headers,字典类型,代表这次请求的请求头。
    method,字符串类型,代表请求的方法,例如是 GET,POST 等等。
  2. add_header 方法,接收两个字符串参数,无返回值,代表将这两个字符串参数分别作为字典的键和值,加入到 Request 类中的请求头字典中。

HTTPPasswordMgrWithDefaultRealm 类

这个类是 HTTPPasswordMgr 的派生类,因此有 add_password 方法,可以用来管理用户名和密码。

  1. add_password 接受 4 个参数:
    @params
    realm: 含意未知,设置为 None,
    uri:字符串类型,代表访问的网站地址
    user:字符串类型,代表用户名
    passwd:字符串类型,代表密码。

HTTPBasicAuthHandler 类

用于管理认证,通过基本用户验证(HTTP Basic Access Authentication)。
构造函数可以用 HTTPPasswordMgrWithDefaultRealm 为参数。

HTTPCookieProcessor 类

  1. 构造函数,可以接受 http.cookiejar.CookJar 类为参数,返回 BaseHandler 的派生类。

build_opener 函数

接受若干个 handler 类实例对象(包括HTTPBasicAuthHandler),返回值类型为 OpenerDirector 类。
可以用这个函数来创建使用默认处理器(handle)的 OpenerDirector 对象,如果直接使用后者创建实例将无法工作。

1
2
3
4
5
6
7
8
"""Create an opener object from a list of handlers.

The opener will use several default handlers, including support
for HTTP, FTP and when applicable HTTPS.

If any of the handlers passed as arguments are subclasses of the
default handlers, the default handlers will not be used.
"""

OpenerDirector 类

  1. open 方法
    fullurl: 字符串类型,代表url。
    或者可以接受 Request 类型的参数。
    返回值类型为 http.client.HTTPResponse 类。

parse 模块

urlencode 函数

接受一个字典类型的参数,返回一个字符串,代表字典转换成的字符串,这个字符串的格式是参数传递格式(POST中的内容),当然也可以看成是 url 中的请求参数(query)

urlparse 函数

@params
urlstring: 字符串类型,代表需要解析的 URL
scheme: 字符串类型,代表协议。如果 url 没有协议,那么将使用默认协议。否则将使用 url 使用的协议。
allow_framents:布尔类型,代表是否忽略锚点,如果设置为 True,则代表忽略,此时锚点的内容也不会消失,而是会被放在最后一个可以解析出来的属性里面。
@return
返回一个 ParseResult 类型的变量,其中储存有协议(scheme)域名(netloc)路径(path)参数(params)查询条件(query)锚点(fragment)信息,

ParseResult 类是很多其它类的派生类,这一点不再去深究,可以通过同名属性,例如 scheme 等属性获得 url 对应的部分,该属性为字符串属性。
也可以认为该类是一个元组,也可以通过索引。

urlunparse

@params
可以接受一个长度为 6 的可迭代对象(列表,元组),每个位置的元素分别代表协议等等。
@return
返回一个字符串类型的数据,代表拼接完成的 url。

urljoin 函数

@params
base:字符串类型,代表基础字符串
url:字符串类型,代表新字符串。
@return
会返回一个字符串类型,代表拼接好的 url。该函数会解析基础 url 和新 url 中的协议、域名、路径三个内容,如果新 url 中没有,那么就把基础 url 中的移植过去,得到新的 url

parse_qs 函数

@params
接受一个字符串类型的参数,代表 url 中的请求参数(query)。
@return
返回一个字典类型,键值都是由请求参数转化来的。

quote 函数

@params
接受一个字符串类型的参数。
@return
返回一个字符串,将参数字符串中的中文字符转换为 URL 编码,其他字符不变。

unquote 函数

@params
接受一个字符串类型的参数。
@return
返回一个字符串,将参数字符串中的 URL 编码转换为中文字符,其它字符不变。

error 模块

URLError 类

这个类是这个模块中的基类。

  1. reason 属性,类型可变,代表错误的原因。

RobotParser 模块

  • RobotFileParser 类
  1. set_url 方法,接受一个字符串类型参数,代表需要解析的 robots.txt 文件的 url。
  2. read 方法,无参数,代表对该文件进行解析。
  3. parse:参数为若干字符串,代表着 robots.txt 文件中的某些行中的内容。
  4. can_fetch:接受两个参数,均为字符串类型,第一个参数代表 User-Agent,第二个代表 URL,表示 User-Agent 指示的搜索引擎是否可以爬取这个 URL。

HTTPError 类

这个类是 URLError 的派生类,用来处理 HTTP 请求错误

  1. reason 属性,类型可变,代表错误的原因
  2. code 属性,整型,代表这次请求对应的响应状态码
  3. headers 属性,http.client.HTTPMessage 类,可以用 print 直接输出,代表这次请求的请求头

http 库

cookiejar 模块

CookieJar 类

是一个容器,里面存储了多个 cookie。该类实现了迭代器(__iter__),因此可以通过 for 循环来取出里面的每一个 cookie,取出的每个 cookie 有两个属性,name 代表 cookie 名称,value 代表名称对应的值。

MozillaCookieJar 类

是 CookieJar->FileCookieJar 的派生类,用来处理 Cookie 和文件相关的事项。

  1. 构造函数
    filename,字符串类型,代表文件名称。

  2. save 方法
    filename,字符串类型,代表文件名称,如果构造函数调用时已经设置就不用再次设置,如果两个值不一样会抛出异常 ValueError。
    ignore_discard,布尔类型,代表是否保存会话 cookie,设置为 true 代表保存。
    ignore_expires,布尔类型,代表是否保存已过期的 cookie,设置为 true 代表保存

  3. load 方法
    加载本地文件中的 cookie。
    filename,字符串类型,代表文件名称。
    ignore_discard,布尔类型,代表是否忽略会话 cookie,设置为 true 代表不忽略。
    ignore_expires,布尔类型,代表是否忽略已过期的 cookie,设置为 true 代表不忽略

保存肯定是请求后保存,加载肯定是请求前加载。

标准函数

isinstance 函数

接受两个参数,第一个参数是变量,第二个参数是类型,返回 true or false,表示该参数是否是这个类型。和 type 有区别,type 不会考虑类派生,而 isinstanse 如果变量的实际类型是第二个参数所代表的类的派生类,会返回 true,而使用 type 检查时返回 false。