Python爬虫教程:解析requests.get()响应对象与BeautifulSoup提取HTML内容
import requests
# 发送GET请求
url = "https://www.example.com"
response = requests.get(url)
# 查看返回的状态码
print("Status Code:", response.status_code)
# 获取网页的内容(HTML)
html_content = response.text
print(html_content[:500]) # 输出前500个字符

解析响应
requests.get()返回的对象包含诸多有用信息,像状态码以及响应内容等。response.text 能获取到网页的 HTML 源码。我们通过对返回的状态码进行检查,就可以确定请求是否成功,其中状态码 200 意味着成功。
3. 解析HTML内容
获取到网页内容之后,我们得解析 HTML 来提取所需的信息。BeautifulSoup 是 Python 里较为常用的 HTML 解析库之一,它具备将 HTML 文档转化为树状结构的能力,这样能让我们便于进行操作。
3.1 使用BeautifulSoup解析HTML
from bs4 import BeautifulSoup
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html_content, 'lxml')
# 输出解析后的HTML结构(只输出前500个字符)
print(soup.prettify()[:500])
3.2 提取特定内容
HTML 被解析成 BeautifulSoup 对象之后,我们便可以运用各种方法来提取其中的内容。比如,能够获取网页里的所有链接,或者特定标签的内容。
提取所有的标签
# 提取所有标签
links = soup.find_all('a')
# 输出所有链接的地址
for link in links:
print(link.get('href'))
提取指定ID或类名的元素
# 提取ID为'special'的元素
element_by_id = soup.find(id='special')
print(element_by_id)
# 提取类名为'content'的所有元素
elements_by_class = soup.find_all(class_='content')
for element in elements_by_class:
print(element.text)
3.3 提取和清洗文本
有时候我们需要提取 HTML 标签,同时也需要清洗掉多余的空格和换行符。 有时候我们不但需要提取 HTML 标签,还需要把多余的空格或换行符清洗掉。 有时候我们既需要提取 HTML 标签,又需要清洗掉那些多余的空格或换行符。
# 获取第一个标签的文本内容
h1_text = soup.find('h1').text.strip()
print(h1_text)
4. 爬取多个页面
如果要爬取多个网页,那么可以把网页的 URL 提取出来,接着构造循环来抓取多个页面。以爬取某个分类页作为例子,需要爬取每一页的内容。
示例:爬取分页数据
import requests
from bs4 import BeautifulSoup
base_url = 获取页面的地址为 "https://quotes.toscrape.com/page/{}/" 。该地址用于特定的操作或访问相关的内容。它是一个特定格式的链接,其中的 "{}" 通常会被具体的页码等信息所替换。
for page_num in range(1, 6): # 爬取前5页
url = base_url.format(page_num)
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'lxml')
# 提取所有名言
quotes = soup.find_all('span', class_='text')
for quote in quotes:
print(quote.text)
else:
print(f"Failed to retrieve page {page_num}")
4.1 延时请求和反爬虫
为避免给服务器带来过多负担,需在请求间加入恰当的延时。利用 time.sleep()函数能够让爬虫稍作休息。
import time
for page_num in range(1, 6):
url = base_url.format(page_num)
response = requests.get(url)
# 模拟延时,防止被反爬虫机制阻止
time.sleep(1)
# 后续代码省略
5. 数据存储
爬虫抓取到的数据一般是需要进行存储的,这样便于后续的分析与处理。在 Python 当中,常用的存储方式包含 CSV 这种方式,还有 JSON 这种方式,以及数据库等方式。
5.1 存储到CSV文件
使用 pandas 库,能够把爬取到的数据存储为 CSV 文件。首先,要把数据整理成一个 DataFrame 形式。接着,调用 to_csv()这个方法来进行保存。
import pandas as pd
quotes_data = []
抓取的名言数据已存储在 quotes_data 列表中。
for page_num in range(1, 6):
url = base_url.format(page_num)
response = requests.get(url)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'lxml')
quotes = soup.find_all('span', class_='text')
for quote in quotes:
quotes_data.append({'quote': quote.text})
time.sleep(1) # 延时请求
# 将数据保存为CSV文件
df = pd.DataFrame(quotes_data)
df.to_csv('quotes.csv', index=False)
print("Data saved to quotes.csv")
5.2 存储到JSON文件
你若想要把数据存储成 JSON 格式,那么就可以运用 Python 的 json 模块。
import json
# 将数据保存为JSON文件
with open('quotes.json', 'w', encoding='utf-8') as f:
json.dump(quotes_data, f, ensure_ascii=False, indent=4)
print("Data saved to quotes.json")
6. 反爬虫与限制
许多网站都具备反爬虫机制,这种机制会对我们访问其内容的频率进行限制。为了防止被封掉 IP 或者使访问受到限制,我们可以实施一些反爬虫的办法:
6.1 使用代理
通过代理服务器可以隐藏真实IP,从而避免IP被封禁。
proxies = {
'http': 你的代理地址是 'http://your_proxy_address' 。,
'https': '你的代理地址为 https://your_proxy_address'
}
response = requests.get(url, proxies=proxies)
6.2 设置User-Agent
许多网站会通过检查 User-Agent 字段来确定请求是否源自浏览器。能够伪装成浏览器来发送请求。
headers = {
'User-Agent': Mozilla/5.0 表示使用的是 Mozilla 公司的产品。其运行在 Windows NT 10.0 系统上,且为 64 位系统(Win64)。同时,它的内核是 WebKit/537.36,这种内核类似于 Gecko。浏览器的版本是 Chrome/58.0.3029.110,并且使用的渲染引擎是 Safari/537.36。
}
response = requests.get(url, headers=headers)
7. 总结
本文介绍了如何利用 Python 构建一个简易的网络爬虫,其中包含了 HTTP 请求、HTML 解析、数据提取、分页爬取、数据存储这些方面,同时还涉及到如何应对反爬虫机制。掌握了这些基础内容后,你便能够开始在各类网站上进行数据采集。随着爬虫技术的不断深入,你可以去学习更为复杂的技巧,像处理由 JavaScript 动态加载的网页以及分布式爬虫等。
希望这篇文章能助力你迅速踏入 Python 爬虫开发的领域,开启属于自己的数据抓取征程!
Python抓取HTML表格数据:使用Requests和Beautiful Soup快速解析与提取
Python网页数据抓取教程:使用requests和BeautifulSoup快速上手
深入理解并发Queue:ConcurrentLinkedQueue与BlockingQueue的性能与应用场景
python爬虫教程requests,Python爬虫教程大全
Python网页信息获取与解析:使用requests库爬取HTML数据的大数据时代应用
版本控制 12.什么是RESTfulAPI RESTfulAPI的幂等性以及RESTfulAPI的经常出现留意事项 (版本控制系统会存储每个版本的全量副本)