首页 开发编程 正文

怎么跳过php验证码

大规模DDos流量清洗关于服务器被人攻击的处理,企业安全端口扫描实践基本上就是在外面扫描你服务器ip,在服务上查看开放的监听端口情况使用命令:3、部署时候精良先通过CDN或者自己用nginx返乡代理来对用户。...

怎么跳过php验证码,有什么办法解决吗?

大规模DDos流量清洗

关于服务器被人攻击的处理,当然先要分两种情况,如果是大规模DDos抢注攻击的话,一般对付办法不多,根本办法是通过运营商做流量清洗,分布式部署系统分流。用一些基于公有云的防护手段(费钱,效果一般般),一些安全公司昂贵的设备(作用也不大,有钱就可以多买)。

一般性防护手段

一般性防护手段,通过硬防或者软防火墙比如iptables,主要要限制服务器端口访问,除了必须的80,443以外其他端口一律不对外开放。

关于对外开放端口限制和检测的访问,我的原创文章都提过几篇介绍过:

「安全扫描」看好你的大门,企业安全端口扫描实践

基本上就是在外面扫描你服务器ip,看都开了那些端口,对不该开放端口开放的话就封禁掉。主要对外开放的危险端口有 所有udp端口(比如最近大规模针对github的攻击,就用对外开放的memcache udp 11211 udp端口进行的反射式攻击),tcp重点关注端口: 21(ftp),22(ssh) 23(telnet),2181(zookeeper),3306(mysql),6379(redis),8161和61616(mq),11211(memcache),27017/27018(mongodb),9200(elasticsearch)还有其他的根据企业部署情况来增加。

在服务上查看开放的监听端口情况使用命令:

netstat -ntualp

Local地址 类似于 0.0.0.0:3306和 :::22的监听的服务器就要重点关注,一般除了web都不应该对外开放。

对web服务:

1、注意升级所用程序的版本,有漏洞的要及时升级(比如dedecms,struts2的漏洞等),部署的时候注意权限设置,不给多余的权限。

2、部署必要的waf系统,安利下笔者有个开源免费的waf,有需要的可以联系我。

3、部署时候精良先通过CDN或者自己用nginx返乡代理来对用户,不直接把php 应用、tomcat应用服务器对外,这样即可以提高访问效率,增加访问并发,还可以低于短期大流量访问的冲击。

如果服务器被人攻击,挂马了,怎么排除和解决

常见异常情况:异常的流量、异常tcp链接(来源端口,往外发的端口)、异常的访问日志(大量的ip频繁的访问个别文件)。

如果部署了监控系统的话(强烈建议部署zabbix,并增加对系统添加专门安全items),可以方便通过zabbix监控图和趋势对比了解这些信息:

利用last,lastb发现异常的用户登录情况,ip来源。

利用lastlog,/var/log/message,/var/log/secure,日志等,是否权限已经被攻陷。

用history 发现shell执行情况信息。

用top,ps,pstree等发现异常进程和服务器负载等情况。

用netstat -natlp发现异常进程情况。用w命令发现当前系统登录用户的情况。

如果发现异常用户,立即修改用户密码,pkill -kill -t tty 剔除异常用户。然后进行进一步处理。

发现异常进程,立即禁止,冻结禁止。

发现一个恶意进程后通过 ls -al /proc/Pid (Pid为具体的进程号),发现进程的启动路径,启动的文件所在目录等信息。

如果发现异常连接数,通过iptables封禁相关端口或者ip

iptables -I INPUT -s ip -j DROP

iptables -I OUTPUT -p tcp --dport 25 -j DROP

iptables -I INPUT -p tcp --dport 25 -j DROP

对清理移动木马,杀掉进程

首先清理掉木马创建的cron 计划项和启动项。

ls -al /etc/proc/Pid/ 找的恶意木马文件。

恶意进程的执行目录和文件

最后用一条命令 kill -9 所有的进程ID && rm -rf 所有涉及的文件和目录。

更多信息可以关注笔者的文章或者咨询笔者:

「系统安全」当网站发生异常,出现安全事故,如何进行排查处置?

「WEB安全」单行命令查杀Webshell(php为例)

MySQL做简单的购物网站?

大二创业的时候,一个暑假(大概30天)就把一个类似京东的购物商场做出来了。那个时候只是简单知道PHP的语法,然后就跟着视频做了起来,其中最深的感想是:动手去敲,多想为什么,先学会模仿。

