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 类
- 调用 read() 方法,可以返回类中文本内容的二进制字节序列(bytes 类),后者再可以通过调用 decode() 方法,接受一个字符串参数(表示编码方法)对二进制字节序列进行编码。不指定直接输出二进制字节序列,会使用默认编码方式。
- status 属性,返回一个整型变量,代表此次响应的状态码。
- getheaders() 方法,返回一个列表,列表中的每个元素都是一个元组,每一个元组的第一个元素是响应头中的某个属性
- getheader() 方法,接受一个字符串类型,表示想要查找的响应头中的属性名称,返回一个字符串,表示对应属性,没有返回none(nonetype 类)。
Request 类
- 构造函数:
url,字符串类型,代表请求发送到的网址。
data,bytes类型,代表需要 post 的数据,需要用 bytes 和 urllib.parse.urlencode 对字典类型的 POST 数据进行处理,处理成 bytes 类型。
headers,字典类型,代表这次请求的请求头。
method,字符串类型,代表请求的方法,例如是 GET,POST 等等。 - add_header 方法,接收两个字符串参数,无返回值,代表将这两个字符串参数分别作为字典的键和值,加入到 Request 类中的请求头字典中。
HTTPPasswordMgrWithDefaultRealm 类
这个类是 HTTPPasswordMgr 的派生类,因此有 add_password 方法,可以用来管理用户名和密码。
- add_password 接受 4 个参数:
@params
realm: 含意未知,设置为 None,
uri:字符串类型,代表访问的网站地址
user:字符串类型,代表用户名
passwd:字符串类型,代表密码。
HTTPBasicAuthHandler 类
用于管理认证,通过基本用户验证(HTTP Basic Access Authentication)。
构造函数可以用 HTTPPasswordMgrWithDefaultRealm 为参数。
HTTPCookieProcessor 类
- 构造函数,可以接受 http.cookiejar.CookJar 类为参数,返回 BaseHandler 的派生类。
build_opener 函数
接受若干个 handler 类实例对象(包括HTTPBasicAuthHandler),返回值类型为 OpenerDirector 类。
可以用这个函数来创建使用默认处理器(handle)的 OpenerDirector 对象,如果直接使用后者创建实例将无法工作。
1 | """Create an opener object from a list of handlers. |
OpenerDirector 类
- 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 类
这个类是这个模块中的基类。
- reason 属性,类型可变,代表错误的原因。
RobotParser 模块
- RobotFileParser 类
- set_url 方法,接受一个字符串类型参数,代表需要解析的 robots.txt 文件的 url。
- read 方法,无参数,代表对该文件进行解析。
- parse:参数为若干字符串,代表着 robots.txt 文件中的某些行中的内容。
- can_fetch:接受两个参数,均为字符串类型,第一个参数代表 User-Agent,第二个代表 URL,表示 User-Agent 指示的搜索引擎是否可以爬取这个 URL。
HTTPError 类
这个类是 URLError 的派生类,用来处理 HTTP 请求错误
- reason 属性,类型可变,代表错误的原因
- code 属性,整型,代表这次请求对应的响应状态码
- headers 属性,http.client.HTTPMessage 类,可以用 print 直接输出,代表这次请求的请求头
http 库
cookiejar 模块
CookieJar 类
是一个容器,里面存储了多个 cookie。该类实现了迭代器(__iter__
),因此可以通过 for 循环来取出里面的每一个 cookie,取出的每个 cookie 有两个属性,name 代表 cookie 名称,value 代表名称对应的值。
MozillaCookieJar 类
是 CookieJar->FileCookieJar 的派生类,用来处理 Cookie 和文件相关的事项。
构造函数
filename,字符串类型,代表文件名称。save 方法
filename,字符串类型,代表文件名称,如果构造函数调用时已经设置就不用再次设置,如果两个值不一样会抛出异常 ValueError。
ignore_discard,布尔类型,代表是否保存会话 cookie,设置为 true 代表保存。
ignore_expires,布尔类型,代表是否保存已过期的 cookie,设置为 true 代表保存load 方法
加载本地文件中的 cookie。
filename,字符串类型,代表文件名称。
ignore_discard,布尔类型,代表是否忽略会话 cookie,设置为 true 代表不忽略。
ignore_expires,布尔类型,代表是否忽略已过期的 cookie,设置为 true 代表不忽略
保存肯定是请求后保存,加载肯定是请求前加载。
标准函数
isinstance 函数
接受两个参数,第一个参数是变量,第二个参数是类型,返回 true or false,表示该参数是否是这个类型。和 type 有区别,type 不会考虑类派生,而 isinstanse 如果变量的实际类型是第二个参数所代表的类的派生类,会返回 true,而使用 type 检查时返回 false。