爬虫的 SOP(标準作业流程)

爬虫开发涉及多个阶段,从需求分析到最终获取数据并保存。以下是常见的爬虫 SOP:

  • 需求分析&目标明确:确定需要抓取的数据种类(例如商品价格、新闻标题、用户评论等)。目标网站:确定要抓取的网站或平台,并检查是否允许爬取(查看 robots.txt 文件)。

  • 预备工作

    • 检查网站架构:使用浏览器开发者工具(如 F12)查看目标数据的结构。
    • 确定是否需要动态加载(判断是静态页面还是 JavaScript 动态渲染)。工具选择:
    • 静态页面:适合使用 requests + BeautifulSoup。
    • 动态页面:适合使用 selenium 或 playwright。
  • 环境设置
  • 开发爬虫Python 爬虫环境準备+基础爬虫教学
  • 爬虫定位

    find 和 find_all 和 使用 CSS Selector/selenium

  • 使用 find 和 find_allfind:用于抓取符合条件的第一个元素。适合用于抓取单一资料点。find_all:用于抓取符合条件的所有元素。适合用于抓取多笔资料,例如文章列表、商品清单。
  • from bs4 import BeautifulSoup

    html = """
    <div>
    <p class="title">Title 1</p>
    <p class="title">Title 2</p>
    </div>
    """

    soup = BeautifulSoup(html, "html.parser")

    # 找第一个符合条件的 <p> 元素
    first_title = soup.find("p", class_="title")
    print(first_title.text) # Output: Title 1

    # 找所有符合条件的 <p> 元素
    all_titles = soup.find_all("p", class_="title")
    for title in all_titles:
    print(title.text)
    # Output:
    # Title 1
    # Title 2

  • 使用 CSS SelectorCSS Selector 是一种基于层级关系的选择器,灵活性更高,CSS Selector 是一种用来选择 HTML 元素的语法,它基于 HTML 文件中元素的结构来选择元素。在网页开发中,CSS Selector 用来应用样式(CSS)到特定的元素,并且在爬虫中用来定位并选取需要的资料。且能直接应用于 Selenium 等工具中,是更通用的方法
  • 在爬虫中,CSS Selector 是一种常用的工具,尤其是搭配像 BeautifulSoup 这样的解析库,来选择网页中的某些元素,并提取所需的资料。主要方法

    • select_one:抓取第一个符合条件的元素。
    • select:抓取所有符合条件的元素。范例

    from bs4 import BeautifulSoup

    html = """
    <div>
    <p class="title">Title 1</p>
    <p class="title">Title 2</p>
    </div>
    """

    soup = BeautifulSoup(html, "html.parser")

    # 使用 CSS Selector 选择第一个 <p.title>
    first_title = soup.select_one("p.title")
    print(first_title.text) # Output: Title 1

    # 使用 CSS Selector 选择所有 <p.title>
    all_titles = soup.select("p.title")
    for title in all_titles:
    print(title.text)
    # Output:
    # Title 1
    # Title 2

    CSS Selector 基本语法速查表

    选择器
    描述
    示例
    * 匹配所有元素 soup.select("*") # 所有元素
    element 匹配指定的元素 soup.select("div") # 所有 标籤
    #id 匹配具有指定 ID 的元素 soup.select("#header") # id="header" 元素
    .class 匹配具有指定类别的元素 soup.select(".intro") # class="intro" 元素
    element.class 匹配指定类别的指定元素 soup.select("p.intro") # 元素,class="intro"
    element#id 匹配具有指定 ID 的指定元素 soup.select("div#content") # 元素,id="content"
    element, element 匹配多个指定元素 soup.select("p, div") # 所有 和 标籤
    element > element 匹配指定元素的直接子元素 soup.select("div > p") # 内的所有 直系子元素
    element + element 匹配紧接在指定元素后的相邻元素 soup.select("h2 + p") # 紧接在 后面的
    element ~ element 匹配指定元素后的所有兄弟元素 soup.select("h2 ~ p") # 之后所有 兄弟元素中的
    [attribute] 匹配具有指定属性的元素 soup.select("[href]") # 具有 href 属性的元素
    [attribute=value] 匹配具有指定属性和值的元素 soup.select("[type=\'text\']") # type="text" 的元素
    [attribute^=value] 匹配属性值以指定值开头的元素 soup.select("[href^=\'https\']") # href 属性以 https 开头的元素
    [attribute$=value] 匹配属性值以指定值结尾的元素 soup.select("[href$=\'.jpg\']") # href 属性以 .jpg 结尾的元素
    [attribute*=value] 匹配属性值包含指定值的元素 soup.select("[href*=\'example\']") # href 属性包含 \'example\' 的元素

    补充说明:

    • *: 代表所有元素。
    • #id: 代表指定 ID 的元素,ID 必须是唯一的。
    • .class: 代表指定类别的元素,可以匹配多个元素。
    • element > element: 只匹配指定元素的直接子元素。
    • element + element: 只匹配紧接在指定元素后面的相邻元素。
    • element ~ element: 匹配所有位于指定元素后的兄弟元素。

    这些选择器可以帮助你快速精确地定位网页中的元素。

    find vs CSS Selector 比较

    方法
    功能
    回传结果
    用途
    范例
    find 选取符合条件的第一个元素 单一元素 用来取得第一个符合条件的单一元素 soup.find(\'a\')
    find_all 选取所有符合条件的元素 元素列表 (List) 用来取得所有符合条件的元素 soup.find_all(\'a\')
    select_one 选取符合 CSS Selector 的第一个元素 单一元素 用来选取第一个符合 CSS Selector 的元素 soup.select_one(\'.title\')
    select 选取所有符合 CSS Selector 的元素 元素列表 (List) 用来选取所有符合 CSS Selector 的元素 soup.select(\'.title\')

    补充说明:

    • find: 更适合当你需要快速定位单一元素时,且语法简单直接。
    • CSS Selector: 更强大且灵活,适合用来进行复杂的多条件筛选,也更通用,特别是在与 Selenium 或其他 JavaScript 驱动工具结合使用时。

    两者各有优势,根据具体需求选择使用。

    Python 爬虫自动更新headerPython 爬虫系列:Selenium : 进阶定位 find