实战案例

一、采集猫眼电影榜

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()

 

posted @ 2020-05-11 19:05  酒剑仙*  阅读(247)  评论(0)    收藏  举报