【项目实训 01】Python爬虫基础
一、引言
在开发「基于DeepSeek微调的HarmonyOS平台API搜索与代码生成工具」过程中,数据获取是支撑整个项目落地的核心基础。本次博客旨在记录技术探索过程,聚焦Python爬虫技术的学习与实践——我们需要通过定向爬取HarmonyOS官方文档、ArkTS代码仓库等数据源,构建高质量的结构化数据集,为后续RAG知识库构建、知识图谱生成以及模型指令微调提供原料支撑。
二、什么是网络爬虫?
网络爬虫是一种自动化程序,用于从互联网上抓取和收集数据。它可以访问网页、下载内容,并根据预设的规则进行数据处理和存储。爬虫在搜索引擎、数据挖掘、市场研究等领域有着广泛的应用。
网络爬虫的工作原理
网络爬虫通常通过以下步骤工作:
- 发送HTTP请求:爬虫向目标网站发送HTTP请求,获取网页内容。
- 解析HTML:使用HTML解析器(如BeautifulSoup)解析网页内容,提取所需的信息。
- 存储数据:将提取的数据存储到本地文件或数据库中。
网络爬虫的分类
根据不同的分类标准,爬虫可以分为以下几类:
- 按功能分类:
- 通用爬虫:抓取整个网站的所有页面。
- 聚焦爬虫:根据特定主题或关键词抓取相关页面。
- 按技术分类:
- 基于HTTP库的爬虫:使用Python的
requests库发送HTTP请求。 - 基于Selenium的爬虫:使用Selenium模拟浏览器行为,处理动态加载的内容。
- 按频率分类:
- 增量爬虫:定期更新爬取的数据。
- 一次性爬虫:只爬取一次目标网站。
三、Python爬虫开发环境搭建
安装Python
确保你的计算机已安装Python(推荐使用Python 3.8及以上版本)。可以通过官网下载并安装:Python官网
安装必要的库
使用 pip 安装我们需要的库:
pip install requests beautifulsoup4
- requests:用于发送HTTP请求。
- beautifulsoup4:用于解析HTML和XML文档。
对于更复杂的爬虫需求,你可能还需要安装以下库:
pip install lxml # 更高级的HTML解析器
pip install selenium # 用于处理动态网页
四、基础爬虫实现
使用requests和BeautifulSoup实现简单爬虫
以下是一个简单的爬虫示例,用于抓取某网站的新闻标题:
import requests
from bs4 import BeautifulSoup
# 目标网站URL
url = 'https://www.example.com'
# 发送HTTP GET请求
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
# 解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 提取新闻标题
news_titles = []
for title in soup.find_all('h2', class_='news-title'):
news_titles.append(title.text.strip())
# 打印新闻标题
for title in news_titles:
print(title)
else:
print(f"请求失败,状态码:{response.status_code}")
处理动态加载的内容
许多现代网站使用JavaScript动态加载内容,这使得传统的HTML解析方法无法获取到完整的内容。为了获取这些动态加载的内容,需要使用能够执行JavaScript的工具。Selenium是一个自动化测试工具,可以控制浏览器执行JavaScript并获取渲染后的页面内容。
安装Selenium
首先需要安装Selenium库:
pip install selenium
使用Selenium获取页面内容
以下是一个使用Selenium获取页面内容的示例:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
# 设置Chrome选项
chrome_options = Options()
chrome_options.add_argument("--headless") # 无头模式,不打开浏览器窗口
# 创建WebDriver实例
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
# 访问目标网站
driver.get("https://example.com")
# 获取页面内容
page_content = driver.page_source
# 关闭浏览器
driver.quit()
# 现在可以使用BeautifulSoup或lxml解析page_content
from bs4 import BeautifulSoup
soup = BeautifulSoup(page_content, "html.parser")
五、爬虫进阶技巧
处理分页
许多API返回的数据是分页的,需要逐页获取。可以通过检查响应中的分页信息(如当前页、总页数、每页记录数等)来实现分页获取。
使用分页参数
以下是一个使用分页参数获取所有产品数据的示例:
import requests
# 定义API端点
url = "https://api.example.com/v1/products"
# 初始化变量
page = 1
total_pages = None
all_products = []
# 循环获取数据
while total_pages is None or page <= total_pages:
# 发送GET请求,包含分页参数
params = {"page": page, "per_page": 10}
response = requests.get(url, params=params)
# 检查响应状态码
if response.status_code == 200:
# 获取响应数据
data = response.json()
# 获取分页信息
if "total_pages" in data:
total_pages = data["total_pages"]
# 获取产品数据
products = data["products"]
# 将产品数据添加到all_products列表中
all_products.extend(products)
# 增加页码
page += 1
else:
print(f"请求失败,状态码:{response.status_code}")
break
# 处理所有产品数据
for product in all_products:
print(f"产品ID:{product['id']}, 产品名称:{product['name']}, 产品价格:{product['price']}")
代理IP和反爬机制
为了防止被目标网站封禁,可以使用代理IP来轮流访问网站。同时,许多网站设置了反爬虫机制,以防止爬虫过度访问或获取敏感信息。常见的反爬虫机制包括限制请求频率、检查User-Agent、设置验证码等。
限制请求频率
为了避免被网站封禁,需要控制爬虫的请求频率,使其看起来更像人类的访问行为。以下是一个使用time.sleep控制请求间隔的示例:
import requests
import time
# 定义请求列表
urls = [
"https://example.com/page1",
"https://example.com/page2",
"https://example.com/page3"
]
# 逐个发送请求
for url in urls:
response = requests.get(url)
# 检查响应状态码
if response.status_code == 200:
# 处理响应数据
print(f"成功获取 {url}")
else:
print(f"失败获取 {url}, 状态码:{response.status_code}")
# 控制请求间隔
time.sleep(1) # 每次请求间隔1秒
伪造User-Agent
许多网站会检查请求的User-Agent,以判断是否是浏览器访问。伪造User-Agent可以使爬虫看起来更像人类使用浏览器访问。以下是一个设置User-Agent头部信息的示例:
import requests
# 定义请求URL
url = "https://example.com"
# 定义User-Agent头部信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
# 发送GET请求,包含User-Agent头部信息
response = requests.get(url, headers=headers)
# 检查响应状态码
if response.status_code == 200:
# 处理响应数据
print("成功获取页面内容")
else:
print(f"失败获取页面内容, 状态码:{response.status_code}")
处理验证码
一些网站设置了验证码机制,以进一步防止爬虫访问。处理验证码可能需要使用图像识别、OCR等技术,较为复杂。以下是一个使用Tesseract OCR识别验证码的示例:
from PIL import Image
import pytesseract
# 打开验证码图像
image = Image.open("captcha.png")
# 使用Tesseract OCR识别图像中的文字
captcha_text = pytesseract.image_to_string(image)
# 现在可以使用captcha_text进行后续操作
print(f"识别到的验证码是:{captcha_text}")
六、爬虫的伦理和法律问题
伦理问题
- 尊重网站的robots.txt文件:不要爬取被robots.txt文件禁止的页面。
- 不要频繁请求:避免对目标网站造成过大的负担。
- 保护用户隐私:不要爬取和泄露用户的个人信息。
法律问题
- 遵守相关法律法规:确保爬虫行为符合当地法律法规。
- 尊重版权:不要爬取和传播受版权保护的内容。
七、阶段性总结与后续计划
当前已完成基础爬虫框架的搭建与初期数据采集。尽管完整的知识库体系尚未成型,但目前已成功爬取有效gitee项目372个,总文件数49897个,原始数据10.3GB。后续将进一步进行数据的预处理工作,以提升数据的质量和可用性。欢迎访问我们的项目GitHub仓库(https://gitee.com/elon_z/HarmonySmartCoding)以获取最新的进展和更新。
更多推荐
所有评论(0)