第2章 网络爬虫基础(Requests/BeautifulSoup)
理论6课时 + 上机6课时 | 难度:核心重点
2.1 HTTP协议基础(通俗版)
HTTP就是浏览器和网站服务器之间"对话"的规则。你输入网址回车,浏览器就会发送一个请求(Request)给服务器,服务器收到后返回一个响应(Response),里面包含网页内容。 常见的请求方法: GET:向服务器"要"数据,比如打开一个网页。 POST:向服务器"提交"数据,比如登录时提交用户名密码。
2.2 安装Requests库
Requests是Python里用来发送HTTP请求的第三方库,使用非常简单。
# 打开命令提示符(CMD)或终端,输入:
pip install requests
# 验证安装成功
python -c "import requests; print(requests.__version__)"
2.3 使用Requests发送GET请求
import requests
# 发送GET请求获取网页
url = "https://www.example.com"
response = requests.get(url)
# 查看响应状态码:200表示成功
print(response.status_code)
# 查看网页内容(文本形式)
print(response.text)
# 设置编码(防止中文乱码)
response.encoding = 'utf-8'
2.4 安装BeautifulSoup4
# 安装BeautifulSoup4和解析器
pip install beautifulsoup4 lxml
# 验证安装
python -c "from bs4 import BeautifulSoup; print('安装成功')"
2.5 使用BeautifulSoup解析HTML
from bs4 import BeautifulSoup
import requests
url = "https://www.example.com"
response = requests.get(url)
response.encoding = 'utf-8'
# 创建BeautifulSoup对象
soup = BeautifulSoup(response.text, 'lxml')
# 获取网页标题
title = soup.find('title').text
print("标题:", title)
# 获取所有段落文字
paragraphs = soup.find_all('p')
for p in paragraphs:
print(p.text)
2.6 CSS选择器定位元素
CSS选择器是用来"选中"网页中特定元素的方法,就像你用手指指着说"我要这个"。
# 通过标签名查找
soup.find('h1') # 找第一个h1标签
soup.find_all('a') # 找所有a标签(链接)
# 通过class查找
soup.find('div', class_='content')
# 通过id查找
soup.find('div', id='main')
# 使用CSS选择器(更灵活)
soup.select('.title') # 找class为title的元素
soup.select('#header') # 找id为header的元素
soup.select('div p') # 找div里面的p标签
2.7 处理请求异常
import requests
from requests.exceptions import RequestException
url = 'https://www.example.com'
try:
response = requests.get(url, timeout=10)
response.raise_for_status() # 如果状态码不是200,会抛出异常
print('请求成功')
except RequestException as e:
print(f'请求出错:{e}')
2.8 保存数据到文件
# 保存为文本文件
with open('data.txt', 'w', encoding='utf-8') as f:
f.write(response.text)
# 保存为CSV文件(需要import csv)
import csv
with open('data.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['标题', '链接']) # 写入表头
for item in data_list:
writer.writerow([item['title'], item['link']])
自学拓展素材
- 免费教程:Requests官方文档(requests.readthedocs.io,有中文社区翻译版)
- 免费教程:BeautifulSoup官方文档(www.crummy.com/software/BeautifulSoup/bs4/doc/)
- 视频教程:B站搜索"Python爬虫入门",推荐播放量高的实战系列
- 实训数据集:以各大新闻网站、电商网站为练习目标(注意遵守robots协议)
- 推荐练习网站:httpbin.org(测试HTTP请求的各种接口)
自学自检小问题
- GET和POST请求有什么区别?什么时候用GET,什么时候用POST?
- 状态码200、404、500分别代表什么意思?
- 写出一段代码:用Requests获取百度首页,并打印出网页标题。
- BeautifulSoup的find()和find_all()有什么区别?
- 如果网页出现中文乱码,应该怎么解决?
- 如何用CSS选择器选中class为"item"的所有div元素?
基础巩固层练习
0/7
第1题
选择题
HTTP状态码200表示什么意思?
答案解析
200表示请求已成功处理。A是500,C是404,D是403。
第2题
选择题
以下哪个Python库用于解析HTML文档?
答案解析
BeautifulSoup专门用于解析HTML/XML。requests用于发送HTTP请求,pandas用于数据处理,numpy用于数值计算。
第3题
选择题
BeautifulSoup中,查找所有匹配元素的方法是?
答案解析
find_all()返回所有匹配元素的列表。find()只返回第一个匹配元素。
第4题
选择题
requests.get()返回的响应对象中,获取文本内容应使用?
答案解析
response.text返回响应的文本内容(字符串形式)。response.content返回字节形式,response.json()返回解析后的JSON对象。
第5题
判断题
CSS选择器中,#header表示选中class为header的元素。
答案解析
#header表示选中id为header的元素。.header才表示选中class为header的元素。
第6题
判断题
GET请求可以携带请求体(body)发送数据。
答案解析
GET请求的数据放在URL参数中,POST请求才放在请求体中。
第7题
填空题
设置请求编码防止中文乱码的代码是 response.encoding = ______
答案解析
将响应编码设置为utf-8可以正确显示中文。
0/0