爬虫实战案例(两个)
该博客展示两个简单的爬虫实战案例,一个是从人民邮电出版社上爬取其中一个分类的全部图书信息,另一个是在苏宁易购上爬取某个商品的好评和差评,用两个简单的案例讲解爬虫在实际情况下的运作流程
一、获取图书信息
需求:统计人民邯电出版社官网中与关键词“python”有关的全部图书,包含图书名、价格、作者名等信息,并将获取的信息写入“Excel图书汇总,txt”文件中。
流程:
- 配置浏览器并打开目标网站
- 搜索 "Python" 相关图书,进入完整列表页
- 遍历当前页图书,打开详情页提取信息并写入文件
- 自动点击下一页,重复爬取直到没有更多页面
- (理论上)完成后关闭文件
第一部分:导入依赖库
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
selenium.webdriver
:Selenium 的核心模块,用于控制浏览器Options
:Edge 浏览器的配置选项类,用于设置浏览器启动参数Keys
:提供键盘按键模拟(如回车、空格等)By
:定位元素的方式集合(如通过类名、ID、XPATH 等定位元素)time
:用于添加等待时间,确保页面元素加载完成
第二部分:定义信息获取函数 get_information
def get_information(driver):time.sleep(2) # 等待2秒,确保页面加载完成# 定位所有图书图片元素(class为'book_img')eles_p = driver.find_elements(by=By.CLASS_NAME, value='book_img')for ele_p in eles_p:ele_p.click() # 点击图书图片,打开图书详情页(新窗口)time.sleep(2) # 等待新窗口加载# 获取所有窗口句柄,切换到最新打开的窗口(详情页)handles = driver.window_handlesdriver.switch_to.window(handles[-1])time.sleep(2) # 等待详情页元素加载# 提取图书信息:书名、作者、价格、亮点(通过class定位元素并获取文本)name = driver.find_element(by=By.CLASS_NAME, value='book-name').textauthor = driver.find_element(by=By.CLASS_NAME, value='book-author').textprice = driver.find_element(by=By.CLASS_NAME, value='price').textsummary = driver.find_element(by=By.CLASS_NAME, value='book-summary').text# 将信息写入文件,用制表符分隔file.write(f'书名:{name}\t,作者:{author}\t,价格:{price}\t,亮点:{summary}\n')time.sleep(2) # 等待写入完成driver.close() # 关闭当前详情页窗口# 切换回图书列表页窗口handles = driver.window_handlesdriver.switch_to.window(handles[-1])time.sleep(1) # 短暂等待,确保切换完成
- 功能:从图书列表页遍历每本图书,打开详情页提取信息并写入文件
- 关键逻辑:
- 通过
find_elements
批量获取图书图片元素 - 循环点击图片打开新窗口(详情页)
- 通过
window_handles
管理窗口切换(句柄是窗口的唯一标识) - 提取信息后关闭详情页,切回列表页继续下一本
- 通过
第三部分:初始化文件和浏览器配置
# 打开文件准备写入,编码为utf-8防止中文乱码
file = open('python图书信息汇总.txt', 'w', encoding='utf-8')# 配置Edge浏览器选项
edge_options = Options()
# 指定Edge浏览器的安装路径(非默认路径时需要手动设置)
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# 注释掉的代码:开启无头模式(不显示浏览器窗口,适合后台运行)
# edge_options.add_argument('--headless')# 初始化Edge浏览器驱动
driver = webdriver.Edge(options=edge_options)
- 文件操作:以写入模式打开
python图书信息汇总.txt
,用于保存爬取的图书信息 - 浏览器配置:
- 指定 Edge 可执行文件路径(解决浏览器安装路径非默认的问题)
- 无头模式被注释,说明当前会显示浏览器窗口(方便调试)
第四部分:访问网站并执行搜索
# 打开目标网站(人民邮电出版社官网)
driver.get('https://www.ptpress.com.cn/')# 定位搜索框(通过XPATH找第一个type为text的输入框),输入"Python"并回车搜索
element = driver.find_elements(By.XPATH, '//input[@type="text"]')[0].send_keys("Python" + Keys.RETURN)# 切换到搜索结果新窗口
handles = driver.window_handles
driver.switch_to.window(handles[-1])# 点击"查看更多"按钮(ID为'booksMore'),加载更多图书
elements = driver.find_element(by=By.ID, value='booksMore').click()# 切换到新打开的更多图书列表页
handles = driver.window_handles
driver.switch_to.window(handles[-1])
- 访问网站:通过
driver.get
打开出版社官网 - 搜索逻辑:
- 定位搜索框并输入 "Python",用
Keys.RETURN
模拟回车提交搜索 - 搜索结果会打开新窗口,通过
switch_to.window
切换到结果页 - 点击 "查看更多" 按钮加载完整列表,再次切换到新窗口
- 定位搜索框并输入 "Python",用
第五部分:爬取信息并翻页
# 调用函数爬取当前页图书信息
get_information(driver)# 循环点击下一页,继续爬取(无限循环,直到没有下一页会报错终止)
while True:driver.find_element(by=By.CLASS_NAME, value='ivu-page-next').click() # 点击下一页按钮get_information(driver) # 爬取下一页信息# 关闭文件(注:由于上面是无限循环,这行代码可能永远执行不到,需要手动处理循环终止)
file.close()
- 爬取逻辑:先爬取第一页信息,然后通过
while True
循环点击 "下一页" 按钮,持续爬取后续页面 - 潜在问题:循环没有终止条件,当没有下一页时(找不到
ivu-page-next
元素)会抛出异常,导致程序终止,文件可能无法正常关闭(实际使用时需要添加异常处理)
二、获取评价
平时训练模型时需要用到大量数据 ,而这些数据不是人工一步步输入的,爬虫这这方被大量使用,获取商品的好评和差评是最常见的操作。现在需要获取苏宁易购上面某个商品的好评和差评。
流程:
- 定义获取评价的通用函数
get_pj
- 配置浏览器并爬取优质评价(多页)
- 切换到差评页面,爬取所有差评(多页)
- 分别将优质评价和差评保存到不同文件
第一部分:导入依赖库
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
import time
- 导入 Selenium 相关模块用于浏览器控制和元素定位
By
用于指定元素定位方式time
用于添加等待时间,确保页面加载完成
第二部分:定义获取评价的函数 get_pj
def get_pj(file):# 定位所有评价内容元素(class为'body-content')pj_element_content = driver.find_elements(by=By.CLASS_NAME, value='body-content')# 遍历所有评价元素,将文本写入文件for i in range(len(pj_element_content)):file.write(pj_element_content[i].text + '\n')
- 功能:从当前页面提取所有评价内容并写入指定文件
- 实现逻辑:
- 通过
find_elements
批量获取 class 为body-content
的评价元素 - 循环遍历每个评价元素,将文本内容写入文件(每条评价后加换行)
- 通过
第三部分:爬取优质评价
# 打开文件用于保存优质评价,编码为utf-8防止中文乱码
yzp_file = open('优质评价.txt', 'w', encoding='utf-8')# 配置Edge浏览器选项
edge_options = Options()
# 指定Edge浏览器的安装路径
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
# 注释掉的代码:开启无头模式(不显示浏览器窗口)
# edge_options.add_argument('--headless')# 初始化Edge浏览器驱动
driver = webdriver.Edge(options=edge_options)# 打开优质评价页面
driver.get('https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166')# 定位"下一页"按钮(通过CSS选择器)
next_go = driver.find_elements(By.CSS_SELECTOR, '.next.rv-maidian')
time.sleep(2) # 等待页面加载# 调用函数获取当前页的优质评价
get_pj(yzp_file)# 循环翻页获取所有优质评价
while next_go != []:next_go = next_go[0] # 获取第一个"下一页"按钮元素time.sleep(2) # 等待页面稳定next_go.click() # 点击下一页get_pj(yzp_file) # 获取当前页评价# 重新定位下一页按钮(避免元素过时)next_go = driver.find_elements(By.CSS_SELECTOR, '.next.rv-maidian')# 关闭优质评价文件
yzp_file.close()
# 关闭当前浏览器窗口
driver.close()
- 优质评价爬取流程:
- 初始化浏览器并打开优质评价页面
- 定位 "下一页" 按钮元素
- 先爬取第一页评价
- 通过
while
循环判断是否有下一页:- 有下一页则点击并爬取当前页评价
- 无下一页则退出循环
- 完成后关闭文件和当前窗口
第四部分:爬取差评
# 打开差评页面
driver.get('https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-bad.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166')# 定位"下一页"按钮(注意:这里定位方式有语法错误,class名之间不应有空格)
next_go = driver.find_elements(by=By.CLASS_NAME, value='next rv-maidian ')# 打开文件用于保存差评
cpl_file = open('差评.txt', 'w', encoding='utf-8')# 调用函数获取当前页的差评
get_pj(cpl_file)# 循环翻页获取所有差评
while next_go != []:next_go = next_go[0] # 获取第一个"下一页"按钮元素time.sleep(2) # 等待页面稳定next_go.click() # 点击下一页get_pj(cpl_file) # 获取当前页评价# 重新定位下一页按钮(使用正确的CSS选择器)next_go = driver.find_elements(By.CSS_SELECTOR, '.next.rv-maidian')# 关闭差评文件
cpl_file.close()
# 关闭浏览器窗口
driver.close()
- 差评爬取流程与优质评价类似,但有一个潜在问题:
- 定位下一页按钮时使用了
By.CLASS_NAME, value='next rv-maidian '
,这是错误的 CLASS_NAME
不能同时指定多个类名(空格会被当作作文本的一部分),正确做法是使用 CSS 选择器(如前面的.next.rv-maidian
)
- 定位下一页按钮时使用了
- 整体逻辑:打开差评页面 → 爬取当前页 → 循环翻页爬取 → 关闭文件和窗口