1.1 urllib的基本使用
import urllib.request
# (1)定义一个url 就是你要访问的地址
url="http://www.baidu.com"
# (2)模拟浏览器向服务器发送请求 response响应
response=urllib.request.urlopen(url)
#(3)获取响应中页面的源码
# read()方法 返回的是字节形式的二进制数据
# 我们要将二进制数据转换成字符串
# 二进制--》字符串 解码 decode('编码的格式')
content=response.read().decode('utf-8')
# (4)打印数据
print(content)
1.2 一个类型和六个方法
import urllib.request
url="http://www.baidu.com"
# 模拟浏览器向服务器发送请求 response响应
response=urllib.request.urlopen(url)
# 一个类型和6个方法
# response是HTTPResponse的类型
# print(type(response))
# read(5)是一个字节一个字节的去读 5表示读取5个字节
# content=response.read(5)
# print(content)
# readline() 读取一行
# content=response.readline()
# print(content)
# readline() 读取全部
# content=response.readlines()
# print(content)
# getcode():返回HTTP请求的响应状态码
# print(response.getcode())
# geturl():用于获取响应页面的URL,该方法可以验证发送的HTTP请求是否被重新调配
# print(response.geturl())
# 获取状态信息
print(response.getheaders())
# 一个类型是HTTPResponse
# 六个方法 read readline readlines getcode geturl getheaders
1.3 urlretrieve()方法的使用
import urllib.request
# 下载网页
# url_page="http://www.baidu.com"
# url代表的是下载链接 filename文件的名字
# 在python中给方法传值时,可以是变量,也可以直接写值
# 不过直接写值是一定要保证所传参数和方法中的参数位置一致
# urllib.request.urlretrieve(url_page,'baudu.html')
# 下载图片
# url_img="https://img0.baidu.com/it/u=2616975297,1777334773&fm=253&fmt=auto&app=120&f=JPEG?w=892&h=500"
# urllib.request.urlretrieve(url=url_img,filename='sgqt.jpg')
# 下载视频
url_video="https://vdept3.bdstatic.com/mda-qe3jnwgpe49ufz6v/cae_h264/1714881494015477411/mda-qe3jnwgpe49ufz6v.mp4?v_from_s=hkapp-haokan-nanjing&auth_key=1722710358-0-0-55eb8fb7ac63a4095443282be1a05173&bcevod_channel=searchbox_feed&pd=1&cr=0&cd=0&pt=3&logid=2358225956&vid=13433973294682325294&klogid=2358225956&abtest=101830_1-102148_1-17451_2"
urllib.request.urlretrieve(url=url_video,filename='sgqt.mp4')
1.4 请求对象的定制
请求对象的定制是为了解决反爬的第一种手段
import urllib.request
url="https://www.baidu.com"
# url的组成
# https/http www.baidu.com 80/443
# 协议 主机 端口号
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
# 将url作为Request()方法的参数,构造并返回一个Request对象
# 请求对象的定制
# 注意 因为参数顺序的问题 不能直接写url和headers 中间还有一个参数data 所以我们需要关键字传参
request=urllib.request.Request(url=url,headers=headers)
response=urllib.request.urlopen(request)
content=response.read().decode("utf-8")
print(content)
1.5 get请求的quote()方法
import urllib.request
import urllib.parse
url="https://www.baidu.com/s?wd="
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
# 将中文变成Unicode编码的格式
# 我们需要依赖于urllib.parse
name=urllib.parse.quote("十个勤天")
# print(name)
url=url+name
# 请求对象的定制
request=urllib.request.Request(url=url,headers=headers)
# 模拟浏览器向服务器发送请求
response=urllib.request.urlopen(request)
# 获取响应的内容
content=response.read().decode('utf-8')
print(content)
1.6 get请求的urlencode()方法
import urllib.request
import urllib.parse
# urlencode()方法应用场景:多个参数的时候
# ?后面的字符串包含了要查询的关键字
base_url="https://www.baidu.com/s?"
data={
'wd':'周杰伦',
'sex':'男'
}
new_data=urllib.parse.urlencode(data)
# 请求资源路径
url=base_url+new_data
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
# 请求对象的定制
request=urllib.request.Request(url=url,headers=headers)
# 模拟浏览器向服务器发送请求
response=urllib.request.urlopen(request)
# 获取响应的内容
content=response.read().decode('utf-8')
print(content)
1.7 post请求之百度翻译
注意点:
(1)post请求的参数 必须要进行编码 data = urllib.parse.urlencode(data)
(2)编码之后 必须调用encode方法 data = urllib.parse.urlencode(data).encode(‘utf-8’)
(3)参数是放在请求对象定制的方法中 request = urllib.request.Request(url=url,data=data,headers=headers)
import urllib.request
import urllib.parse
import json
# post请求的参数 必须要进行编码 data = urllib.parse.urlencode(data)
# 编码之后 必须调用encode方法 data = urllib.parse.urlencode(data).encode('utf-8')
# 参数是放在请求对象定制的方法中 request = urllib.request.Request(url=url,data=data,headers=headers)
# post请求
url="https://fanyi.baidu.com/sug"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
data = {
'kw':'spider'
}
# post请求的参数 必须要进行编码
data = urllib.parse.urlencode(data).encode('utf-8')
# post请求的参数 是不会拼接在url后面的 而是需要放在请求对象定制的参数中
request = urllib.request.Request(url=url,data=data,headers=headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
# 字符串--》json对象
obj = json.loads(content)
print(obj)
1.8
1.9 ajax的get请求豆瓣电影第一页
alt+ctrl+l:格式化json文件
import urllib.request
url="https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
# 请求对象的定制
request=urllib.request.Request(url=url,headers=headers)
# 模拟浏览器向服务器发送请求
response=urllib.request.urlopen(request)
# 获取响应的内容
content=response.read().decode('utf-8')
# 数据下载到本地 由于默认的是gbk方法,所以要设置编码格式为utf-8
with open('douban.json','w',encoding='utf-8') as fp:
fp.write(content)
1.10 ajax的get请求豆瓣电影前10页
import urllib.request
import urllib.parse
# https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
# start=80&limit=20
# 下载豆瓣电影前10页的数据
# (1) 请求对象的定制
# (2) 获取响应的数据
# (3) 下载数据
def crete_request(page):
base_url="https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&"
data={
'start':(page-1)*20,
'limit':20
}
data = urllib.parse.urlencode(data)
url=base_url+data
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
request=urllib.request.Request(url=url,headers=headers)
return request
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
def down_load(page,content):
# 如果要和字符串拼接,加号的两端必须都是字符串
with open('douban'+str(page)+'.json','w',encoding='utf-8') as fp:
fp.write(content)
# 程序的入口
if __name__ == '__main__':
start_page=int(input("请输入起始的页码:"))
end_page=int(input("请输入结束的页码:"))
for page in range(start_page,end_page+1):
# 每一页都有自己的请求对象的定制
request = crete_request(page)
# 获取响应的数据
content = get_content(request)
# 下载
down_load(page,content)
1.11 ajax的post请求KFC官网
# 第一页
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 1
# pageSize: 10
# 第二页
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 2
# pageSize: 10
# 第三页
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 3
# pageSize: 10
import urllib.parse
import urllib.request
def create_request(page):
base_url="https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"
data = {
'cname': '北京',
'pid':'',
'pageIndex': page,
'pageSize': '10'
}
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
request = urllib.request.Request(url=base_url,data=data,headers=headers)
return request
def get_content(request):
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
return content
def down_load(page,content):
with open('kfc_'+str(page)+'.json','w',encoding='utf-8') as fp:
fp.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(page)
# 获取网页源码
content = get_content(request)
# 下载
down_load(page,content)
1.12 urllib_异常
import urllib.request
import urllib.error
# url = "https://blog.csdn.net/talentT/article/details/1371469641"
# 一般报url错误,是主机地址和参数有问题
url = "https://sgqt111.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
try:
request = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
print(content)
except urllib.error.HTTPError:
print("系统正在升级。。。")
except urllib.error.URLError:
print("都说了系统正在升级。。。")
1.13 微博的cookie登录
# 使用场景:数据采集的时候,需要绕过登录 然后进入某个页面
# 个人信息页面是utf-8 但还是报了编码错误 因为没有进入到个人信息页面 而是跳转到了登录页面
# 而登录页面不是utf-8 所以报错
# 什么情况下访问不成功?
# 因为请求头的信息不够 所以访问不成功
import urllib.request
url= "https://weibo.cn/7468850232/info"
headers = {
# cookie中携带着你的登录信息 如果有登录之后的cookie 那么我们就可以携带cookie进入任何页面
'cookie':'_T_WM=5be67dfc5545c91fa4f2ab1d047ad149; SCF=AhUnogVlh7AAVHwU_CbgUkjiXbuGsrsOh9wfSiUgGHJZ2mISIkUIU893EYmYIhTdhasWS-ORIJyjDBKRb5G9HTw.; SUB=_2A25LtMrhDeRhGeFK7VoZ9S7OyD6IHXVoyEIprDV6PUJbktANLRfYkW1NQzfYFULvhNqqdF0VImRRbyI_EzpLvbCz; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9Whf.vDBFAgRvwlyERCHBPko5NHD95QNShqR1h-7eoeEWs4DqcjMi--NiK.Xi-2Ri--ciKnRi-zNS0Bc1hnfehz0entt; SSOLoginState=1722858162; ALF=1725450162',
# referer 判断当前路径是不是由上一个路径进来的 一般情况下 是做图片防盗链
'referer':'https://weibo.cn/?tf=5_009',
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
# 将数据保存到本地
with open('weibo.html','w',encoding='utf-8') as fp:
fp.write(content)
1.14 handler处理器的基本使用
# 需求 使用handler来访问百度 获取网页源代码
import urllib.request
url = "httpa://www.baidu.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}
request = urllib.request.Request(url=url, headers=headers)
# handler build_opener open
# (1) 获取handler对象
handler = urllib.request.HTTPSHandler()
# (2) 获取opener对象
opener = urllib.request.build_opener(handler)
# (3)调用open方法
response = opener.open(request)
content = response.read().decode('utf-8')
print(content)