一、模拟浏览器向服务器发送请求
统一资源定位符(url)组成:
import urllib.request
url = 'http://www.baidu.com'
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(url=url)
# 读取响应的内容
print(response.read(n)) 返回二进制的值,n代表读取的字节数
二、response的类型和六个方法
类型:HTTPResponse
方法:
1.read()
2.readline() 读一行
3.readlines() 读取所有的数据,一行一行读取
4.geturl() 获取资源路径
5.getheaders() 获取服务器的响应头
6.getcode() 获取服务器响应的状态码
编码:字符串—>二进制,encode
解码:二进制---->字符串,decode
三、下载
3.1 下载网页
import urllib.request
url = 'https://www.baidu.com'
# filename 为下载完保存文件的名字
urllib.request.urlretrieve(url=url,filename='baidu.html')
3.2 下载图片
import urllib.request
url_image = '图片路径'
# filename 为下载完保存文件的名字
urllib.request.urlretrieve(url=url,filename='baidu.html')
403:Forbidden 禁止访问,图片防盗链
四、请求对象的定制
模拟浏览器向服务器发送请求,但有的网站会检测UA,如果请求中没有,则接收不到网站的数据。而urllib.request.urlopen()只能传入url,不能传入headers,所以要进行请求对象的定制。
import urllib.request
url = 'http://www.baidu.com'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60'
}
# 请求对象的定制
request = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
五、get 编码-(urllib.parse)
quote方法:单个参数编码
浏览器会自动编解码,但是pycharm不会,所有我们需要将汉语进行编码。但是编码时不能将一些特殊字符进行编码。
import urllib.parse
s = '田'
a = urllib.parse.quote(s)
print(a) # %E7%94%B0
urlencode方法:多个参数进行编码
import urllib.parse
data = {
'wd':'韩红',
'sex':'女'
}
data = urllib.parse.urlencode(data)
print(data) # wd=%E9%9F%A9%E7%BA%A2&sex=%E5%A5%B3
六、post请求-百度翻译
import urllib.request
import urllib.parse
url = 'https://fanyi.baidu.com/sug'
data={
'kw':'car'
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
# post请求必须进行编码并要进行encode方法的调用
data = urllib.parse.urlencode(data).encode('utf-8')
# post请求的参数 需要就行请求对象的定制,不需要进行拼接
request = urllib.request.Request(url=url,headers=headers,data=data)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
import json
a = json.loads(content)
result = json.dumps(a,ensure_ascii=False)
print(result)
get、post区别:
get请求的参数必须编码,不需要调用encode方法,然后拼接到url后。
post请求的参数必须编码,需要调用encode方法,参数放在请求对象的定制中
七、ajax-get
ajax实质就是用ajax对象(xmlHttpRequest 简称xhr)异步的向服务器发送请求,服务器会返回部分数据,整个过程无刷新,不打断用户的操作。
八、ajax-post-肯德基官网
多页下载:
import urllib.request
import urllib.parse
def create_request():
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
headers = {
'User - Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.102Safari / 537.36'
}
data = {
'cname': '北京',
'pid':' ',
'pageIndex': (page-1)*10,
'pageSize': 10
}
data = urllib.parse.urlencode(data).encode('utf-8')
request = urllib.request.Request(url=url,headers=headers,data=data)
return request
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
def download(page,content):
with open('kfc_'+str(page)+'.html','w',encoding='utf-8') as write_stream:
write_stream.write(content)
if __name__ == '__main__':
start_page = int(input('输入开始页码:'))
end_page = int(input('输入结束页码:'))
for page in range(start_page,end_page+1):
# 请求对象的定制
request = create_request()
# 获取网页源码
content = get_content(request)
# 下载
download(page,content)
九、异常:UrlError\HttpError
∙
\bullet
∙ HttpError是UrlError的子类
∙
\bullet
∙ 导入的包:urllib.error.URLError、 urllib.error.HttpError
∙
\bullet
∙ Http错误:它是针对浏览器无法连接到服务器而增加的错误提示,引导并告诉浏览者该网页是哪里出了问题。
十、cookie
10.1 cookie简介
10.2 cookie登录
import urllib.request
url = 'https://user.qzone.qq.com/396226001'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
with open('qq.html', 'w') as wp:
wp.write(content)
上述代码headers中没有加cookie所以下载的页面源码会跳转到登录界面,加上cookie后就会返回想要的页面。
十一、handler
请求对象的定制只能传入url、headers、data,而更高级的请求头需要传入代理、动态cookie。
十二、代理
12.1 代理服务器
定义:代理服务器是一种重要的服务区安全功能,它的工作主要在开放系统互联(osi)模型的会话层,从而起到防火墙的作用
功能:
∙ \bullet ∙ 突破自身IP的访问限制,访问外国站点
∙ \bullet ∙ 访问一些单位或者团体的内部资源
∙ \bullet ∙ 提高访问速度
∙ \bullet ∙ 隐藏真实IP
12.2 代码配置代理
步骤:
∙ \bullet ∙ 创建Request对象
∙ \bullet ∙ 创建ProxyHandler对象
∙ \bullet ∙ 用Handler对象创建opener对象
∙ \bullet ∙ 使用opener .open函数发送请求
import urllib.request
url = 'http://www.baidu.com/s?wd=ip'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
'Cookie': 'BIDUPSID=D60E2D13DBF8F95B226D430F4E7C0826; PSTM=1600264646; BAIDUID=D60E2D13DBF8F95BCBFAB8AB6AA76458:FG=1; BD_UPN=12314753; BDRCVFR[Zln_T-KFICf]=pdg3iqubLhtTvqMULR8mvqV; delPer=0; BD_CK_SAM=1; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; __yjsv5_shitong=1.0_7_21c740d614b835cf5e85088fad59f209420b_300_1600417843027_106.38.62.154_78a35a11; yjs_js_security_passport=82163f1a233a65c9c66a394a2e523375c7a57783_1600417847_js; COOKIE_SESSION=0_0_0_0_3_0_0_0_0_0_0_0_310_0_918_0_1600433459_0_1600432541%7C1%230_0_1600432541%7C1; PSINO=1; BDSVRTM=14; H_PS_PSSID=32617_1442_32743_32328_32723_7631_32718'
}
request = urllib.request.Request(url=url, headers=headers)
# proxies 是一个代理的IP值
proxies = {
'http': '202.112.51.45:3128'
}
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf-8')
with open('daili.html', 'w', encoding='utf-8') as wp:
wp.write(content)