环境:python3
urllib库
语法:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
注意:data参数,当给这个参数赋值时,HTTP的请求就使用POST方法,如果data=None或者不写,则使用get方法。
1、url库他是python内置的HTTP请求库,他主要包含4个模块
- request: 最基本的HTTP请求模块,可以用来模拟发送请求。只需要传入URL和额外参数,就可以模拟实现这个过程
-
import urllib.request url="https://me.csdn.net/column/weixin_41685388" response = urllib.request.urlopen(url) print(response.read().decode('utf-8')) # read()获取响应体的内容,内容是bytes字节流,需要转换成字符串
- error:异常处理模块。
- parse:一个工具模块提供了很多URL的处理方法,如:拆分、解析、合并、格式转换等。
- robotparser:主要用于识别网站的robots.txt文件,判断哪些链接可以爬。很少使用
2、第一个简单的get请求
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
url="https://me.csdn.net/column/weixin_41685388"
response = urllib.request.urlopen(url)
print(type(response)) #输出:<class 'http.client.HTTPResponse'>
# 一个HTTPResponse类型的对象,
# 主要包含read()、readinto()、getheader(name)、getheaders()、fileno()等方法,
# 以及msg、version、status、reason、debuglevel、closed等属性。
# 常用status属性得到返回结果的状态码
print(response.status) #返回200 表示正常请求
# getheaders()返回头部信息
print(response.getheaders())
# 返回头部信息中'Server'的值,服务器的搭建相关信息
print(response.getheader('Server'))
# 常用.read().decode('utf-8')返回网页内容,read()获取响应体的内容,内容是bytes字节流,需要转换成字符串
print(response.read().decode('utf-8')) #网页内容
3、如何判断是get请求和post请求
问题来了,如何判断是get请求和post请求,谷歌浏览器为例:打开网页-->右击,检查(N)-->Network-->F5刷新,找到我们需要的Name,Method的值一看就知道了,注意往往第一次使用的时候检查功能的时候默认没有打开Method,需手动勾选一下。
get请求,如:https://blog.csdn.net/weixin_41685388/category_9426224.html链接
如何查看是否是我们需要的Name?
请求时需要的内容:
来一个post请求,看长啥样如:http://fanyi.youdao.com/
请求时需要的内容:具体看4中代码
4、post请求表单的提交
在使用urllib.request.urlopen()函数有一个data参数,当给这个参数赋值时,HTTP的请求就使用POST方法,如果data=None或者不写,则HTTP的请求就使用get方法。data参数的格式必须符合application/x-www-form-urlencoded的格式。需要urllib.parse.urlencode()将字符串转化为这个格式。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib.request
import urllib.parse
import json
import time
def youdao(input):
#url=r"http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
# 调试后发现设置了反爬机制,需要将“_o”删除即可。
url=r"http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
#用于隐藏身份,Headers必须是字典,在网页检查的Request Headers中,常调用Cookie和User-Agent,
# 使用urllib.request.Request()才能调用该功能。
Headers = { }
Headers["Cookie"]=r'OUTFOX_SEARCH_USER_ID_NCOO=1564612197.2237918; OUTFOX_SEARCH_USER_ID="[email protected]"; _ga=GA1.2.269278628.1571982437; _ntes_nnid=db62add68d78e9de1c202b8b131b32a4,1579175684866; JSESSIONID=aaaGcKLB2j8UhdX6Q3V_w; SESSION_FROM_COOKIE=unknown; ___rl__test__cookies=1579203741289'
Headers["User-Agent"]=r"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
data = { } #post请求需要的data参数,在网页检查的Form Data中,
#data["i"]="I am jalen" #认真一点你会发现这就是我们输入的值,自己做一个简单的有道翻译只需要修改这里就可以实现
data["i"] = input #那就按照习惯在函数外单独输入经常变化的值
data["from"]="AUTO"
data["to"]="AUTO"
data["smartresult"]="dict"
data["client"]="fanyideskweb"
data["salt"]="15792037412906"
data["sign"]="324404ee89ccb63c2ea1efb7d311db26"
data["ts"]="1579203741290"
data["bv"]="74b3450c611e373bdb05dc0a4ecdedd0"
data["doctype"]="json"
data["version"]="2.1"
data["keyfrom"]="fanyi.web"
data["action"]="FY_BY_CLICKBUTTION"
data = urllib.parse.urlencode(data).encode("utf-8") #post请求的data参数格式转化
req = urllib.request.Request(url,data,Headers)
response = urllib.request.urlopen(req,timeout=30)
html = response.read().decode("utf-8") #返回网页内容
# print(type(html),html) #后面就可以解析了,解析部分在后面的文章中有单独讲解,但这里还是继续写完本例
target = json.loads(html) #json解析后面的文章会单独讲解
print("翻译结果:%s" % (target['translateResult'][0][0]['tgt']))
# 翻译结果:我是罗斯
if __name__ == '__main__':
input = "I am jalen"
time.sleep(5) #延时提交
youdao(input)
5、隐藏、请求超时、延时提交
在4中得代码中已经有体现了,简单的回顾一下:
(1)隐藏:隐藏身份,Headers必须是字典,在网页检查的Request Headers中,常调用和修改Cookie和User-Agent,使用urllib.request.Request()才能调用该功能。如:req = urllib.request.Request(url,data,Headers)
(2)请求超时:在设定的时间范围内如果网页没有成功请求,则返回错误如:response = urllib.request.urlopen(req,timeout=0.3)
(3)延时提交:time.sleep(n) ,n表示秒数
以上是urllib请求库的基本使用,其他内容包括requests请求库、json解析、beautiful soup、异常处理、代理ip等在后面的文章中。