太开心了,Python副业接单700元,功能监控一个网站的预约名额

每次在群里都能看见其它伙伴接单,我就在想啥时候我也接一个,在2023年4月9号上午的时候,发布的了信息,我啥都没有看生怕别人抢走,二话不说 ‘’‘我来接’‘,这从之后我接到了第一单。

需求

客户的需求也比较简单就是检测一个网站有没有位置,上图:

分析页面

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常用的开发软件,会给大家节省很多时间。
在这里插入图片描述

学习视频

编程学习一定要多多看视频,书籍和视频结合起来学习才能事半功倍。
在这里插入图片描述

100道练习题

在这里插入图片描述

实战案例

光学理论是没用的,学习编程切忌纸上谈兵,一定要动手实操,将自己学到的知识运用到实际当中。
在这里插入图片描述
最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值