首先介绍下urllib的用法
urllib提供了一系列用于操作URL的功能。
常用的模块:
urllib.request 请求模块
urllib.error 异常处理模块
urllib.parse url解析模块
request()
urllib的ruquest
模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:
from urllib import request
response = request.urlopen("https://www.baidu.com/")
.read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。
html =response.read()
然而这是远远不够的,因为返回值是以二进制存储的,一般网页原码都是用utf-8表示,所以一般还有一个decode()的过程。
html =html.decode("utf-8")
print(html)
得到以下输出:
<html>
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
<body>
<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>
具体例子1:(下载一只小猫)来源网站:placekitten.com
code如下:
from urllib import request as re
response =re.urlopen("http://placekitten.com/g/500/600")
cat_img = response.read()
with open("D:\\实验楼\cat_500_600.jpg", 'wb')as f:
f.write(cat_img)
.Parse()
这里就用到urllib.parse,通过bytes(urllib.parse.urlencode())可以将post数据进行转换放到urllib.request.urlopen的data参数中。这样就完成了一次post请求。
所以如果我们添加data参数的时候就是以post请求方式请求,如果没有data参数就是get请求方式。
具体例子2:使用有道翻译进行翻译.
from urllib import request
from urllib import parse
import json
content = input("请输入需要翻译的内容")
url ="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
head ={ }
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
data ={}
data["from"]="AUTO"
data["to"]="AUTO"
data["i"]= content
data["client"]="fanyideskweb"
data["sign"]="c8f3a6d3a2e68a5ba21a0c36de9ed9cd"
data["salt"]="1539962031171"
data["smartresult"]="dict"
data["doctype"]="json"
data["version"]= 2.1
data["keyfrom"]="fanyi.web"
data["action"]="FY_BY_REALTIME"
data["typoResult"]= "false"
data = parse.urlencode(data).encode("utf-8")
##是将一个utf-8类型的字符串url,解码成ascii格式的方法
#urllib.parse.urlencode()
#只将连接中utf-8编码不在ascii表中的字符翻译成带百分号的ascii表示形式
#>>>params = {'query':'中文','submit':'search'}
#>>>data = urllib.parse.urlencode(params)
#>>>data
#'query=%E4%B8%AD%E6%96%87&submit=search'
req = request.Request(url, data , head)
response = request.urlopen(req)
# or 删去Request中的head
# + req.add_header(“User-Agent”,'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
html = response.read().decode('utf-8')
target = json.loads(html)
#json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
res= target['translateResult'][0][0]['tgt']
print ("翻译结果为:",res)
代理ip的使用方法:
1、build_opener 和urlopen的区别和优点?
答:要爬取的各种各样的网页,它们有一部填写需要验证码,有的需要小饼干(cookie),还有更多许多高级的功能,它们会阻碍你爬,而我对于urlopen单纯地理解就是打开网页。urlopen打开一个网址,它可以是一个字符串或者是一个request对象。而build_opener就是多了handler,处理问题更专业,更个性化。
2、使用默认的handlers应该怎么写?
例子1:
ProHandler=
request = urllib.request.Request(url,data, headers or {})
iplist =['119.6.144.73:81',...........]
proxy_support =urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener = urllib.request.build_opener(support)
例子2:
opener1 = urllib.request.install_opener(opener)