那个时候创业的项目是做一个类似于59Store的零食商场,有APP原形。然后就根据APP的逻辑自己瞎搞了起来,开始之前只是懂简单的PHP语法和前端的知识,没有做过上线的项目,可以说是很小白。只能看得懂一般的PHP语言。当时就直接找了相应的视频教程,一步一步跟着学做起来,那个视频用到了一个PHP框架,ThinkPHP3.2版本,我想学PHP的应该都懂这个框架,有很多道友直接是以这个框架开始学PHP的。

刚开始的时候,先简单设计好项目的需求模块,例如购物网站需要登录模块、会员模块、商品管理模块,商家后台模块、支付模块等,根据需求设计好这些功能,这些功能都是比较普遍的了,基本每一个商场网站都是这几个模块,你就可以把他们分开,哪些简单就先做那些。找相应的视频的案例代码给搭建起来,结合自己项目挑重点来学习,学习视频的时候要注意自己每一节要得到的知识点,因为我们是有需求的,很明确自己的需求,比如我今天要搞定登录模块,我就去找该模块的资料和相应的视频教程,加速2~3倍看其中的知识点,因为你现在是项目需求为主,具体的技术底层建议等掌握了怎么用才去挖掘怎样更加优。看完后觉得视频或者案例中的代码模块适合自己的项目,也可以直接拿来用。慢慢地学习多了,做多了,你就会懂自己开发了。要先学会自己做框架或者设计模块,先的学会模仿别人。

当然,前提是你得对自己的项目有足够的认识。哪些是难点,哪些是需要协调的等等都要先罗列出来,比如登录的时候,需要用到手机验证码,那这些申请的材料就可以交给其他同事去做。网站肯定涉及支付,支付的渠道那些也可提前先搞定。

最后,2个月内搭建一个购物商场说简单也简单说难也挺难的。但是你如果想对自己搭建的网站技术有足够的了解,并且想学PHP或者Mysql的话,我建议你还是自己先学会这些技术底层,去积累,去模仿别人的站和技术,技术归技术,业务还业务,有时候搭建一个网站或者开发一个APP不是说哪一门学的语言好,用的溜,而是取决于你解决问题的能力。

希望你能成功!

数据采集软件有哪些?

前市面上常见的采集软件一般可以划分为云爬虫和采集器两种:

所谓云爬虫就是无需下载安装软件,直接在网页上创建爬虫并在网站服务器运行,享用网站提供的带宽和24小时服务;

采集器一般就是要下载安装在本机,然后在本机创建爬虫,使用的是自己的带宽,受限于自己的电脑是否关机。

当然,以上不包括自己开发的爬虫工具和爬虫框架之类的。

其实每个爬虫都有自己的特点,我们可以根据自己的需要进行选择,下面针对常见的网络爬虫做一些简单介绍,给大家做一些参考:

首先是云爬虫,国内目前主要是:神箭手云爬虫

官网:https://www.shenjian.io/

简介:神箭手云是一个大数据应用开发平台,为开发者提供成套的数据采集、数据分析和机器学习开发工具,为企业提供专业化的数据抓取、数据实时监控和数据分析服务。

优点:功能强大,涉及云爬虫、API、机器学习、数据清洗、数据出售、数据订制和私有化部署等;

纯云端运行,跨系统操作无压力,隐私保护,可隐藏用户IP。

提供云爬虫市场,零基础使用者可直接调用开发好的爬虫,开发者基于官方的云端开发环境开发并上传出售自己的爬虫程序;

领先的反爬技术,例如直接接入代理IP和自动登录验证码识别等,全程自动化无需人工参与;

丰富的发布接口,采集结果以丰富表格化形式展现;

缺点:它的优点同时也在一定程度上成了它的缺点,因为它是一个面向开发者的爬虫开发系统,提供了丰富的开发功能,网站看起来非常的偏技术非常专业,尽管官方也提供了云爬虫市场这样的现成爬虫产品,并且开放给广大爬虫开发者,从而让爬虫市场的内容更加丰富,但是对于零技术基础的用户而言并不是那么容易理解,所以有一定的使用门槛。

是否免费:免费用户无采集功能和导出限制,无需积分。

具备开发能力的用户可以自行开发爬虫,达到免费效果,没有开发能力的用户需要从爬虫市场寻找是否有免费的爬虫。

