自动化爬虫DrissionPage

自动化爬虫DrissionPage

目录

1.使用自动化爬虫DrissionPage

2.操作浏览器并爬取数据保存到本地

3.实战

我们在讲之前, 说说DrissionPage和Selenium这两个自动化爬虫之间的对比。

Selenium自动话爬虫需要下载对应版本的浏览器的驱动并将驱动放置到项目文件夹里面去, 需要用代码Service(r'chromedriver.exe')来指定驱动的路径, 而DrissionPage自动化爬虫不需要这些操作。

DrissionPage相对比Selenium的语法稍微简单些。

我还是更推荐大家之后去使用DrissionPage。但不代表Selenium没有存在的意义, 很多网站的自动化爬虫的方法, 也都在用Selenium。

一、使用自动化爬虫DrissionPage

我们在使用自动化DrissionPage爬虫之前, 需要安装第三方库。

cmd 复制代码
pip install drissionpage

安装好以后均可使用。

导包:

python 复制代码
from DrissionPage._configs.chromium_options import ChromiumOptions
from DrissionPage._pages.chromium_page import ChromiumPage

我们创建一个浏览器对象, 并打开网页

python 复制代码
page = ChromiumPage()
page.get('https://www.mi.com/shop/category/list')

结果:


我们成功的打开了网页。

DrissionPage的基本操作

获取网页的源代码:

python 复制代码
print(page.html)

解析数据, 获取标签对象:

python 复制代码
浏览器对象.ele() #拿一个标签
浏览器对象.eles() #拿多个标签

根据标签名获取标签对象(tag:标签名):

python 复制代码
print(page.ele('tag:div'))

返回结果:如果根据表达式能够成功获取到某一个标签,则返回标签对象,反之则获取None。

python 复制代码
print(page.eles('tag:div'))

返回结果:如果根据表达式能够成功获取到标签,则返回列表,列表中装标签对象,反之则获取空列表。

同理, 还有id, class, name等属性, xpath之类的操作。

通过id属性获取标签对象 id='app' #app:

python 复制代码
print(page.ele('#app'))

通过class属性获取标签对象 class="breadcrumbs" .breadcrumbs:

python 复制代码
print(page.ele('.breadcrumbs'))

通过name属性获取标签对象 @属性名=属性值:

python 复制代码
print(page.ele('@name=description'))

@属性名=属性值, 这里面的属性名, 可以是其它在标签里面的任意属性。

比如:

python 复制代码
print(page.ele('@id=app'))

通过xpath筛选 配合前缀:xpath:或者x:

python 复制代码
print(page.ele('xpath://div[@id="app"]'))

或者:

python 复制代码
print(page.ele('x://div[@id="app"]'))

获取文本内容 标签对象.text:

python 复制代码
print(page.ele('tag:title').text)

获取属性值 标签对象.attr(属性名):

python 复制代码
print(page.ele('@name=description').attr('content'))

二、操作浏览器并爬取数据保存到本地

我们还是以那个当当网为例子:

url是https://www.mi.com/shop/category/list

我们先用DrissionPage打开网页:

python 复制代码
import time

from DrissionPage._pages.chromium_page import ChromiumPage
# alt+enter
page = ChromiumPage()
# 打开网页
page.get('https://www.mi.com/shop/category/list')

然后我们在网页的右上边那里的输入框输入文字并且点击搜索按钮进行搜索内容:

python 复制代码
# 往搜索框中输入手机
page.ele('#search').input('手机')
# 点击放大镜
page.ele('x://input[@type="submit"]').click()

获取商品数据:

python 复制代码
divs = page.eles('.goods-item')

获取商品和价格:

python 复制代码
    for div in divs:
        # 商品名字
        name = div.ele('tag:h2').text
        # 价格
        price = div.ele('tag:span').text
        sheet.append([name, price])
        print(name, price)

在这些基础上, 我们还需要加上分页查询并且要保存到excel表格里面这两个需求。

完整代码:

python 复制代码
import time

from DrissionPage._pages.chromium_page import ChromiumPage
# alt+enter
page = ChromiumPage()
# 打开网页
page.get('https://www.mi.com/shop/category/list')

