From 14a761e1456b115f7f1d736614bc754fbe705ae1 Mon Sep 17 00:00:00 2001 From: g1879 Date: Wed, 4 Jan 2023 23:28:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/_sidebar.md | 4 +- docs/实用示例/下载星巴克产品图片.md | 14 ++-- docs/实用示例/同时操作多个浏览器.md | 27 -------- docs/实用示例/多线程操作多标签页.md | 95 +++++++++++++++++++++++++++ docs/实用示例/自动登录码云.md | 15 +++-- docs/实用示例/获取各国疫情排名.md | 66 ------------------- docs/实用示例/采集猫眼电影TOP100榜.md | 64 ++++++++++++++++++ 7 files changed, 177 insertions(+), 108 deletions(-) delete mode 100644 docs/实用示例/同时操作多个浏览器.md create mode 100644 docs/实用示例/多线程操作多标签页.md delete mode 100644 docs/实用示例/获取各国疫情排名.md create mode 100644 docs/实用示例/采集猫眼电影TOP100榜.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 79738ea..c2f9045 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -56,9 +56,9 @@ * [⚡️ 7 实用示例](#) * [🌠 自动登录码云](实用示例\自动登录码云.md) - * [🌠 获取各国疫情排名](实用示例\获取各国疫情排名.md) + * [🌠 采集猫眼电影TOP100榜](实用示例\采集猫眼电影TOP100榜.md) * [🌠 下载星巴克产品图片](实用示例\下载星巴克产品图片.md) - * [🌠 同时操作多个浏览器](实用示例\同时操作多个浏览器.md) + * [🌠 多线程操作多标签页](实用示例\多线程操作多标签页.md) * [🔖 9 版本历史](版本历史.md) diff --git a/docs/实用示例/下载星巴克产品图片.md b/docs/实用示例/下载星巴克产品图片.md index d16cad8..ad8246b 100644 --- a/docs/实用示例/下载星巴克产品图片.md +++ b/docs/实用示例/下载星巴克产品图片.md @@ -1,6 +1,6 @@ 这个示例用于演示`download()`方法的功能。 -# 页面分析 +# ✔️ 页面分析 目标网址:https://www.starbucks.com.cn/menu/ @@ -16,18 +16,20 @@ ![](https://gitee.com/g1879/DrissionPage-demos/raw/master/pics/QQ%E6%88%AA%E5%9B%BE20220117233229.jpg) -# 编码思路 +# ✔️ 编码思路 按照页面规律,我们可以获取所有`class`属性为`preview circle`的元素,然后遍历它们,逐个获取图片路径,以及在后面一个元素中获取产品名称。再将其下载。 -# 示例代码 +并且这个网址页面结构非常简单,没有使用 js 生成的页面,可以直接使用 s 模式访问。 + +# ✔️ 示例代码 ```python -from DrissionPage import MixPage +from DrissionPage import SessionPage from re import search # 以s模式创建页面对象 -page = MixPage('s') +page = SessionPage() # 网站证书好像过期了,要设置这个才能正常访问 page.session.verify = False # 访问目标网页 @@ -51,7 +53,7 @@ for div in divs: ?> **Tips:**
程序中无须创建`imgs`文件夹,`download()`方法会自动创建。 -# 结果 +# ✔️ 结果 ![](https://gitee.com/g1879/DrissionPage-demos/raw/master/pics/QQ%E6%88%AA%E5%9B%BE20220117234300.jpg) diff --git a/docs/实用示例/同时操作多个浏览器.md b/docs/实用示例/同时操作多个浏览器.md deleted file mode 100644 index b0d3daa..0000000 --- a/docs/实用示例/同时操作多个浏览器.md +++ /dev/null @@ -1,27 +0,0 @@ -在 selenium 中,一个`WebDriver`对象操作一个浏览器进程。 -对应地,DrissionPage 中一个`Drission`对象控制一个浏览器进程。 -当须要控制多个浏览器时,只需创建多个`Drission`对象即可。 - -实际上,因为`MixPage`会自动根据传入配置创建`Drission`对象,因此只需设置不同的`DriverOptions`和`MixPage`对象即可。 - -!> **注意:**
这些对象必须设置不同的`local_port`和`user_data_path`参数,否则会造成冲突。 - -```python -from DrissionPage.config import DriverOptions -from DrissionPage import MixPage - -# 创建两个配置对象指向不同端口和数据文件夹 -do1 = DriverOptions().set_paths(local_port=9222, - user_data_path=r'D:\data1') -do2 = DriverOptions().set_paths(local_port=9333, - user_data_path=r'D:\data2') - -# 通过两个配置对象创建两个页面对象 -page1 = MixPage(driver_options=do1) -page2 = MixPage(driver_options=do2) - -# 两个页面对象分别操作自己的浏览器 -page1.get('https://www.baidu.com') -page2.get('http://www.163.com') -``` - diff --git a/docs/实用示例/多线程操作多标签页.md b/docs/实用示例/多线程操作多标签页.md new file mode 100644 index 0000000..9574c7b --- /dev/null +++ b/docs/实用示例/多线程操作多标签页.md @@ -0,0 +1,95 @@ +此示例演示如何使用多个线程同时控制一个浏览器的多个标签页进行采集。 + +# ✔️ 页面分析 + +目标网址: + +- https://gitee.com/explore/ai + +- https://gitee.com/explore/machine-learning + +按`F12`,可以看到每个标题元素的`class`属性均为`title project-namespace-path`,可批量获取。 + +# ✔️ 编码思路 + +虽然 gitee 开源项目列表可以用 s 模式采集,但现在为了演示多标签页操作,还是使用浏览器进行操作。 + +使用`ChromiumPage`的`get_loc()`方法,分别获取两个标签页的对象,传入不同线程进行操作。 + +# ✔️ 示例代码 + +以下代码可直接运行。 + +须要注意的是,这里用到记录器对象,详见[DataRecorder](http://g1879.gitee.io/datarecorder)。 + +```python +from threading import Thread + +from DrissionPage import ChromiumPage +from DataRecorder import Recorder + + +def collect(tab, recorder, title): + """用于采集的方法 + :param tab: ChromiumTab 对象 + :param recorder: Recorder 记录器对象 + :param title: 类别标题 + :return: None + """ + num = 1 # 当前采集页数 + while True: + # 遍历所有标题元素 + for i in tab.eles('.title project-namespace-path'): + # 获取某页所有库名称,记录到记录器 + recorder.add_data((title, i.text, num)) + + # 如果有下一页,点击翻页 + if btn := tab('@rel=next', timeout=2): + btn.click(wait_loading=True) + num += 1 + + # 否则,采集完毕 + else: + break + + +def main(): + # 新建页面对象 + page = ChromiumPage() + # 第一个标签页访问网址 + page.get('https://gitee.com/explore/ai') + # 获取第一个标签页对象 + tab1 = page.get_tab() + # 新建一个标签页并访问另一个网址 + page.new_tab('https://gitee.com/explore/machine-learning') + # 获取第二个标签页对象 + tab2 = page.get_tab() + + # 新建记录器对象 + recorder = Recorder('data.csv') + + # 多线程同时处理多个页面 + Thread(target=collect, args=(tab1, recorder, 'ai')).start() + Thread(target=collect, args=(tab2, recorder, '机器学习')).start() + + +if __name__ == '__main__': + main() +``` + +# ✔️ 结果 + +程序生成一个结果文件 data.csv,内容如下: + +```csv +机器学习,MindSpore/mindspore,1 +机器学习,PaddlePaddle/Paddle,1 +机器学习,MindSpore/docs,1 +机器学习,scruel/Notes-ML-AndrewNg,1 +机器学习,MindSpore/graphengine,1 +机器学习,inspur-inna/inna1.0,1 +ai,drinkjava2/人工生命,1 +机器学习,MindSpore/course,1 + +后面省略。。。 +``` diff --git a/docs/实用示例/自动登录码云.md b/docs/实用示例/自动登录码云.md index 993a9c7..1109944 100644 --- a/docs/实用示例/自动登录码云.md +++ b/docs/实用示例/自动登录码云.md @@ -1,6 +1,6 @@ 此示例演示使用控制浏览器的方式自动登录 gitee 网站。 -# 网页分析 +# ✔️ 网页分析 网址:https://gitee.com/login @@ -10,18 +10,20 @@ ![](https://gitee.com/g1879/DrissionPage-demos/raw/master/pics/QQ截图20220118000346.jpg) -# 编码思路 +# ✔️ 编码思路 有`id`属性的元素获取非常简单。两个输入框直接用`id`属性定位即可。 登录按钮没有`id`属性,但可观察到它是第一个`value`属性为`'登 录'`的元素,用中文定位也可以增强代码可读性。 -# 示例代码 +由于使用浏览器登录,这里用`ChromiumPage`来控制浏览器。 + +# ✔️ 示例代码 ```python -from DrissionPage import MixPage +from DrissionPage import ChromiumPage # 用 d 模式创建页面对象(默认模式) -page = MixPage() +page = ChromiumPage() # 跳转到登录页面 page.get('https://gitee.com/login') @@ -34,9 +36,8 @@ page.ele('#user_password').input('你的密码') page.ele('@value=登 录').click() ``` -# 结果 +# ✔️ 结果 登录成功。 ![](https://gitee.com/g1879/DrissionPage-demos/raw/master/pics/QQ%E6%88%AA%E5%9B%BE20220118000945.jpg) - diff --git a/docs/实用示例/获取各国疫情排名.md b/docs/实用示例/获取各国疫情排名.md deleted file mode 100644 index 0c5b091..0000000 --- a/docs/实用示例/获取各国疫情排名.md +++ /dev/null @@ -1,66 +0,0 @@ -此示例爬取全球新冠情况排行榜。该网站是纯 html 页面,特别适合 s 模式爬取和解析。 - -# 页面分析 - -网址:https://www.outbreak.my/zh/world - -目标:获取所有国家疫情排名信息,并显示出来。 - -![](https://gitee.com/g1879/DrissionPage-demos/raw/master/pics/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20211231225026.jpg) - -按`F12`观察页面代码,可以发现: - -- 标题栏有写列是不显示的,它们的`style`属性包含`display: none;` -- 表格内容中 3、5、7 列的真正数据在隐藏的 2、4、6 列中 - -![标题栏](https://gitee.com/g1879/DrissionPage-demos/raw/master/pics/QQ截图20220118002732.jpg) - -![内容列](https://gitee.com/g1879/DrissionPage-demos/raw/master/pics/QQ截图20220118002945.jpg) - -因此,在获取标题栏时,要跳过隐藏的列,在获取正文内容时,反而要用隐藏的数据。 - -# 示例代码 - -```python -from DrissionPage import MixPage - -# 用 s 模式创建页面对象 -page = MixPage('s') -# 访问数据网页 -page.get('https://www.outbreak.my/zh/world') - -# 获取表头元素 -thead = page('tag:thead') -# 获取表头列,跳过其中的隐藏的列 -title = thead.eles('tag:th@@-style:display: none;') -data = [th.text for th in title] - -print(data) # 打印表头 - -# 获取内容表格元素 -tbody = page('tag:tbody') -# 获取表格所有行 -rows = tbody.eles('tag:tr') - -for row in rows: - # 获取当前行所有列 - cols = row.eles('tag:td') - # 生成当前行数据列表(跳过其中没用的几列) - data = [td.text for k, td in enumerate(cols) if k not in (2, 4, 6)] - - print(data) # 打印行数据 -``` - -# 结果 - -``` -['总 (205)', '累积确诊', '死亡', '治愈', '现有确诊', '死亡率', '恢复率'] -['美国', '55252823', '845745', '41467660', '12,939,418', '1.53%', '75.05%'] -['印度', '34838804', '481080', '34266363', '91,361', '1.38%', '98.36%'] -['巴西', '22277239', '619024', '21567845', '90,370', '2.78%', '96.82%'] -['英国', '12748050', '148421', '10271706', '2,327,923', '1.16%', '80.57%'] -['俄罗斯', '10499982', '308860', '9463919', '727,203', '2.94%', '90.13%'] -['法国', '9740600', '123552', '8037752', '1,579,296', '1.27%', '82.52%'] -...... -``` - diff --git a/docs/实用示例/采集猫眼电影TOP100榜.md b/docs/实用示例/采集猫眼电影TOP100榜.md new file mode 100644 index 0000000..064f54f --- /dev/null +++ b/docs/实用示例/采集猫眼电影TOP100榜.md @@ -0,0 +1,64 @@ +这个示例演示用浏览器采集数据。 + +# ✔️ 页面分析 + +目标网址:[https://www.maoyan.com/board/4](https://www.maoyan.com/board/4) + +采集目标:排名、电影名称、演员、上映时间、分数 + +# ✔️ 编码思路 + +按`F12`,可以看到每个电影信息都包含在`
`元素中,因此可批量获取`
`元素,遍历它们并再从其中获取每个电影的信息。 + +# ✔️ 示例代码 + +以下代码可直接运行。 + +须要注意的是,这里用到记录器对象,详见[DataRecorder](http://g1879.gitee.io/datarecorder)。 + +```python +from DrissionPage import ChromiumPage +from DataRecorder import Recorder + +# 创建页面对象 +page = ChromiumPage() +# 创建记录器对象 +recorder = Recorder('data.csv') +# 访问网页 +page.get('https://www.maoyan.com/board/4') + +while True: + # 遍历页面上所有 dd 元素 + for mov in page.eles('t:dd'): + # 获取须要的信息 + num = mov('t:i').text + score = mov('.score').text + title = mov('@data-act=boarditem-click').attr('title') + star = mov('.star').text + time = mov('.releasetime').text + # 写入到记录器 + recorder.add_data((num, title, star, time, score)) + + # 获取下一页按钮,有就点击 + if btn := page('下一页', timeout=2): + btn.click(wait_loading=True) + # 没有则退出程序 + else: + break + +recorder.record() +``` + +# ✔️ 结果 + +程序生成一个结果文件 data.csv,内容如下: + +```csv +1,我不是药神,"主演:徐峥,周一围,王传君",上映时间:2018-07-05,9.6 +2,肖申克的救赎,"主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿",上映时间:1994-09-10(加拿大),9.5 +3,海上钢琴师,"主演:蒂姆·罗斯,比尔·努恩 ,克兰伦斯·威廉姆斯三世",上映时间:2019-11-15,9.3 +4,绿皮书,"主演:维果·莫腾森,马赫沙拉·阿里,琳达·卡德里尼",上映时间:2019-03-01,9.5 +5,霸王别姬,"主演:张国荣,张丰毅,巩俐",上映时间:1993-07-26,9.4 + +下面省略。。。 +```