Python-数据挖掘-urllib库
在爬取网页时,通过 URL 传递数据给服务器,传递数据的方式主要分为 GET 和 POST 两种。这两种方式最大的区别在于:GET 方式是直接使用 URL 访问,在 URL 中包含了所有的参数;POST 方式则不会在 URL 中显示所有的参数。
一、URL 编码转换
当传递的 URL 包含中文或者其它特殊字符(例如,空格或"/"等)时,需要使用 urllib.parse 库中的 urlencode() 方法将 URL 进行编码,它可以将 key:value 这样的键值对转换成 “key=value” 这样的字符。
import urllib.parse
data = {
"a": "数据云团",
"b": "小团子"
}
result = urllib.parse.urlencode(data)
print(result)
反之,解码使用的是 urllib.parse 库的 unquote() 方法:
import urllib.parse
result = urllib.parse.unquote("a=%E6%95%B0%E6%8D%AE%E4%BA%91%E5%9B%A2")
print(result)
二、处理 GET 请求
GET 请求一般用于向服务器获取数据,例如,用百度搜索课聘(URL 是https://www.baidu.com/s?wd=课聘)
在这个请求中,“?” 后面的字符串就包含了要查询的关键字 “课聘”。下面尝试使用 GET 方式发送请求:
import urllib.request
import urllib.parse
url = "http://www.baidu.com/s"
word = {"wd": "课聘"}
# 转换成 URL 编码格式
word = urllib.parse.urlencode(word)
new_url = url + "?" + word
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
}
request = urllib.request.Request(new_url, headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode("UTF-8")
print(html)
三、处理 POST 请求
urlopen() 方法,发送请求时,如果是以 POST 方式发送请求,urlopen() 方法必须设置 data 参数。data 参数以字典的形式存放数据。
当访问有道词典翻译网站进行词语翻译时,会发现不管输入什么内容,其 URL 一直都是 http://fanyi.youdao.com,可以知道该网站向服务器发送的是 POST 请求:
import urllib.request
import urllib.parse
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
}
formdata = {
"type": "AUTO",
"i": "I love Python",
"doctype": "json",
"xmlVersion": "1.8",
"keyfrom": "fanyi.web",
"ue": "UTF-8",
"action": "FY_BY_ENTER",
"typeResult": "true"
}
data = bytes(urllib.parse.urlencode(formdata).encode("utf-8"))
request = urllib.request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode("utf-8"))