Python 爬虫(Web Scraping)是指通过编写 Python 程序从互联网上自动提取信息的过程。
爬虫的基本流程通常包括发送 HTTP 请求获取网页内容、解析网页并提取数据,然后存储数据。
Python 的丰富生态使其成为开发爬虫的热门语言,特别是由于其强大的库支持。
一般来说,爬虫的流程可以分为以下几个步骤:
- 发送 HTTP 请求:爬虫通过 HTTP 请求从目标网站获取 HTML 页面,常用的库包括
requests
。 - 解析 HTML 内容:获取 HTML 页面后,爬虫需要解析内容并提取数据,常用的库有
BeautifulSoup
、lxml
、Scrapy
等。 - 提取数据:通过定位 HTML 元素(如标签、属性、类名等)来提取所需的数据。
- 存储数据:将提取的数据存储到数据库、CSV 文件、JSON 文件等格式中,以便后续使用或分析。
BeatuifulSoup
BeautifulSoup,它是一个用于解析 HTML 和 XML 文档的 Python 库,能够从网页中提取数据,常用于网页抓取和数据挖掘。最好安装lxml作为解析器(更快的速度)
通常搭配requests库来获取网页内容:
示例:获取网页标题
from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = 'http://baidu.com/' # 抓取baidu搜索引擎的网页内容
# 设置请求头,发送HTTP请求获取网页内容
headers = {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
}
response = requests.get(url,headers=headers)
# 中文乱码问题
response.encoding = 'utf-8'
# 确保请求成功
if response.status_code == 200:
# 使用BeautifulSoup解析网页内容
soup = BeautifulSoup(response.text, 'lxml')
# 查找<title>标签
title_tag = soup.find('title')
# 打印标题文本
if title_tag:
print(title_tag.get_text())
else:
print("未找到<title>标签")
else:
print("请求失败,状态码:", response.status_code)
BeautifulSoup 提供了多种方法来查找网页中的标签,最常用的包括 find() 和 find_all()。
find()
返回第一个匹配的标签find_all()
返回所有匹配的标签
from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = 'https://www.baidu.com/' # 抓取baidu搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'lxml')
# 查找第一个 <a> 标签
first_link = soup.find('a')
print(first_link)
print("----------------------------") #分割,方便观看
# 获取第一个 <a> 标签的 href 属性
first_link_url = first_link.get('href')
print(first_link_url)
print("----------------------------")
# 查找所有 <a> 标签
all_links = soup.find_all('a')
print(all_links)
get_text 提取标签的文本内容:
# 获取第一个 <p> 标签中的文本内容
paragraph_text = soup.find('p').get_text()
# 获取页面中所有文本内容
all_text = soup.get_text()
数据保存
示例获取电影平台中的数据
import csv
# 将数据写入 CSV 文件
with open("movies.csv", mode="w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["标题", "评分", "简短评价"])
for movie in movies:
title = movie.find("span", class_="title").text
rating = movie.find("span", class_="rating_num").text
description = movie.find("span", class_="inq")
description = description.text if description else "无简评"
# 如果找到了简短评价(即 `description` 不为 `None`),则获取其 `.text` 属性(文本内容)。
# 如果没有简短评价(即 `description` 为 `None`),则赋值为 `"无简评"` 作为默认值。
writer.writerow([title, rating, description])
# 使用 `writer.writerow()` 方法将每部电影的数据(标题、评分、简短评价)写入 CSV 文件。
# 每次写入一个电影的信息作为一行。
BeautifulSoup 是一个功能强大的网页解析库,广泛应用于数据抓取和网页解析。通过 find()
、find_all()
和 CSS 选择器等方法,你可以灵活地从 HTML 文档中提取所需的信息。为了避免爬虫被封锁,记得设置适当的请求头并遵守网站的爬取规则。