爬虫的 SOP(标準作业流程)
爬虫开发涉及多个阶段,从需求分析到最终获取数据并保存。以下是常见的爬虫 SOP:
需求分析&目标明确:确定需要抓取的数据种类(例如商品价格、新闻标题、用户评论等)。目标网站:确定要抓取的网站或平台,并检查是否允许爬取(查看 robots.txt 文件)。
预备工作
- 检查网站架构:使用浏览器开发者工具(如 F12)查看目标数据的结构。
- 确定是否需要动态加载(判断是静态页面还是 JavaScript 动态渲染)。工具选择:
- 静态页面:适合使用 requests + BeautifulSoup。
- 动态页面:适合使用 selenium 或 playwright。
爬虫定位
find 和 find_all 和 使用 CSS Selector/selenium
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 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