然后是采集器,目前国内主要包括以下这些(百度/谷歌搜采集器,刨去广告,排名靠前的):

火车头采集器:

官网:http://www.locoy.com/

简介:火车采集器是一款网页数据抓取、处理、分析,挖掘软件。可以灵活迅速地抓取网页上散乱分布的信息,并通过强大的处理功能准确挖掘出所需数据。

优点:国内老牌的采集器,经过多年的积累,具有丰富的采集功能;

采集速度比较快,接口比较齐全,支持PHP和C#插件扩展;

支持多种数据格式导出,可以进行数据替换等处理。

缺点:越是年头长的产品越容易陷入自己的固有经验中,火车头也难以摆脱这问题。

虽说功能丰富,但是功能都堆砌在那里,用户体验不好,让人不知道从何下手;

学会了的人会觉得功能强大,但是对于新手而言有一定使用门槛,不学习一段时间很难上手,零基础上手基本不可能。

只支持Windows版本,不支持其他操作系统;

是否免费:号称免费,但是实际上免费功能限制很多,只能导出单个txt或html文件,基本上可以说是不免费的。

八爪鱼采集器:

官网:http://www.bazhuayu.com/

简介:八爪鱼采集器是一款可视化采集器,内置采集模板,支持各种网页数据采集。

优点:支持自定义模式,可视化采集操作,容易上手;

支持简易采集模式,提供官方采集模板,支持云采集操作;

支持防屏蔽措施,例如代理IP切换和验证码服务;

支持多种数据格式导出。

缺点:功能使用门槛较高,本地采集时很多功能受限,而云采集收费较高;

采集速度较慢,很多操作都要卡一下,云端采集说10倍提速但是并不明显;

只支持Windows版本,不支持其他操作系统。

是否免费:号称免费,但是实际上导出数据需要积分,可以做任务攒积分,但是正常情况下基本都需要购买积分。

后羿采集器:

官网:http://www.houyicaiji.com/

简介:后羿采集器是由前谷歌搜索技术团队基于人工智能技术研发的新一代网页采集软件,该软件功能强大,操作极其简单。

优点:支持智能采集模式,输入网址就能智能识别采集对象,无需配置采集规则,操作非常简单;

支持流程图模式,可视化操作流程,能够通过简单的操作生成各种复杂的采集规则;

支持防屏蔽措施,例如代理IP切换等;

支持多种数据格式导出;

支持定时采集和自动化发布,发布接口丰富;

支持Windows、Mac和Linux版本。

缺点:软件推出时间不长,部分功能还在继续完善,暂不支持云采集功能

是否免费:完全免费,采集数据和手动导出采集结果都没有任何限制,不需要积分。

PHP中短信验证码怎样存到数据库中?

php做短信验证码,需要将手机号,发送的验证码和时间这几个存到数据库,在添加到数据库的时候,要判断里面有没有要存的手机号,有的话,就更新验证码和时间,没有就是添加,在使用验证码判定的时候,取出验证码和时间,判断验证码是否正确,时间是否在自己设置的有效时间段内,整个过程就是这样。

用爬虫技术能做到哪些有趣的事情?

看到这个问题必须来怒答一波~用python爬虫爬便宜机票了解一下?

喜欢旅行又怕吃土?让Python来爬取最便宜机票吧!

图源:

videoblocks.com

你喜欢旅行吗?

这个问题通常会得到一个肯定的答案,随后引出一两个有关之前冒险经历的故事。大多数人都认为旅行是体验新文化和开阔视野的好方法。但如果问题是“你喜欢搜索机票的过程吗?”也许话题就到此为止了……

可事实上,便宜的机票往往也很重要!本文将尝试构建一个网络爬虫,该爬虫对特定目的地运行并执行带有浮动日期(首选日期前后最多三天)的航班价格搜索。它会将结果保存为excel文件并发送一封包含快速统计信息的电子邮件。显然,这个爬虫的目的就是帮助我们找到最优惠的价格!

你可以在服务器上运行脚本(一个简单的Raspberry Pi就可以),每天运行一到两次。结果会以邮件形式发送,建议将excel文件存入Dropbox文件夹,以便随时随地查看。

因为爬虫以“浮动日期”进行搜索,所以它会搜索首选日期前后最多三天的航班信息。尽管该脚本一次仅运行一对目的地,但可以很容易地改写该爬虫使其每个循环运行多个目的地。最终甚至可能找到一些错误票价...那会很有意思!

