一、引言

在开发「基于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)以获取最新的进展和更新。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