1. 开发环境配置
2. 爬虫基础
3. 基本库的使用
3.1使用urllib
- request : 它是最基本的HTTP 请求模块,可以用来模拟发送请求。就像在浏览器里输入网址,然后回车一样,只需要给库方法传入URL 以及额外的参数,就可以模拟实现这个过程了。
- error : 异常处理模块,如果出现请求错误, 我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止。
- parse : 一个工具模块,提供了许多URL 处理方法,比如拆分、解析、合并等。
- robotparser :主要是用来识别网站的robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬,它其实用得比较少。
3.1.1 发送请求
1. urlopen()
import urllib.request
response= urllib.request.urlopen( ' https://www.python.org')
pri「1t(response. read(). decode (’ utf-8'))
urlopen()得到的是一个HTTPResposne 类型的对象,主要包含read() 、readinto ()、getheader(name )、getheaders () 、fileno ()等方法,以及msg 、version 、status 、reason 、debuglevel 、closed 等属性。
print(response . status)
print(response .getheaders())
print(response . getheader (『Server'))
#输出
200
[('Server', 'Tengine'),
('Content-……096908924e')]
'Tengine'
API:
urllib.request.urlopen(
url,
data=None,
timeout=<object object at 0x000002C274D622D0>,
*,
cafile=None,
capath=None,
cadefault=False,
context=None,
)
data参数
data 参数是可选的,如果它是字节流编码格式的内容,即bytes 类型,则需要通过bytes()方法转化。如果传递了这个参数,则它的请求方式就不再是GET 方式,而是POST 方式。
data = bytes(urllib.parse.urlencode({'word':'hello'}),encoding='utf8')
response= urllib.request.urlopen('http://httpbin.org/post',data)
print(response.read())
timeout参数
用于设置超时时间,单位为秒,如果请求超出了设置的这个时间, 还没有得到响应, 就会抛出异常
response= urllib.request.urlopen('http://httpbin.org/get',timeout=1)
print(response.read())
其他参数
参数 | 作用 |
---|---|
context | 必须是ssl.SSLContext 类型,用来指定SSL 设置 |
cafile | 指定CA 证书 |
capath | 指定CA 证书路径 |
2. Request
request = urllib.request.Request('https://creator.douyin.com/content/manage')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
请求网页,得到Request类型的对象
API
urllib.request.Request(
url,
data=None,
headers={},
origin_req_host=None,
unverifiable=False,
method=None,
)
参数 | 说明 |
---|---|
url | 必传参数 |
data | 必须传bytes(字节流)类 |
headers | 一个字典,它就是请求头 |
origin_req_host | 请求方的host 名称或者IP 地址 |
origin_req_host | 请求方的host 名称或者IP 地址 |
unverifiable | 表示这个请求是否是无法验证的,默认是False ,意思就是说用户没有足够权限来选择接收这个请求的结果 |
method | 一个字符串,用来指示请求使用的方法 |
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,data,headers,method='POST')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
3. 高级用法
Handler
类 | 说明 |
---|---|
BaseHandler 类 | 所有其他Handler 的父类,它提供了最基本的方法 |
HITPDefaultErrorHandler | 处理HTTP 响应错误,错误都会抛出HTTP Error 类型的异常 |
HTTPRedirectHandler | 处理重定向 |
HTTPCookieProcessor | 处理Cookies |
ProxyHandler | 设置代理, 默认代理为空 |
HTTPPasswordMgr | 管理密码,它维护了用户名和密码的表 |
HTTPBasicAuthHandler | 管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题 |
Opener
之前使用的Request 和urlopen( )相当于类库为你封装好了极其常用的请求方法,利用它们可以完成基本的请求
Opener 可以使用open()方法,返回的类型和urlopen()如出一辙
一般利用利用Handler来构建Opener
验证——HTTPBasicAuthHandler
from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
from urllib.request import URLError
username = 'username'
password = 'password'
url = 'http://localhost:5000/'
p = HTTPPasswordMgrWithDefaultRealm()#实例化
p.add_password(None,url,username,password)#添加url及用户和密码
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)
try:
result = opener.open(url)
html = result.read().decode('utf-8')
print(html)
except URLError as e:
print(e.reason)