Selenium 开发, Mac python 版,简单套路 2022_05

1, 短平快

效果为查看 feed 流,

想看很久以前的,不想要用手滑。

就 Selenium 自动滑到底 15 次

import time

from selenium import webdriver

drive = webdriver.Chrome()
drive.implicitly_wait(15)
drive.maximize_window()
drive.get("https://feeds")
for _ in range(15):
    time.sleep(2)
    drive.execute_script("window.scrollTo(0, document.body.scrollHeight)")
解释:

拿到 Chrome 的实例,隐式等待网页刷新出来

最大化窗口,

开启网页,睡两秒,拉到底一次

( 对应, 网页刷新的网络请求,是异步操作 )

1.1 ,准备工作

a, 没使用 webdriver 中的 Safari,

目前是 Safari 只能开一个进程,

Chrome 能开多个进程,方便很多

b , 下载 chrome 的 webdrive, 放到 bin 文件夹

首先,看 chrome 的版本

chrome 中这样 chrome://version/

这里下载驱动

https://chromedriver.chromium.org/downloads

放到这个路径

/usr/local/bin

2, 例子是 booking.com

也就是 fcc 的视频教程,

简单说下套路,( booking.com 的代码,好像更新了好多 )

例如,大量使用 CSS_SELECTOR
2.1, 选择货币
btn = self.find_element(By.CSS_SELECTOR, 'button[data-tooltip-text*="选择你使用的货币"]')
btn.click()

text*= 一部分内容,通常容错好一些

2.2, 填入人数

截屏2022-05-12 下午6.09.09.png

btn = self.find_element(By.ID, "xp__guests__toggle")
btn.click()
decrease_btn = self.find_element(By.CSS_SELECTOR, 'button[aria-label="减少成人数量"]')
add_btn = self.find_element(By.CSS_SELECTOR, 'button[aria-label="增加成人数量"]')
valContainer = self.find_element(By.ID, "group_adults")
target = total
while True:
    #  get_attribute, receives a key name,
    #  then it tries to give back the value of whatever the attribute is
    count = valContainer.get_attribute("value")
    if int(count) == target:
        break
    elif int(count) > target:
        decrease_btn.click()
    else:
        add_btn.click()

拿到网站的人数数据,get_attribute("value")

少于目标,就 +

多了,就 -

2.3, 选择星级

截屏2022-05-12 下午6.11.41.png

star_box = self.driver.find_element(By.CSS_SELECTOR, 'div[data-filters-group="class"]')
for star_val in star_vals:
    star_child = star_box.find_element(By.CSS_SELECTOR, f'div[data-filters-item="class:class={star_val}"]')
    # 感觉, html 上的元素,都可以点击
    star_child.click()

先拿父节点,star_box

再拿子节点,star_child

算是,两级定位

3, booking.com 中的异步处理

3.1 使用上面提到的,sleep 大法

截屏2022-05-12 下午6.16.13.png

场景是,选完星级,选低价,

filter.apply_star_rating(4, 5)
time.sleep(5)
filter.sort_by_price_lowest_first()

如果不 sleep 下,价格排序,一般会把星级筛选,覆盖

3.2, web drive 刷新

场景是,完成筛选和排序的网络请求后,拿到最新的 html

drive.apply_filtrations()
# a workaround to let our bot to grab the data properly
drive.refresh()
drive.report_results()

点击星级筛选,价格排序,等待网页的网络请求刷新,

先刷新,

再去拿最新的 html

4,命令行辅助

mac 上,开启了很多 Chrome 实例,

怎么关?

kill -9 $(ps -x | grep "Google Chrome" | awk "{print $1}")

5, github repo

5.1 python 语法,传递多参数

函数定义

def apply_star_rating(self, *star_vals):

调用

filter.apply_star_rating(4, 5)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值