python爬虫-学习记录day02

189 阅读4分钟

网络请求模块一

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)

运行结果:

image.png

image.png

image.png