爬取网页源代码
抓取百度首页的HTML源代码,并将其保存到一个名为baidu.html的文件中。打开这个文件,可以看到一个和百度首页一模一样的页面。
from urllib.request import urlopen
# 发送请求并获取响应
response = urlopen("http://www.baidu.com")
# 读取响应内容并解码为字符串
web_content = response.read().decode("utf-8")
# 将抓取到的网页内容保存到文件中
with open("baidu.html", mode="w", encoding="utf-8") as file:
file.write(web_content)
网页请求过程
F12的使用、HTTP协议
可以使用Chrome浏览器,按下F12打开开发者工具。
Elments:JavaScript代码以及用户操作之后显示的页面效果
Console:运行JavaScript代码片段,显示网页运行时的日志、错误和警告信息Sources:查看和调试网页的源代码文件
Network:查看网页的所有网络请求
HTTP(HyperText Transfer Protocol,超文本传输协议)是用于传输超文本(如HTML)的应用层协议,是现代Web通信的基础。它定义了客户端(如Web浏览器)和服务器之间如何请求和传递数据。
HTTP协议把一条消息分为三大块内容,无论是请求还是响应都是三块内容。
- 请求行:请求方式(get/post),请求url地址,协议版本
- 请求头:提供了附加信息,帮助服务器处理请求
- 请求体 :一般放一些请求参数
- 状态行 :协议版本,状态码,状态文本
- 响应头:提供了一些附加信息,帮助客户端处理响应
- 响应体 :服务器返回的真正客户端要用的内容(HTML,json)等
请求头的重要内容
- User-Agent:标识请求的来源,告诉服务器客户端的身份
Referer:指示当前请求的来源页面URL,用于防盗链和反爬虫,服务器可以通过Referer头判断请求是否合
Cookie:存储和传递会话信息和用户信息,通常用于身份验证和跟踪用户状态。在爬虫中,通过设置合适的Cookie,可以模拟登录后的状态,访问需要身份验证的页面。
响应头的重要内容
- cookie: 本地字符串数据信息(用户登录信息, 反爬的token)
- 各种字符串,防止攻击和反爬
请求方式
GET:
- 作用:请求从服务器获取资源。
- 特点:参数包含在URL中,适合请求静态资源或查询操作。
- 用途:爬取网页内容,获取数据。
POST:
- 作用:向服务器提交数据。
- 特点:参数包含在请求体中,适合提交表单、上传文件等操作。
- 用途:模拟用户登录,提交表单数据。
requests入门
案例1:搜狗搜索——保存搜索内容的页面
import requests
import time
import random
# 提示用户输入搜索关键字
search_query = input("请输入你要搜索的内容:")
# 构造请求URL
url = f"https://www.sogou.com/web?query={search_query}"
# 定义请求头,模拟浏览器请求
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 "
"Edg/126.0.0.0 ",
"Referer": "https://www.sogou.com/",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Accept-Encoding": "gzip, deflate, br, zstd"
}
# 使用会话对象来管理Cookies和保持状态
session = requests.Session()
# 发送GET请求并获取响应
response = session.get(url, headers=headers)
# 检查响应状态码,确保请求成功
if response.status_code == 200:
# 打开一个文件,用于保存响应内容
with open("sogou_search_results.html", mode="w", encoding="utf-8") as file:
# 将响应内容写入文件
file.write(response.text)
print("搜索结果已保存到sogou_search_results.html文件中。")
else:
# 如果请求失败,打印错误信息
print(f"请求失败,状态码: {response.status_code}")
# 增加请求间隔,模拟真实用户行为
time.sleep(random.uniform(1, 3))
请输入你要搜索的内容:你好
搜索结果已保存到sogou_search_results.html文件中。
案例2:百度翻译——获取翻译后的内容
import requests
# 提示用户输入要翻译的英语单词
english_word = input("请输入你要翻译的英语单词:")
# 准备POST请求的数据
data = {
"kw": english_word # 请求参数,与抓包工具里的参数一致
}
# 发送POST请求到百度翻译的sug接口
response = requests.post("https://fanyi.baidu.com/sug", data=data)
# 解析返回的JSON数据
response_json = response.json()
# 打印返回字典中第一个数据的翻译内容
if response.status_code == 200:
if 'data' in response_json:
first_translation = response_json['data'][0]['v']
print(f"翻译结果: {first_translation}")
else:
print("未找到相关翻译结果。")
else:
print(f"请求失败,状态码: {response.status_code}")
请输入你要翻译的英语单词:hello
翻译结果: int. 打招呼; 哈喽,喂; 你好,您好; 表示问候 n. “喂”的招呼声或问候声 vi. 喊“喂
案例3:豆瓣电影——保存豆瓣电影分类排行榜(剧情片 )的top100
import csv
import requests
# 请求URL和参数
url = 'https://movie.douban.com/j/chart/top_list'
params = {
'type': '11', # 类型,这里是剧情片类型
'interval_id': '100:90', # 评分区间,表示评分在90到100之间
'action': '', # 动作参数,此处为空
'start': '0', # 开始取数据的索引,从第一部电影开始取
'limit': '100', # 每次取出的电影数量
}
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 Edg/126.0.0.0"
}
# 发送GET请求并获取响应
response = requests.get(url=url, params=params, headers=headers)
# 将响应内容保存为JSON文件
if response.status_code == 200:
data = response.json()
with open('./douban_movies.csv', 'w', encoding='utf-8', newline='') as csvfile:
fieldnames = ['rank', 'title', 'score', 'types', 'regions', 'release_date', 'actors']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for movie in data:
writer.writerow({
'rank': movie['rank'],
'title': movie['title'],
'score': movie['score'],
'types': '/'.join(movie['types']),
'regions': '/'.join(movie['regions']),
'release_date': movie['release_date'],
'actors': '/'.join(movie['actors']),
})
print('电影数据已保存到 douban_movies.csv 文件中。')
else:
print(f'请求失败,状态码: {response.status_code}')
电影数据已保存到 douban_movies.csv 文件中。
案例4:下载图片——从豆瓣电影网站中下载一张海报
import requests
def download_image(url, file_name):
try:
# 发送GET请求获取图片数据
response = requests.get(url)
if response.status_code == 200:
# 从URL中提取文件名作为保存的文件名,将图片内容写入文件
with open(file_name, mode="wb") as f:
f.write(response.content) # 字节
print(f"图片已保存为 {file_name}")
else:
print(f"请求失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"请求异常: {e}")
# 示例:从豆瓣中下载一张电影海报
image_url = "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg"
file_name = "Example.jpg"
download_image(image_url, file_name)
图片已保存为 Example.jpg