目录
requests发送get请求
#requests模块安装
pip install requests
# 1. 导入request模块
import requests
# 2. 准备目标url地址
url = 'https://www.baidu.com'
# 3. 向目标url地址发送get请求
response = requests.get(url)
# 4. 打印响应内容
print(response.text)
requests响应对象
# 1. 导入request模块
import requests
# 2. 准备目标url地址
url = 'https://www.baidu.com'
# 3. 向目标url地址发送get请求
response = requests.get(url)
# 4. 打印响应内容
# print(response.text)
print(response.content.decode())
'''
response.content
返回类型: bytes
解码类型: 没有指定,原始响应内容,没有进行解码
指定编码方式: response.content.decode('指定编码字符集')
注意: response.content.decode() 默认使用 utf-8 编码方式
response.text
返回类型: str
解码类型: requests 模块自动根据 HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
response.text = response.content.decode('推测出的编码字符集')
获取网页源码的方式:
response.content.decode()
response.content.decode('gbk')
response.text
以上三种方法从前往后尝试,能够100%的解决所有网页解码的问题, 推荐优先使用: response.content.decode()'
'''
'''
response.url : 响应的url地址,有时候响应的 url 地址和请求的 url 地址不一样。
response.status_code : 获取响应状态码。
response.request.headers : 获取响应对应的请求头信息。
response.headers : 获取响应头信息。
response.request._cookies : 响应对应请求携带的cookie,返回cookieJar类型。
response.cookies : 响应时设置的 cookie,返回cookieJar类型。
response.json() : 自动将 json 字符串类型的响应内容转换为 python 对象(dict or list)
'''
# 1. 导入request模块
import requests
# 2. 准备目标url地址
url = 'https://www.baidu.com'
# 3. 向目标url地址发送get请求
response = requests.get(url)
# 4. 打印响应内容
print(response.url) # 打印响应的url
print(response.status_code) # 打印响应的状态码
print(response.request.headers) # 打印响应对象的请求头
print(response.headers) # 打印响应头
print(response.request._cookies) # 打印请求携带的cookies
print(response.cookies) # 打印响应设置的cookies
练习-爬取多个图片
#re模块后续学习,先了解
import re
import requests
"""
思路
一. 先请求 https://www.tupianzj.com/meinv/20201029/219412.html,获取响应内容
二. 从上一步的响应内容中提取所有图片的地址
三. 遍历每一个图片地址,向每个图片地址发送请求,并将响应的内容保存成图片文件
"""
"""一. 先请求 https://www.tupianzj.com/meinv/20201029/219412.html,获取响应内容"""
# 1.1 准备URL地址
url = 'https://www.tupianzj.com/meinv/20201029/219412.html'
# 1.2 发送请求
response = requests.get(url)
# 1.3 获取响应的内容
html_str = response.content.decode('gbk')
# print(html_str)
"""二. 从上一步的响应内容中提取所有图片的地址"""
# 2.1 获取所有URL信息
image_url_list = re.findall('<img src="(.*?)"', html_str)
# 2.2 去除最后无效地址
image_url_list = image_url_list[:-1]
print(image_url_list)
"""三. 遍历每一个图片地址,向每个图片地址发送请求,并将响应的内容保存成图片文件"""
for image_url in image_url_list:
# 发送请求
image_response = requests.get(image_url)
# 将响应内容保存成本地图片
filename = image_url[-10:]
with open(filename, 'wb') as f:
f.write(image_response.content)
print('保存图片完毕!!!')
requests请求时设置请求头
#请求头语法
response = requests.get(url,headers={})
'''
headers 参数接收的字典形式的请求头
请求头字段名作为字典的 key,字段名对应的值作为字典的 value。
'''
#完整代码实现
import requests
#准备url地址
url = 'https://www.baidu.com/s?'
#准备查询参数
params = {
'wd':'东京奥运'
}
#准备请求头,慢慢调试,referer不行尝试cookie或者accept
headers= {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0', #字典分隔符","后面有参数记得加
'Referer':'https://www.baidu.com'
# 'Cookie':'BAIDUID=E2E375AD19217D927B4950F9491E4B4B:FG=1;'
#'Accept':
}
response = requests.get(url,params=params,headers=headers)
#打印响应内容
print(response.content.decode())
#获取响应内容
# with open('0101.html','wb',encoding='utf8') as file:
# file.write(response.content.decode())
requests发送POST请求
#POST请求语法
response = requests.post(url,data={},headers={},params={})
'''
data参数接收的数据类型是字典。
POST请求体(form data)中,冒号左边的作为字典的 key,冒号右边的作为字典的 value。
'''
案例代码()
import requests
# 1. 准备登录的url地址,请求头,请求体数据
login_url = "http://manager-health-java.itheima.net/login.do"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36" #字典分隔符","后面有参数记得加
#"Referer":
#"Cookie":
#"Accept"
}
data = {
"username": "admin",
"password": "admin"
}
# 2. 发起登录请求,get请求没有data
response = requests.post(login_url, data=data, headers=headers)
# 打印登录成功之后的响应状态码和响应的内容
#爬虫具有页面重定向能力
print(response.status_code)
print(response.content.decode())
requests使用代理
#使用代理基本语法: response = requests.get(url,proxies={})
#proxies参数接收的数据类型为字典
'''
字典格式如下:
proxies = {
"协议类型": "协议类型://代理IP地址:端口号"
}
例如:
proxies = {
# 目标地址为 http 协议,会使用 http 这个 key 对应的代理服务
"http": "http://113.121.255.26:9999",
# 目标地址为 https 协议,会使用 https 这个 key 对应的代理服务
"https": "https://219.151.157.130:3128"
}
'''
#案例-使用代理ip请求唱吧
# 1. 导入request模块
import requests
# 2. 准备目标url地址
url = 'http://changba.com/now/stars/index.html'
# 准备请求头字典
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36"
}
# 准备代理IP的字典
proxies = {
'http': 'http://113.108.190.50:8080'
}
# 3. 向目标url地址发送get请求
response = requests.get(url, headers=headers, proxies=proxies)
# 4. 打印响应的内容
print(response.content.decode())
requests请求携带Cookie
##掌握(使用requests.session携带Cookie)
'''
使用方式:
session = requests.session() #实例化session类对象
response = session.get(url,headers,...)
response = session.post(url,headers,...)
#session对象发送get或post请求的参数,与requests模块发送的请求的参数完全一致
'''
'''
案例
登录页面 url 地址: http://manager-health-java.itheima.net/login.html
先抓包获取到登录传智健康的登录 url 地址,以及登录需要的参数
先使用 request.session 完成登录,获取登录之后的 cookie
在使用 request.session 对象请求登录之后的页面。
'''
示例代码
import requests
# 1. 准备登录的url地址(抓包获取到的登录的post url地址)
login_url = "http://manager-health-java.itheima.net/login.do"
# 准备请求头User-Agent
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
}
# 准备请求体字典
data = {
"username": "admin",
"password": "admin"
}
# 2. 创建session对象,会自动保存和携带Cookie
session = requests.session()
# 3. 使用session对象发送post请求 登录传智健康
session.post(login_url, headers=headers, data=data)
# 使用 session对象再次请求登录之后的url地址 请求登录之后的页面的地址
url = "http://manager-health-java.itheima.net/pages/main.html"
# 发送请求 获取响应
response = session.get(url, headers=headers)
# 4. 打印响应内容
print(response.content.decode())
#以下方法理解
'''
从浏览器中复制User-Agent和Cookie
浏览器中的请求头字段和值与headers参数中必须一致
headers请求参数字典中的Cookie键对应的值是字符串
'''
import requests
# 1. 准备目标url地址
url = 'http://manager-health-java.itheima.net/pages/main.html'
# 2. 准备请求头信息,cookie 和 User-Agent,(从浏览器抓包复制)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
"Cookie": "JSESSIONID=4BBDB822771C712E3570B8AD3BED780F"
}
# 3. 发送请求,获取响应数据
response = requests.get(url, headers=headers)
# 4. 查看响应的内容
print(response.content.decode())
'''
Cookies参数语法以及格式
cookies参数的格式:字典
cookies = {"Cookie的name": "Cookie的Value"}
该字典对应请求头中Cookie字符串,以分号、空格分割每一对字典键值对
等号左边的是一个cookie的name,对应cookies字典的key
等号右边对应cookies字典的value
cookies参数的使用方式:
response = requests.get(url,cookies={})
cookeie一般是有过期时间的,一旦过期需要重新获取
'''
'''
完整案例
登录传智健康,获取到登录之后的cookie字符串
将浏览器抓包获取到的cookie字符串,转换成字典,以便用于发送请求时传递给cookies参数
'''
import requests
# 1. 准备目标url地址
url = 'http://manager-health-java.itheima.net/pages/main.html'
# 2. 准备请求头信息,User-Agent,(从浏览器抓包复制)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"
}
# 准备cookies字典
cookie_dict = {
'JSESSIONID': '14C7DFBF244EB81DC281FC1B96EF88D6' #cookie是有过期时间的
}
# 3. 发送请求,获取响应数据
response = requests.get(url, headers=headers, cookies=cookie_dict)
# 4. 查看响应的内容
print(response.content.decode())
requests中cookiejar处理
'''
转换方式
# 将cookiejar转换成字典类型
cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)
# 将字典类型转换成cookiejar类型
cookies_jar = requests.utils.cookiejar_from_dict(cookies_dict)
其中response.cookies返回的就是cookieJar类型的对象
requests.utils.dict_from_cookiejar函数返回cookies字典
'''
示例代码:
import requests
url = 'https://www.baidu.com'
response = requests.get(url)
print(f'获取到的cookiejar对象为:{response.cookies}')
cookie_dict = requests.utils.dict_from_cookiejar(response.cookies)
print(f'将cookiejar转换为字典:{cookie_dict}')
cookie_jar = requests.utils.cookiejar_from_dict(cookie_dict)
print(f'将cookie_dict转换成cookiejar:{cookie_jar}')
案例:百度贴吧爬虫
import time
import requests
#url地址的模板
base_url = 'https://tieba.baidu.com/f?kw={}&pn={}'
#获取要抓取的贴吧的名字
tb_name = input('请输入要抓取贴吧的名字:')
#获取要抓取的页数
page_num = int(input("请输入要抓取的页数:"))
#构造url地址
url_list = [base_url.format(tb_name, i * 50) for i in range(page_num)]
#准备headers中的User-Agent
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36",
'Cookie': 'BIDUPSID=FFC2CDB80F7944FEFB261E1424C119EB;'
}
# 遍历每一页的url地址,发送请求,获取响应
for i ,url in enumerate(url_list): #enumerate获取元素索引位置,元素
response = requests.get(url,headers=headers)
#将获取的到得响应内容,保存到文件中
# 构造文件名
file_name = tb_name + "第{}页.html".format(i + 1)
# 打开文件,将数据保存到文件中
with open(file_name, 'w', encoding='utf-8') as f:
f.write(response.content.decode())
print(file_name, '保存成功')
# 设置time.sleep() 防止访问速度过快
time.sleep(2)
案例:黑马论坛爬虫
"""
需求:
1. 给定一个贴吧名字,给定要抓取的页数
2. 将贴吧的每一页数据保存到 html 中
分析:
1. 让用户输入贴吧名称和要抓取的页数
2. 构造出要抓取贴吧页面地址
3. 遍历向每个地址发送请求,并将响应的内容保存成 html 页面
3.1 准备请求头
3.2 循环遍历地址列表
3.3 发送请求获取响应
3.4 保存成html文件
3.5 设置休眠,防止频率太快被阻止请求
"""
import time
import random
import requests
"""1. 让用户输入贴吧名称和要抓取的页数"""
name = input('请输入论坛名称')
page = int(input('请输入页数'))
print(name, page)
"""2. 构造出要抓取贴吧页面地址"""
base_url = 'http://bbs.itheima.com/thread-{}-{}-1.html'
url_list = [base_url.format(name, i + 1) for i in range(page)]
print(url_list)
"""3. 遍历向每个地址发送请求,并将响应的内容保存成 html 页面"""
# 3.1 准备请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
# 3.2 循环遍历地址列表
for i, url in enumerate(url_list):
# 3.3 发送请求获取响应
response = requests.get(url, headers=headers)
# 3.4 保存成html文件
filename = name + "第{}页.html".format(i + 1)
with open(filename, 'w', encoding='utf8') as file:
file.write(response.text)
# 3.5 设置休眠,防止频率太快被阻止请求
# random.randint(1, 3) # 生成随机范围的整数
# random.uniform(1, 3) # 生成随机范围的小数
time_str = random.uniform(1, 3)
time.sleep(time_str)
print(time_str)
案例:豆瓣top250
import requests
import re
#需要爬取的页数
page = int(input('请输入你要爬取的页数:'))
#构造url地址
base_url= 'https://movie.douban.com/top250?start={}'
url_list= [base_url.format(i * 25) for i in range(page)]
#准备请求头
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0'
}
#循环遍历地址列表
for i ,url in enumerate(url_list):
response = requests.get(url, headers=headers)
page_content = response.text
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)</span>', re.S)
result = obj.findall(page_content)
for i in result:
with open('豆瓣top250.txt', 'a', encoding='utf8') as file:
file.write(i)
file.write("\n")