另一个爬虫

某种意义上来讲,网络爬取是互联网“工作”的核心。

也许你认为这是一个十分大胆的说法,但谷歌就是从拉里·佩奇用Java和Python构建的网络爬虫开始的。爬虫不断地爬取信息,整个互联网都在试图为所有问题提供最佳的可能答案。网络爬取有不计其数的应用程序,即使更喜欢数据科学中的其他分支,你仍需要一些爬取技巧以获得数据。

这里用到的一些技术来自于最近新的一本佳作《Python网络数据采集》,书中包含与网络爬取相关的所有内容,并提供了大量简例和实例。甚至有一个特别有意思的章节,讲述如何解决验证码检验的问题。

Python的拯救

第一个挑战就是选择爬取信息的平台,本文选择了客涯(Kayak)。我们试过了Momondo, 天巡(Skyscanner), 亿客行(Expedia)和其它一些网站,但是这些网站上的验证码特别变态。

在那些“你是人类吗?”的验证中,尝试了多次选择交通灯、十字路口和自行车后,客涯似乎是最好的选择,尽管短时间内加载太多页面它会跳出安全检查。

我们设法让机器人每4到6个小时查询一次网站,结果一切正常。虽然说不定哪个部分偶尔会出点小问题,但是如果收到验证码,既可以手动解决问题后启动机器人,也可以等待几小时后的自动重启。

如果你是网络爬取新手,或者不知道为何有些网站花费很大力气阻止网络爬取,那么为构建爬虫写下第一行代码前,你一定要多加努力。

谷歌的“网络爬取规范”:

http://lmgtfy.com/?q=web+scraping+etiquette

系紧安全带...

导入并打开Chrome浏览器标签页后,会定义一些循环中会用到的函数。这个架构的构思大概是这样的:

· 一个函数用于启动机器人程序,表明想要搜索的城市和日期。

· 这个函数获得首轮搜索结果,按“最佳”航班排序,然后点击“加载更多结果”。

· 另一个函数会爬取整个页面,并返回一个dataframe数据表。

· 随后重复步骤2和步骤3,得出按“价格”和“航行时间”排序的结果。

· 发送一封简要总结价格(最低价和平均价)的邮件,并将带有这三种排序类型的dataframe数据表保存为一份excel文件。

· 以上所有步骤会在循环中重复,每X小时运行一次。

每个Selenium项目都以一个网页驱动器开始。我们使用Chromedriver驱动器,但还有其它选择。PhantomJS和Firefox也很受欢迎。下载Chromedriver后,将其置于一个文件夹中即可。第一行代码会打开一个空白Chrome标签页。

from time import sleep, strftime

from random import randint

import pandas as pd

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

import smtplib

from email.mime.multipart import MIMEMultipart

# Change this to your own chromedriver path!

chromedriver_path = 'C:/{YOUR PATH HERE}/chromedriver_win32/chromedriver.exe'

driver = webdriver.Chrome(executable_path=chromedriver_path) # This will open the Chrome window

sleep(2)

这些是将用于整个项目的包。使用randint函数令机器人在每次搜索之间随机睡眠几秒钟。这对任何一个机器人来说都是必要属性。如果运行前面的代码,应该打开一个Chrome浏览器窗口,机器人会在其中导航。

