爬虫网络请求模块和保存图片的方法
爬虫网络请求模块和保存图片的方法
urllib模块
一、什么是urllib模块
1、urllib模块是python中的内置模块
二、为什么要学习urllib模块
1、有一些比较老的爬虫项目用的就是这个技术。
2、有的时候我们去爬取一些数据需要request+urllib模块进行配合。
3、python内置的模块
二、保存图片的方法有以下3种
import requests
*种:需要自己写关闭
# url = ‘https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3566088443,3713209594&fm=26&gp=0.jpg’
# response = requests.get(url)
# fn = open(‘code.png’, ‘wb’)
#fn.write(response.content)
# fn.close()
第二种:用with方法不用写关闭
# url = ‘https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3566088443,3713209594&fm=26&gp=0.jpg’
# response = requests.get(url)
# fn = open(‘code.png’, ‘wb’)
# with open(‘code2.png’, ‘wb’) as file_obj:
# file_obj.write(response.content)
第三种:用urllib保存
# from urllib import request
# url = ‘https://dss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=3566088443,3713209594&fm=26&gp=0.jpg’
# request.urlretrieve(url, ‘code3.png’)
三、urllib模块的快速入门
一、urllib.request.urlopen(‘网址’)
1、 作用:向网站发起请求并获取响应
import urllib.request
# headers = {}
# # response 响应对象
# response = urllib.request.urlopen(‘https://www.baidu.com/’)
# # print(response.read()) # 1、字节流bytes 2、数据不对(反爬)
# html = response.read().decode(‘utf-8’)
# print(type(html))
二、urllib.request.Request(添加网站, user-agent)
1、 作用:创建请求对象
mport urllib.request
url = ‘https://www.baidu.com/’
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.39’
}
# 1、创建请求对象
req = urllib.request.Request(url, headers=headers)
# 2、获取请求对象
response = urllib.request.urlopen(req)
# 3、响应对象的内容
html = response.read().decode(‘utf-8’)
print(html)
print(response.getcode()) # 获取状态码
print(response.geturl()) # 反回请求的url地址
# encode str(字符串)–> bytes数据类型
# decode bytes数据类型 –> str(字符串)
urllib.pars的使用
一、如果我们通过urllib向一个携带有中文字样的url发起请求,
这个时候我们需要注意把中文转换成百分号+十六进制的这种数据类型 %E6%B5%B7%E8%B4%BC%E7%8E%8B
import urllib.request
# 如何编码 3个%是一个汉字
# %E6%B5%B7%E8%B4%BC%E7%8E%8B
# wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B
# url = ‘https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B’
# url2 = ‘https://www.baidu.com/s?wd=海贼王’
# res = urllib.request.urlopen(url)
# 如果我们通过urllib向一个携带有中文字样的url发起请求,
# 这个时候我们需要注意把中文转换成百分号+十六进制的这种数据类型 %E6%B5%B7%E8%B4%BC%E7%8E%8B
# result = urllib.parse.urlencode(字典) # 在括号中传入字典类型
*种方法:
import urllib.parse
# wd = {‘wd’: ‘海贼王’}
# result = urllib.parse.urlencode(wd)
# print(result)
# base_url = ‘https://www.baidu.com/s?’ + result
# print(base_url)
第二种方法:
# urllib.parse.quote(字符串)
r = ‘海贼王’
result = urllib.parse.quote(r)
# print(result)
url3 = ‘https://www.baidu.com/s?’ + result
print(url3)
# 拓展
总结以后看到如下数据如何解决
# https%E6%B5%B7%E8%B4%BC%E7%8E%8B%E6%B5%B7%E8%B4%BC%E7%8E%8B
hreo_url = ‘http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735042015%2F1618905362%5F84828260%5F13100%5FsProdImgNo%5F1%2Ejpg%2F200 ‘ # 图片的url
img_url = urllib.parse.unquote(hreo_url)
print(img_url)