实战案例
一、采集猫眼电影榜
1.1.采集目标
目标网址:https://www.maoyan.com/board/4
采集目标:排名、电影名称、演员、上映时间、分数
1.2.编码思路
按F12,可以看到每个电影信息都包含在<dd>元素中,因此可批量获取<dd>元素,遍历它们并再从其中
from DrissionPage import ChromiumPage from DataRecorder import Recorder # 创建页面对象,使用 ChromiumPage 类,表示使用 Chromium 浏览器进行网页操作 page = ChromiumPage() # 访问猫眼电影排行榜页面 page.get('https://www.maoyan.com/board/4') # 创建记录器对象,将抓取的数据记录到 'data.csv' 文件中 recorder = Recorder('data.csv') # 使用 while 循环不断抓取页面数据,直到没有下一页为止 while True: # 遍历页面中所有的电影条目(每个电影条目在 <dd> 标签内) for mov in page.eles("tag:dd"): # 获取电影的排名,位于 <i> 标签内 num = mov("tag:i").text # 获取电影名称,使用属性选择器选择包含 title 属性的元素 title = mov("@data-act=boarditem-click").attr("title") # 获取电影的演员信息,使用 XPath 选择器定位包含演员信息的 <p> 标签 star = mov('xpath://p[@class="star"]').text # 获取电影的上映时间,使用类选择器定位包含上映时间的元素 release_time = mov(".releasetime").text # 获取电影的评分,使用类选择器定位包含评分的元素 score = mov(".score").text # 将抓取到的数据(排名、电影名称、演员、上映时间、评分)添加到记录器中 recorder.add_data((num, title, star, release_time, score)) # 获取页面中的 "下一页" 按钮,使用文本匹配来选择该元素,超时时间设为 2 秒 btn = page("下一页", timeout=2) # 判断是否存在 "下一页" 按钮 if btn: # 如果存在 "下一页" 按钮,则点击该按钮 btn.click() # 等待页面开始加载,以确保新的数据已完全加载 page.wait.load_start() else: # 如果没有 "下一页" 按钮,则说明已经到最后一页,跳出循环 break # 将记录器中的所有数据写入到 'data.csv' 文件中 recorder.record()
data.csv文件内容如下:

二、获取豆瓣图书信息和封面图片
图书信息获取:书籍名称、获取作者、出版社、日期、价格、评分、评价人数
这个示例演示在浏览器中直接保存图片。这个功能是本库一个特色,无需操作 ui,也无需重新下载图片,而是直接读取缓存里面的图片保存,使用非常方便。
2.1.页面分析
目标网址:https://book.douban.com/tag/小说
按F12,可以看到每本图书都在class属性为subject-item的元素中,可批量获取,然后再在其中获取<img>元素保存图片。

2.2.编码思路
为了演示元素对象的save()方法,这里我们使用浏览器操作,把图片文件保存到本地 imgs 文件夹。
2.3.示例代码
以下代码可直接运行。
from DrissionPage import ChromiumPage import re from DataRecorder import Recorder # 创建页面对象 page = ChromiumPage() # 访问目标网页 page.get('https://book.douban.com/tag/小说?start=0&type=T') # 创建记录器对象 recorder = Recorder('data.xlsx') # 爬取4页 for _ in range(4): # 遍历一页中所有图书 for book in page.eles('.subject-item'): # 书籍名称 title = book('xpath://h2/a').attr("title") # 获取作者 出版社 日期 价格 info = book(".pub").text # 根据 / 切片 infos = info.strip().split("/") # 有的书籍只有:珞珈 / 2022-11-1, 所以要判断长度,必须有作者、价格、日期、出版社,才取值 if len(infos) >= 4: # 价格 price = infos[-1].replace("元", "") # 日期 release_date = infos[-2] # 出版社 publishing_house = infos[-3] # 作者 是一个列表 ['[意大利] 埃莱娜·费兰特 ', ' 陈英、王彦丁、黄语瞳 '] author_list = infos[:-3] # 通过join方法将列表转换为字符串,然后将、替换为 , 空格替换为空 authors = ",".join(author_list).replace("、", ",").replace(" ", "") else: # 如果长度小于3,例如:珞珈 / 2022-11-1 不符合要求的数据之间跳过 continue # 获取电影评分 score = book(".rating_nums").text # 获取评价人数 number_reviewers = book(".pl").text numbers = re.findall(r'\d+', number_reviewers)[0] # 获取 内容评价 content_evaluation = book('xpath://div[@class="info"]/p').text # 获取封面图片对象 img = book('t:img') # 图片名称 img_name = f"{title}.jpg" # 保存图片 img.save(r'D:\imgs', img_name) # print((title, price, publishing_house, authors, score, numbers, content_evaluation, img_name)) # 写入到记录器 recorder.add_data((title, price, publishing_house, authors, score, numbers, content_evaluation, img_name)) # 点击下一页 page('后页>').click() page.wait.load_start() # 记录数据,可保存到新文件 recorder.record()

浙公网安备 33010602011771号