通过编写程序来获取到互联网上的资源
开始使用
使用urllib.request将网页的源代码保存到本地html文件中
from urllib.request import urlopen
# 注意utf-8编码解码
url = "http://www.baidu.com"
resp = urlopen(url)
# print(resp.read().decode('utf-8'))
with open('mybaidu.html',mode='w',encoding='utf-8') as f:
f.write(resp.read().decode('utf-8')) # 读取到网页的页面源代码
print("over!")
WEB请求过程剖析
1.服务器渲染:在服务器那边直接把数据和html整合在一起,统一返回给浏览器 在页面源代码中能看到数据
2.客户端渲染:第一次请求只要一个html骨架,第二次请求拿到数据,进行数据展示, 在页面源代码中,看不到数据。
3.熟练使用浏览器抓包工具 使用chrome浏览器 F12 NetWork
HTTP协议
请求: 1 请求行 -> 请求方式(get/post) 请求url地址 协议 2 请求头 -> 放一些服务器要使用的附加信息 3 4 请求体 -> 一般放一些请求参数
响应: 1 状态行 -> 协议 状态码 2 响应头 -> 放一些客户端要使用的一些附加信息 3 4 响应体 -> 服务器返回的真正客户端要用的内容(HTML,json等)
requests入门
在地址栏上请求的链接一定采取GET请求方式。
网页地址栏的链接中,问号前面的是url,问号后面的是参数。
GET请求方式一般Headers最下面是 Query String Parameters, POST请求方式Headers最下面是Form Data。
- 示例:使用搜狗搜索搜索“周杰伦”,并返回搜索后的结果网页源代码。(GET请求)
import requests
query = "周杰伦"
url = f"https://www.sogou.com/web?query={query}"
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
resp = requests.get(url,headers=headers)
print(resp)
print(resp.text)# 返回页面源代码
- 使用百度翻译翻译“dog”。
import requests
url = 'https://fanyi.baidu.com/sug'
s = "dog"
dat = {
"kw": s
}
#发送post请求,发送的数据必须放在字典中,通过data参数进行传递
resp = requests.post(url=url,data=dat)
print(resp.json()) # 将服务器返回的内容直接处理成json() => dict
- 查找豆瓣热门喜剧片列表。
# 网页地址栏的链接中,问号前面的是url,问号后面的是参数
# GET请求方式一般Headers最下面是 Query String Parameters, POST请求方式Headers最下面是Form Data
import requests
baseurl = 'https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=0&limit=20'
# Headers里面的链接太长了,通过下面方式重新构造。先保留问号前的url,问号后面的参数构造成字典。
url = 'https://movie.douban.com/j/chart/top_list'
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
# 重新封装参数
param = {
"type": "24",
"interval_id": "100:90",
"action":"",
"start": "0",
"limit": "20",
}
resp = requests.get(url=url,params=param,headers=headers)
# print(resp.request.url)
print(resp.request.headers)
print(resp.json())