网络请求模块一
1.urlopen()方法
import urllib.request
# 目标url
url = "http://www.baidu.com/s?wd=%E9%A6%96%E5%AF%8C"
# 请求头 字典类型{"键":"值","键":"值"}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
# 发起请求
response = urllib.request.urlopen(url)
"""Open the URL url, which can be either a string or a Request object
参数我们不仅可以传入一个网址 也可以传入一个对象
"""
# 获取响应
html = response.read().decode('utf-8') # 获取字符串
print(html)
# print(response.getcode()) # 返回HTTP的响应码
# print(response.geturl()) # 返回实际数据的URL
"""
爬虫流程
1 发请求 url 请求头信息
2 获取响应 读取
3 解析数据
4 保存数据
"""
2.urllib.request.Request()
import urllib.request
# urllib.request.Request()
# 创建请求对象并构建User-Agent
# 目标url
url = "https://www.douban.com/"
# 请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
# 1 创建请求对象并构建User-Agent
req = urllib.request.Request(url=url, headers=headers)
print(req) # <urllib.request.Request object at 0x000001B411D38048> 请求对象
# 2获取响应对象 urlopen
"""我们依然是用urlopen()方法来发送这个请求,只不过这次urlopen()方法的参数不再是一个URL,
而是一个Request,通过构造这个数据结构,
一方面我们可以将请求独立成一个对象,另一方面可配置参数更加丰富和灵活。"""
response = urllib.request.urlopen(req)
# 3读取响应对象的内容 read().decode("utf-8")
html = response.read().decode("utf-8")
print(html)
3.parse模块
# 网络模块在向一个携带一个中文字样的url发送请求就会出现问题
# 解决方案: 把中文处理成%+十六进制的样式
import urllib.request
import urllib.parse
# url1 = "https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B"
# url2 = "https://www.baidu.com/s?wd=海贼王"
# url3 = "https://www.baidu.com/s?wd=python"
#
# req = urllib.request.urlopen(url1)
# print(req) # UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)
# 第一种方法
'''
urlencode
传入参数类型:字典
功能:将存入的字典参数编码为URL查询字符串,即转换成以key1=value1&key2=value2的形式
导入:from urllib.parse import urlencode
'''
from urllib.parse import urlencode
r = {"wd": "海贼王"}
result = urllib.parse.urlencode(r) # 对r进行解码
print(result)
f_url = "https://www.baidu.com/s?" + result
print(f_url)
# 第二种方法
'''
url单个字符串编码用quote()函数
'''
r = "海贼王"
result = urllib.parse.quote(r)
print(result)
f_url = "https://www.baidu.com/s?wd=" + result
print(f_url)
4.urllib保存图片
from urllib.request import urlretrieve
url = 'https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F1027%2Ff4f4f089j00r1ljfc0024c000hs012ic.jpg&thumbnail=660x2147483647&quality=80&type=jpg'
"""urllib方法
参数说明:
url:外部或者本地url
filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);
reporthook:是一个回调函数,我们可以利用这个回调函数来显示当前的下载进度。
data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename,headers),filename表示保存到本地的路径,header表示服务器的响应头。
"""
urlretrieve(url=url, filename="plmm.png")
# reuqest方法
import requests
url = "https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2021%2F1027%2Ff4f4f089j00r1ljfc0024c000hs012ic.jpg&thumbnail=660x2147483647&quality=80&type=jpg"
response = requests.get(url)
with open("plmm2.jpg", mode="wb")as f:
f.write(response.content) # 二进制数据
5.第三方库的安装
"""
ALT + F12打开pycharm终端,输入pip install requests
# 若出现下载超时,换源即可
# 示例
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 阿里云 http://mirrors.aliyun.com/pypi/simple/
# 豆瓣http://pypi.douban.com/simple/
# 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
# 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
# 华中科技大学http://pypi.hustunique.com/
"""
6.网络请求模块介绍
"""
urllib模块 内置库
requests模块----->基于urllib模块进行开发的 第三方库
pip命令进行安装 下载
pip install requests(库名)
检测我们已经安装好的库: pip list
安装方式:
1、终端安装 win+R ---cmd
2、在pycharm的左下角的terminal进行安装
3、file--->setings--->project---->interpreter--->+
都是安装在我们的系统解释器的
检测系统解释器的位置: where python
建议安装方式: 都在终端进行安装
7.requests之get请求
# 搜狗搜索
import requests
url = 'https://www.sogou.com/web?query=%E7%BE%8E%E5%A5%B3&_ast=1686834544&_asf=www.sogou.com&w=01029901&cid=&s_from=result_up&sut=685&sst0=1686834751157&lkt=0%2C0%2C0&sugsuv=1666847250696567&sugtime=1686834751157'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
response = requests.get(url, headers=headers)
print(response.encoding)
response.encoding = 'utf-8'
# 网页文本数据
html = response.text
print(html)
# 第二种方式 官方文档推荐方式
import requests
url = 'https://www.sogou.com/web'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36"
}
parmas = {
"query": "美女",
"_ast": "1686834544",
"_asf": "www.sogou.com",
"w": "01029901",
"cid": "s_from: result_up",
"sut": "685",
"sst0": "1686834751157",
"lkt": "0,0,0",
"sugsuv": "1666847250696567",
"sugtime": "1686834751157"
}
html = requests.get(url, headers=headers, params=parmas).text
print(html)
8.练习
"""
网址: https://tieba.baidu.com/f?ie=utf-8&kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&fr=search
需求: 使用requests模块爬取此贴吧前3页的数据 每一页保存为html文件 例如1.html 2.html 3.html
"""
import requests
page = 0
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
}
for i in range(1, 4):
url = f"https://tieba.baidu.com/f?kw=%E6%B5%B7%E8%B4%BC%E7%8E%8B&ie=utf-8&pn={page}"
res = requests.get(url=url, headers=headers)
print(page, url)
page += 50
with open(f"{i}.html", mode="w+", encoding="utf-8") as f:
f.write(res.text)
运行结果: