该博客展示两个简单的爬虫实战案例,一个是从人民邮电出版社上爬取其中一个分类的全部图书信息,另一个是在苏宁易购上爬取某个商品的好评和差评,用两个简单的案例讲解爬虫在实际情况下的运作流程
需求:统计人民邯电出版社官网中与关键词“python”有关的全部图书,包含图书名、价格、作者名等信息,并将获取的信息写入“Excel图书汇总,txt”文件中。
流程:
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_handles
driver.switch_to.window(handles[-1])
time.sleep(2) # 等待详情页元素加载
# 提取图书信息:书名、作者、价格、亮点(通过class定位元素并获取文本)
name = driver.find_element(by=By.CLASS_NAME, value='book-name').text
author = driver.find_element(by=By.CLASS_NAME, value='book-author').text
price = driver.find_element(by=By.CLASS_NAME, value='price').text
summary = 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_handles
driver.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
,用于保存爬取的图书信息# 打开目标网站(人民邮电出版社官网)
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
打开出版社官网Keys.RETURN
模拟回车提交搜索switch_to.window
切换到结果页# 调用函数爬取当前页图书信息
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
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
)