# 点击某个标签
# 标签对象.click()
# page.ele('@alt=Xiaomi MIX系列').click()
# 往文本框输入内容
# 往搜索框中输入耳机
page.ele('#search').input('手机')
# 点击放大镜
page.ele('x://input[@type="submit"]').click()
count=1
# 获取商品数据
# 每个商品都在goods-item的标签中
'''
1-没有获取到全部的数据:网页数据还没有加载,代码执行过快
2-轮动条没有到网页的最后,导致数据未加载

'''
# 写入数据到excel文件中
import openpyxl
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = '小米商城数据'
sheet.append(['名称','价格'])
while True:
    time.sleep(2)
    # 滚动滚动条 一页数据比较多的情况下
    page.run_js('window.scrollBy(0,document.documentElement.scrollHeight)')
    divs = page.eles('.goods-item')
    for div in divs:
        # 商品名字
        name = div.ele('tag:h2').text
        # 价格
        price = div.ele('tag:span').text
        sheet.append([name, price])
        print(count,name, price)
        count+=1
    # 实现点击分页  如果不能继续点击,则出异常,标签对象获取不到
    try:
        page.ele('x://a[@class="numbers last"]',timeout=3).click()
    except Exception as e:
        print(e)
        # 没有分页了
        break

wb.save('小米商城数据.xlsx')

结果:

excel表格里面成功保存着数据。

控制台:

实战:

利用DrissionPage自动化爬虫, 打开当当网, 随便搜索内容, 搜索之后的界面, 获取每个商品里面的信息(如标题, 价格, 商店名称之类的信息)。

url是:https://www.dangdang.com/。

先不要马上看答案, 自己尝试的做一做哦!!!

参考答案:

python 复制代码
from DrissionPage._configs.chromium_options import ChromiumOptions
from DrissionPage._pages.chromium_page import ChromiumPage
import openpyxl

page = ChromiumPage()
page.get("https://www.dangdang.com/")
page.set.window.max()
page.ele("#key_S").input("智能魔方")
page.ele(".button").click()
grocery_list = page.eles('x://ul[@class="bigimg cloth_shoplist"]//li')
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "商品信息"
ws.append(["标题", "价格", "商店名称"])
count = 1

for item in grocery_list:
    # 商品标题
    title = item.ele('x:.//p[@class="name"]//a').attr("title")
    # 价格
    price = item.ele('x:.//p[@class="price"]//span').text
    # 店名
    try:
        store_name = item.ele('x:.//p[@class="link"]//a').text
    except Exception:
        store_name = "无名氏"
    ws.append([title, price, store_name])
    print(count, "标题:", title, "\t价格:", price, "\t商店名称:", store_name)
    count += 1
wb.save("商品信息.xlsx")

结果:


这道实战题, 你写出来了吗? 如果写出来的话, 给自己鼓掌哦👏

以上就是自动化爬虫DrissionPage的所有内容了, 如果有哪里不懂的地方,可以把问题打在评论区, 欢迎大家在评论区交流!!!

如果我有写错的地方, 望大家指正, 也可以联系我, 让我们一起努力, 继续不断的进步.

学习是个漫长的过程, 需要我们不断的去学习并掌握消化知识点, 有不懂或概念模糊不理解的情况下,一定要赶紧的解决问题, 否则问题只会越来越多, 漏洞也就越老越大.

人生路漫漫, 白鹭常相伴!!!

相关推荐
迈威通信2 分钟前
迈威通信助力海上探测,守护蓝色疆域
网络·自动化·能源
北京_宏哥4 分钟前
《最新出炉》系列入门篇-Python+Playwright自动化测试-50-滚动条操作
python·前端框架·测试
九年义务漏网鲨鱼7 分钟前
【人脸伪造检测后门攻击】 Exploring Frequency Adversarial Attacks for Face Forgery Detection
论文阅读·python·算法·aigc
天冬忘忧21 分钟前
Spark 共享变量:广播变量与累加器解析
大数据·python·spark
NK.MainJay35 分钟前
Go语言 HTTP 服务模糊测试教程
python·http·golang
南宫理的日知录39 分钟前
106、Python并发编程:深入浅出理解线程池的内部实现原理
开发语言·python·学习·编程学习
萧鼎1 小时前
Python中的随机数生成与控制:random库实战解析
python·random·随机数
三维重建--小博主2 小时前
人群计数制作私有数据集教程-----自用
python·opencv·计算机视觉
sagima_sdu2 小时前
Python 操作 Neo4J,Python 库 Py2Neo
python·oracle·neo4j
B站计算机毕业设计超人2 小时前
计算机毕业设计Python+Neo4j中华古诗词可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析 PyTorch Tensorflow LSTM
pytorch·python·深度学习·机器学习·知识图谱·neo4j·数据可视化