学了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学习资料哦!希望可以帮到你们,我也是看着份资料学会的,嘻嘻~
关于python技术储备
想赚钱学好技术才是重点,学习 Python 不论是就业还是做副业都很不错。那么,对于新手小白,应该如何学习python呢?这里我免费给大家分享一份全套python学习资料,都是我自己学习python时收集的,希望能给想学习python的小伙伴们一点帮助!
😝朋友们如果有需要的话,可以V扫描下方二维码免费领取🆓
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
#### **一、Python学习路线**