Python-数据传输-urllib库

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"))

原文发布于微信公众号 - 数据云团(SmartData)

原文发表时间:2019-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券