1.urllib包
Urllib是一个收集多个模块以使用URL的包,有一下模块:
urllib.request
用于打开和读取URLurllib.error
包含urllib.request引发的异常urllib.parse
用于分析URLurllib.robotparser
用于分析robots.txt文件
本章介绍urllib.request中简单方法
1.1urllib.request模块
urllib.request模块定义函数和类,这些函数和类有助于在复杂的环境中打开URL(主要是HTTP)——基本和摘要式身份验证、重定向、cookie等等。urllib.request模块定义了如下常用方法:
urllib.request.
Request
(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)(请求一个url)
- URL应该是包含有效URL的字符串。
- data默认值为None。data必须是一个指定要发送到服务器的附加数据的对象,如果不需要这些数据,则为“None”。目前,HTTP请求是唯一使用data的请求。支持的对象类型包括字节、类似文件的对象和iterables。对于http,post请求需要将data进行编码,可以使用urllib.parse.urlencode()函数进行编码
- headers用于设置user-agent,有些网站不允许爬虫,此时使用headers自行设置user-agent欺骗浏览器,headers应该设置为一个字典,
- origin_re_host 指请求方的host名称或ip地址
- unverifiable,用户没有足够的权限来选择接收的结果,例如,如果请求是针对HTML文档中的图像,并且用户没有批准自动提取图像的选项,那么这个unverifiable就应该设置为true
- method是一个字符串,指示将使用的HTTP请求方法,如GET POST PUT 等等
urllib.request.
urlopen
(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)(打开URL)
- URL应该是包含有效URL的字符串。
- data默认值为None。data必须是一个指定要发送到服务器的附加数据的对象,如果不需要这些数据,则为“None”。目前,HTTP请求是唯一使用data的请求。支持的对象类型包括字节、类似文件的对象和iterables。对于http,post请求需要将data进行编码,可以使用urllib.parse.urlencode()函数进行编码
- 可选参数,设置最大连接超时时间,如果为设置则使用全局默认,这实际上只适用于HTTP、HTTPS和FTP连接
- 可选的cafile和capath参数为https请求指定一组受信任的CA证书
- cadefault通常是可忽略的
- context上下文,如果指定了,则它是描述各种SSL选项的
示例1:打开B站(未使用data,有时不人为的修改headers是无法访问的,以为某些网站为了防止爬虫,会查看user-agent是否为浏览器,是否为人类在使用)
import urllib.request
head={}
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
#把head设置为字典
URL='https://www.bilibili.com/'
#访问B站,B站使用utf-8编码的
req=urllib.request.Request(URL,None,head)
#请求连接,Request的第二个参数为data,第三个参数才为headers
#返回的是一个urllib.request.Request对象给req
response=urllib.request.urlopen(req)
#使用这个req对象打开url
html=response.read().decode('utf-8')
#打开网站后获得响应,读取页面内容,使用utf-8解码
print(html)
结果
示例2使用有道翻译
在使用有道翻译时,按F12打开审查元素在network一栏可以看到如下,data里提交的数据在formdata里
因此代码如下:
import urllib.request
import urllib.parse
import json
data={} #添加data内容,根据form data 填充
head={} #修改header
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data['from']='AUTO'
data['to']=' AUTO'
data['smartresult']= 'dict'
data['client'] ='fanyideskweb'
data['salt']= '15482326606477'
data['sign']= '76b7a1ddc911e391cce840322f68c908'
data['ts']= '1548232660647'
data['bv']= '97ba7c7fb78632ae9b11dcf6be726aee'
data['doctype']= 'json'
data['version']= '2.1'
data['keyfrom']= 'fanyi.web'
data['action']= 'FY_BY_CLICKBUTTION'
data['typoResult']=' false'
while True: #为了可以多次使用
print('\n')
a=input()
if a=='q':
break
data['i']=a
data=urllib.parse.urlencode(data).encode('utf-8')
#注意data一定要用该函数进行编码,否则会出错
req=urllib.request.Request(url,data,head)
#请求URL
response=urllib.request.urlopen(req)
#打开URL
html=response.read().decode('utf-8')
traget=json.loads(html)
traget=traget['translateResult'][0][0]['tgt']
#这里利用json优化了一下显示
print('\n')
print(traget)
注:data如果没进行编码会报如下错误,上面已经说了编码用的函数
结果