前言
需求
客户的需求也比较简单就是检测一个网站有没有位置,上图:
【----帮助Python学习,以下所有学习资料文末免费领!----】
分析页面
1、先确定需求
客户的需求就是当页面选择日期的那个地方出现绿色的时候,就发送邮件
2、技术思路
了解到客户的需求之后,我就开始查看代码,发现标签的title 属性不一样,由此可以推断出我只要循环取出td标签title属性,然后进行判断就好了,判断之后发送邮件
3、用到什么技术
我第一眼看到这个需求的时候,我就断定这个必须用自动化来解决,因为他的实际需要就是判断页面出现这个属性,所以使用抓包的方式啥也抓不到,目前我的认知,就只能自动化来解决问题了,
废话不多说开始:自动化技术 + 自动发邮件技术
这个是我分析之后得出的结果
在看源码 上图:
代码实现
通过上面分析 我只要取到这个td标签里面的title属性就好了,伙伴建议取class值 我闲麻烦,实现效果就好了,上代码
完美实现,可以发送邮件了
效果展示
好了就到这里吧
完整代码
class SpiderBaxi():
# 初始化浏览器设置
def __init__(self):
self.options = webdriver.ChromeOptions()
# 隐藏"Chrome正在受到自动软件的控制"
self.options.add_experimental_option('useAutomationExtension', False)
self.options.add_experimental_option('excludeSwitches', ['enable-automation'])
self.options.add_argument('--disable-blink-features=AutomationControlled')
self.options.add_argument('--headless') # 配置无头浏览器
self.options.add_argument('--user-agent=' + get_ua.get('chrome'))
self.driver = webdriver.Chrome(options=self.options)
self.driver.maximize_window()
def find_xpath(self, html_str, syntax):
html = etree.HTML(html_str)
return html.xpath(syntax)
def start_requests(self, msg_to_qq):
url = 'https://brazil.blscn.cn/chinese/book_appointment.php'
# 打开浏览器等待5秒钟
self.driver.get(url)
time.sleep(3)
# 等待页面 加载完成
element = WebDriverWait(self.driver, 20).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#IDBodyPanel .secondry-btn"))
)
# 判断页面元素是否存在,存在就点击
if element.is_displayed():
self.driver.find_element(By.CSS_SELECTOR, "#IDBodyPanel .secondry-btn").click()
# 点击之后会加载一个新的窗口,获取窗口的链接
url_ = self.driver.find_element(By.CSS_SELECTOR, '.wrap iframe').get_attribute('src')
# 打开新的窗口
self.driver.get(url_)
# todo 定位 下拉框
str1 = self.down_box(msg_to_qq)
time.sleep(5)
self.driver.quit()
return str1
def down_box(self, msg_to_qq):
# 等待页面 加载完成
element = WebDriverWait(self.driver, 30).until(
EC.presence_of_element_located((By.ID, 'valCenterLocationId'))
)
# 判断页面元素是否存在,存在就点击
if element.is_displayed():
# 定位下拉框元素
select_box = self.driver.find_element(By.ID, 'valCenterLocationId')
# 创建option类对象
select_option = Select(select_box)
options_list = select_option.options
# 标记
count = 0
for index, options in enumerate(options_list[1:]):
try:
# 测试的时候发现页面刷新了报错,所以需要重新获取下
select_box = self.driver.find_element(By.ID, 'valCenterLocationId')
# 创建option类对象
select_option = Select(select_box)
# 选择 option
select_option.select_by_index(index+1)
time.sleep(1)
# 打印下选择的是哪个下拉
selected_value = self.driver.find_element(By.CSS_SELECTOR, '#valCenterLocationId > option:nth-child({})'.format(index+2)).text
# print(selected_value)
time.sleep(1)
# 需要在定位第二个下拉框
select_box2 = self.driver.find_element(By.ID, 'valAppointmentForMembers')
option2 = Select(select_box2)
option2.select_by_index(1)
time.sleep(1)
# 点击获取日期弹出日期框
self.driver.find_element(By.ID, 'valAppointmentDate').click()
time.sleep(1)
html = self.driver.page_source
# 获取属性
td_list = self.find_xpath(html, '//table[@class="table-condensed"]/tbody')
order = []
if td_list:
for td in td_list:
title = td.xpath('./tr/td/@title')
if title:
for i in title:
if 'Not Available' == i:
pass
elif 'Slots Full' == i:
pass
elif 'Available' == i:
order.append([i, selected_value])
# 判断有几个预约的位置
if order:
# 发送邮件
msg_to = msg_to_qq # 收件人邮箱,我是自己发给自己
text_content = f"巴西网站自动化监听预约位置如下:{order[0][1]},城市下面有 {len(order)} 个位置可以预约!!!" # 发送的邮件内容
me = send_email.SendEmail(msg_to, text_content, '邮箱授权码')
me.sed_email()
count += 1
print('{} 城市已有预约位置,并且已经发送邮件提醒,请查看!!!'.format(selected_value))
else:
print('{} 城市还没有放出预约位置,请等待!!!'.format(selected_value))
time.sleep(3)
except Exception as e:
msg_to = '1043694378@qq.com' # 收件人邮箱,我是自己发给自己
text_content = f"接单500巴西网站自动化监听预约位置代码报错,请检查代码!!!" # 发送的邮件内容
me = send_email.SendEmail(msg_to, text_content, '邮箱授权码')
me.sed_email()
return count
def start_requests_easey(self, msg_to_qq):
self.driver.get('https://software.blsbrazilvisa.com/appointments/bls-brazil-appointment')
time.sleep(3)
# 定位下拉框
str1 = self.down_box(msg_to_qq)
time.sleep(5)
self.driver.quit()
return str1
if __name__ == "__main__":
num = 1
print('开始监听巴西签证网站预约位置,请稍等!!!')
# 方式一
while True:
if SpiderBaxi().start_requests_easey('自己的邮箱') != 0:
break
else:
print('请等待一分钟,监听下一次,已成功监听 {} 次!'.format(num))
time.sleep(6)
SpiderBaxi().start_requests_easey('自己的邮箱')
num += 1
print('请等待一分钟,监听下一次,已成功监听 {} 次!'.format(num))
time.sleep(6)
print('巴西签证网站监听预约位置程序已结束,请重新开始监听!!!')
读者福利:知道你对Python感兴趣,便准备了这套python学习资料
对于0基础小白入门:
如果你是零基础小白,想快速入门Python是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等习教程。带你从零基础系统性的学好Python!
零基础Python学习资源介绍
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论
④ 20款主流手游迫解 爬虫手游逆行迫解教程包
⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解
⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解
⑦ 超300本Python电子好书,从入门到高阶应有尽有
⑧ 华为出品独家Python漫画教程,手机也能学习
⑨ 历年互联网企业Python面试真题,复习时非常方便
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)
👉Python必备开发工具👈
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉100道Python练习题👈
检查学习结果。
👉面试刷题👈
资料领取
上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码 即可领取↓↓↓
好文推荐
了解python的前景:https://blog.csdn.net/SpringJavaMyBatis/article/details/127194835
了解python的兼职副业:https://blog.csdn.net/SpringJavaMyBatis/article/details/127196603