小试牛刀: 使用 Python + DrissionPage, 自动爬取网页数据

751 阅读2分钟

前言: 在数据为王的时代, 都想拿到海量数据通过层层包装转化成付费产品, 所以数据有多重要不言而喻, 所以尝试一下

看效果:

20240510_171904.gif

上代码:

from DrissionPage import ChromiumPage
import time
import json
import asyncio

page = ChromiumPage()

page.get('http://epub.cnipa.gov.cn/Advanced')
# 等待加载
page.wait.load_start()
# 设置查询条件
page.ele('#ad_begin').input('2023.05.10')
page.ele('#ad_end').input('2024.05.10')
# 点击查询按钮
page.ele('.icon-sea').click()

page.wait.load_start()
# 默认是 3条/页
page.ele('#sizeSelect').click()
# 选择是 10条/页
page.ele('@value=10').click()
# 等待页面加载
page.wait.load_start()

# 封装异步方法
async def collect_titles_from_pages(pagecur, num_pages=100):
    my_list = []  # 初始化存储列表
    ele_click = 0
    for i in range(num_pages):
        # 等待加载完成
        pagecur.wait.load_start()

        # 获取当前页面的所需要元素
        sub_gbhs = pagecur.eles('申请公布号:')
        sub_gurs = pagecur.eles('申请公布日:')
        sub_sqhs = pagecur.eles('申请号:')
        sub_sqds = pagecur.eles('申请日:')
        sub_sqrs = pagecur.eles('申请人:')
        sub_fmrs = pagecur.eles('发明人:')
        sub_dzs = pagecur.eles('地址:')
        sub_zys = pagecur.eles('摘要:')
        titles = pagecur.eles('.title')
        # 等待一下
        await asyncio.sleep(2)
        # 遍历所有元素并添加到结果列表中
        # for title in titles:
        for ix in range(len(titles)):
            my_list.append({
                "title": titles[ix].text,
                "sub_gbh": sub_gbhs[ix].next().text,
                "sub_gur": sub_gurs[ix].next().text,
                "sub_sqh": sub_sqhs[ix].next().text,
                "sub_sqd": sub_sqds[ix].next().text,
                "sub_sqr": sub_sqrs[ix].next().text,
                "sub_fmr": sub_fmrs[ix].next().text,
                "sub_dz": sub_dzs[ix].next().text,
                "sub_zy": sub_zys[ix].next().text,
            })
        # 赋值目的: 是否可执行点击下一页操作
        ele_click = 1
        try:
            # 如果不能点击下一页, 继续等待
            if ele_click == 0:
                await asyncio.sleep(5)
            # 如果可以点击下一页, 执行操作
            if ele_click == 1:
                next_page_element = pagecur.ele('.next_page')
                if next_page_element:
                    next_page_element.click()
                    # 赋值目的: 初始化
                    ele_click = 0
                else:
                    break  # 如果没有下一页按钮,则退出循环
        except Exception as e:
            print(f"Error clicking next page: {e}")
            break  # 或者你可以选择处理异常并继续,或者记录日志等

    return my_list  # 返回包含所有数据列表


# 异步执行
my_list = asyncio.run(collect_titles_from_pages(page, 2))

# 打印看看
print(my_list)

# list 转 json 并 存储本地
with open("patent.json", "w", encoding="utf-8") as f:
    json.dump(my_list, f, ensure_ascii=False, indent=4)

爬数据:

微信图片_20240510173023.png

束语: 谁说前端只能切图仔, 只要你愿意学习, 没有什么能难倒你。