一起来做一个快速测试:在另一个窗口上访问客涯网(http://kayak.com),选择往返城市和日期。选择日期时,确保选择的是“+-3天”。由于在编写代码时考虑到了结果页面,所以如果只想搜索特定日期,很可能需要做一些微小的调整。

点击搜索按钮在地址栏获取链接。它应该类似于下面所使用的链接,将变量kayak定义为url,并从网页驱动器执行get方法,搜索结果就会出现。

无论何时,只要在几分钟内使用get命令超过两到三次,就会出现验证码。实际上可以自己解决验证码,并在下一次验证出现时继续进行想要的测试。从测试来看,第一次搜索似乎一直没有问题,所以如果想运行这份代码,并让它在较长的时间间隔后运行,必须解决这个难题。你并不需要十分钟就更新一次这些价格,对吧?

每个XPath都有陷阱

到目前为止,已经打开了一个窗口,获取了一个网站。为了开始获取价格和其他信息,需要使用XPath或CSS选择器,我们选择了XPath。使用XPath导航网页可能会令人感到困惑,即使使用从inspector视图中直接使用“复制XPath”,但这不是获得所需元素的最佳方法。有时通过“复制XPath”这个方法获得的链接过于针对特定对象,以至于很快就失效了。《Python网络数据采集》一书很好地解释了使用XPath和CSS选择器导航的基础知识。

接下来,用Python选择最便宜的结果。上面代码中的红色文本是XPath选择器,在网页上任意一处右键单击选择“inspect”就可以看到它。在想要查看代码的位置,可以再次右键单击选择“inspect”。

为说明之前所观察到的从“inspector”复制路径的缺陷,请参考以下差异:

1 # This is what the copymethod would return. Right click highlighted rows on the right side and select “copy> Copy XPath”//*[@id=“wtKI-price_aTab”]/div[1]/div/div/div[1]/div/span/span

2 # This is what I used todefine the “Cheapest” buttoncheap_results= ‘//a[@data-code = “price”]’

第二种方法的简洁性清晰可见。它搜索具有data-code等于price属性的元素a。第一种方法查找id等于wtKI-price_aTab的元素,并遵循第一个div元素和另外四个div和两个span。这次……会成功的。现在就可以告诉你,id元素会在下次加载页面时更改。每次页面一加载,字母wtKI会动态改变,所以只要页面重新加载,代码就会失效。花些时间阅读XPath,保证你会有收获。

不过,使用复制的方法在不那么“复杂”的网站上工作,也是很好的!

基于以上所展示的内容,如果想在一个列表中以几个字符串的形式获得所有搜索结果该怎么办呢?其实很简单。每个结果都在一个对象中,这个对象的类是“resultWrapper”。获取所有结果可以通过像下面这样的for循环语句来实现。如果你能理解这一部分,应该可以理解接下来的大部分代码。它基本上指向想要的结果(结果包装器),使用某种方式(XPath)获得文本,并将其放置在可读对象中(首先使用flight_containers,然后使用flight_list)。

前三行已展示在图中,并且可以清楚地看到所需的内容,但是有获得信息的更优选择,需要逐一爬取每个元素。

准备起飞吧!

最容易编写的函数就是加载更多结果的函数,所以代码由此开始。为了在不触发安全验证的前提下最大化所获取的航班数量,每次页面显示后,单击“加载更多结果”。唯一的新内容就是所添加的try语句,因为有时按钮加载会出错。如果它对你也有用,只需在前面展示的start_kayak函数中进行简要注释。

# Load more results to maximize the scraping

def load_more():

try:

more_results = '//a[@class = “moreButton”]'

driver.find_element_by_xpath(more_results).click()

# Printing these notes during the program helps me quickly check what it is doing

print('sleeping…..')

sleep(randint(45,60))

except:

pass

现在,经过这么长的介绍,已经准备好定义实际爬取页面的函数。

我们编译了下一个函数page_scrape中的大部分元素。有时这些元素会返回列表插入去程信息和返程信息之间。这里使用了一个简单的办法分开它们,比如在第一个 section_a_list和section_b_list变量中,该函数还返回一个flight_df数据表。所以可以分离在不同分类下得到的结果,之后再把它们合并起来。

def page_scrape():

“““This function takes care of the scraping part”““

xp_sections = '//*[@class=“section duration”]'

sections = driver.find_elements_by_xpath(xp_sections)

sections_list = [value.text for value in sections]

section_a_list = sections_list[::2] # This is to separate the two flights

section_b_list = sections_list[1::2] # This is to separate the two flights

# if you run into a reCaptcha, you might want to do something about it

# you will know there's a problem if the lists above are empty

# this if statement lets you exit the bot or do something else

# you can add a sleep here, to let you solve the captcha and continue scraping

# i'm using a SystemExit because i want to test everything from the start

if section_a_list == []:

raise SystemExit

# I'll use the letter A for the outbound flight and B for the inbound

a_duration = []

a_section_names = []

for n in section_a_list:

# Separate the time from the cities

a_section_names.append(''.join(n.split()[2:5]))

a_duration.append(''.join(n.split()[0:2]))

b_duration = []

b_section_names = []

for n in section_b_list:

# Separate the time from the cities

b_section_names.append(''.join(n.split()[2:5]))

b_duration.append(''.join(n.split()[0:2]))

xp_dates = '//div[@class=“section date”]'

dates = driver.find_elements_by_xpath(xp_dates)

dates_list = [value.text for value in dates]

a_date_list = dates_list[::2]

b_date_list = dates_list[1::2]

# Separating the weekday from the day

a_day = [value.split()[0] for value in a_date_list]

a_weekday = [value.split()[1] for value in a_date_list]

b_day = [value.split()[0] for value in b_date_list]

b_weekday = [value.split()[1] for value in b_date_list]

# getting the prices

xp_prices = '//a[@class=“booking-link”]/span[@class=“price option-text”]'

prices = driver.find_elements_by_xpath(xp_prices)

prices_list = [price.text.replace('$','') for price in prices if price.text != '']

prices_list = list(map(int, prices_list))

# the stops are a big list with one leg on the even index and second leg on odd index

xp_stops = '//div[@class=“section stops”]/div[1]'

stops = driver.find_elements_by_xpath(xp_stops)

stops_list = [stop.text[0].replace('n','0') for stop in stops]

a_stop_list = stops_list[::2]

b_stop_list = stops_list[1::2]

xp_stops_cities = '//div[@class=“section stops”]/div[2]'

stops_cities = driver.find_elements_by_xpath(xp_stops_cities)

stops_cities_list = [stop.text for stop in stops_cities]

a_stop_name_list = stops_cities_list[::2]

b_stop_name_list = stops_cities_list[1::2]

# this part gets me the airline company and the departure and arrival times, for both legs

xp_schedule = '//div[@class=“section times”]'

schedules = driver.find_elements_by_xpath(xp_schedule)

hours_list = []

carrier_list = []

for schedule in schedules:

hours_list.append(schedule.text.split('\n')[0])

carrier_list.append(schedule.text.split('\n')[1])

# split the hours and carriers, between a and b legs

a_hours = hours_list[::2]

a_carrier = carrier_list[1::2]

b_hours = hours_list[::2]

b_carrier = carrier_list[1::2]

cols = (['Out Day', 'Out Time', 'Out Weekday', 'Out Airline', 'Out Cities', 'Out Duration', 'Out Stops', 'Out Stop Cities',

'Return Day', 'Return Time', 'Return Weekday', 'Return Airline', 'Return Cities', 'Return Duration', 'Return Stops', 'Return Stop Cities',

'Price'])

flights_df = pd.DataFrame({'Out Day': a_day,

'Out Weekday': a_weekday,

'Out Duration': a_duration,

'Out Cities': a_section_names,

'Return Day': b_day,

'Return Weekday': b_weekday,

'Return Duration': b_duration,

'Return Cities': b_section_names,

'Out Stops': a_stop_list,

'Out Stop Cities': a_stop_name_list,

'Return Stops': b_stop_list,

'Return Stop Cities': b_stop_name_list,

'Out Time': a_hours,

'Out Airline': a_carrier,

'Return Time': b_hours,

'Return Airline': b_carrier,

'Price': prices_list})[cols]

flights_df['timestamp'] = strftime(“%Y%m%d-%H%M”) # so we can know when it was scraped

return flights_df

尽量让这些名字容易理解。记住变量a表示旅行的去程信息,变量b表示旅行的返程信息。接下来说说下一个函数。

等等,还有什么吗?

截至目前,已经有了一个能加载更多结果的函数和一个能爬取其他结果的函数。本可以在此结束这篇文章,而你可以自行手动使用这些函数,并在浏览的页面上使用爬取功能。但是前文提到给自己发送邮件和一些其他信息的内容,这都包含在接下来的函数start_kayak中。

它要求填入城市名和日期,并由此打开一个kayak字符串中的地址,该字符串直接跳转到“最佳”航班结果排序页面。第一次爬取后,可以获取价格的顶部矩阵,这个矩阵将用于计算平均值和最小值,之后和客涯(Kayak)的预测结果(页面左上角)一同发送到邮件中。这是单一日期搜索时可能导致错误的原因之一,因其不包含矩阵元素。

def start_kayak(city_from, city_to, date_start, date_end):

“““City codes it's the IATA codes!

Date format YYYY-MM-DD”““

kayak = ('https://www.kayak.com/flights/' + city_from + '-' + city_to +

'/' + date_start + '-flexible/' + date_end + '-flexible?sort=bestflight_a')

driver.get(kayak)

sleep(randint(8,10))

# sometimes a popup shows up, so we can use a try statement to check it and close

try:

xp_popup_close = '//button[contains(@id,”dialog-close”) and contains(@class,”Button-No-Standard-Style close “)]'

driver.find_elements_by_xpath(xp_popup_close)[5].click()

except Exception as e:

pass

sleep(randint(60,95))

print('loading more.....')

# load_more()

print('starting first scrape.....')

df_flights_best = page_scrape()

df_flights_best['sort'] = 'best'

sleep(randint(60,80))

# Let's also get the lowest prices from the matrix on top

matrix = driver.find_elements_by_xpath('//*[contains(@id,”FlexMatrixCell”)]')

matrix_prices = [price.text.replace('$','') for price in matrix]

matrix_prices = list(map(int, matrix_prices))

matrix_min = min(matrix_prices)

matrix_avg = sum(matrix_prices)/len(matrix_prices)

print('switching to cheapest results…..')

cheap_results = '//a[@data-code = “price”]'

driver.find_element_by_xpath(cheap_results).click()

sleep(randint(60,90))

print('loading more…..')

# load_more()

print('starting second scrape…..')

df_flights_cheap = page_scrape()

df_flights_cheap['sort'] = 'cheap'

sleep(randint(60,80))

print('switching to quickest results…..')

quick_results = '//a[@data-code = “duration”]'

driver.find_element_by_xpath(quick_results).click()

sleep(randint(60,90))

print('loading more…..')

# load_more()

print('starting third scrape…..')

df_flights_fast = page_scrape()

df_flights_fast['sort'] = 'fast'

sleep(randint(60,80))

# saving a new dataframe as an excel file. the name is custom made to your cities and dates

final_df = df_flights_cheap.append(df_flights_best).append(df_flights_fast)

final_df.to_excel('search_backups//{}_flights_{}-{}_from_{}_to_{}.xlsx'.format(strftime(“%Y%m%d-%H%M”),

city_from, city_to,

date_start, date_end), index=False)

print('saved df…..')

# We can keep track of what they predict and how it actually turns out!

xp_loading = '//div[contains(@id,”advice”)]'

loading = driver.find_element_by_xpath(xp_loading).text

xp_prediction = '//span[@class=“info-text”]'

prediction = driver.find_element_by_xpath(xp_prediction).text

print(loading+'\n'+prediction)

# sometimes we get this string in the loading variable, which will conflict with the email we send later

# just change it to “Not Sure” if it happens

weird = '¯\\_(ツ)_/¯'

if loading == weird:

loading = 'Not sure'

username = 'YOUREMAIL@hotmail.com'

password = 'YOUR PASSWORD'

server = smtplib.SMTP('smtp.outlook.com', 587)

server.ehlo()

server.starttls()

server.login(username, password)

msg = ('Subject: Flight Scraper\n\n\

Cheapest Flight: {}\nAverage Price: {}\n\nRecommendation: {}\n\nEnd of message'.format(matrix_min, matrix_avg, (loading+'\n'+prediction)))

message = MIMEMultipart()

message['From'] = 'YOUREMAIL@hotmail.com'

message['to'] = 'YOUROTHEREMAIL@domain.com'

server.sendmail('YOUREMAIL@hotmail.com', 'YOUROTHEREMAIL@domain.com', msg)

print('sent email…..')

虽然没有使用Gmail账户测试发送邮件,但是可以搜索到很多的替代方法,前文提到的那本书中也有其他方法来实现这一点。如果已有一个Hotmail账户,只要替换掉个人的详细信息,它就会开始工作了。

如果想探索脚本的某一部分正在做什么,可以将脚本复制下来并在函数外使用它。这是彻底理解它的唯一方法。

利用刚才创造的一切

在这些步骤之后,还可以想出一个简单的循环来使用刚创造的函数,同时使其持续运行。完成四个“花式”提示,写下城市和日期(输入)。因为测试时不想每次都输入这些变量,需要的时候可以使用以下这个清楚的方式进行替换。

如果已经做到了这一步,恭喜你!改进还有很多,比如与Twilio集成,发送文本消息而不是邮件。也可以使用VP*或更加难懂的方式同时从多个服务器上研究搜索结果。还有就是验证码的问题,验证码会时不时地跳出来,但对此类问题还是有解决办法的。不过,能走到这里已经是有很牢固的基础了,你可以尝试添加一些额外的要素。

使用脚本运行测试的示例

留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

本文转载自互联网,如有侵权,联系删除