五月假期的斋戒。 6周前,我申请了去爱尔兰的签证。 出发时间为4月30日。 有一个使馆网站,上面发布了签证决定清单 。 他们在星期一和星期四这样做。 我现在坐在4月28日星期日,我的签证仍然没有解决办法。 我周一的进一步行动取决于我的发言是否会出现在新报告中。 如果没有,您将需要去使馆整理一下。 如果有,请拉签证中心。 星期一整天坐着并更新页面似乎是一种沉闷的消遣,所以我写了一个Python脚本。

免责声明 我不是程序员,但我可以编程。 这意味着我无法编写优雅而高效的代码,但是我可以使这种桶形风琴做我需要做的事情。
1.检查页面上是否有新报告
所以需要做什么:
- 您需要解析此页面。
- 在报告中按新日期查找新报告(在我的情况下,您可以按
24 April
这个词进行搜索)。 - 获取此报告的链接。
功能代码如下:
def check_report(url, div_class, date): embassy_page = requests.get(url) page_text = BeautifulSoup(embassy.text, 'lxml') tags = page_text.findAll('div', {"class": div_class}) text = '' report_url = '' for tag in tags: tag_soup = BeautifulSoup(tag.text, 'lxml') report = s(text=re.compile(date)) if len(report) > 0: text = 'New report published' report_url = 'https://www.dfa.ie' + tag.find('a').attrs['href'] return text, report_url
现在,更多有关此代码中发生的事情。
首先,我们使用requests
库,它可以帮助我们下载所需的页面。 然后,我们使用另一个BeautifulSoup
库,该库有助于将这种通配页面布局转换为更美丽,更方便的外观。
在使用BeautifulSoup
之前:
'<!DOCTYPE html>\r\n\r\n<html lang="en">\r\n <head>\r\n <META http-equiv="X-UA-Compatible" content="IE=edge">\r\n <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\t\r\n\t<meta name="viewport" content="initial-scale=1">\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\t\r\n\r\n\r\n<meta name="author" content="Department of Foreign Affairs">\r\n<meta name="google-site-verification" content="HHtulupgM8GXpd9YYDjoXUb6MiU7_mGTkHixUrVPFYQ" />\r\n \r\n\t<title>Weekly Decision Report - Department of Foreign Affairs and Trade</title>\r\n <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> \r\n <link rel="stylesheet" type="text/css" media="screen" href="/media/dfa-2017/style-assets/css/font-defs.css" />\t \r\n\t<link rel="stylesheet" type="text/css" media="screen" href="/media/dfa-2017/style-assets/css/style.css" />\t\r\n <link rel="stylesheet" type="text/css" media="print" href="/media/dfa-2017/style-assets/css/print.css" />\t\r\n
之后:
<!DOCTYPE html> <html lang="en"> <head> <meta content="IE=edge" http-equiv="X-UA-Compatible"/> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/> <meta content="initial-scale=1" name="viewport"/> <meta content="Department of Foreign Affairs" name="author"/> <meta content="HHtulupgM8GXpd9YYDjoXUb6MiU7_mGTkHixUrVPFYQ" name="google-site-verification"/> <title>Weekly Decision Report - Department of Foreign Affairs and Trade</title> <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet"/> <link href="/media/dfa-2017/style-assets/css/font-defs.css" media="screen" rel="stylesheet" type="text/css"/> <link href="/media/dfa-2017/style-assets/css/style.css" media="screen" rel="stylesheet" type="text/css"/>
现在,您可以以某种方式生活和工作。 特别是在我的情况下,我们将寻找一个特殊的div class
, div class
用于链接到报表。 我们从页面的源代码中看到了这一点: <div class="gen-content-landing__block">
。 在我的代码中,我们寻找所有此类标签。
接下来,浏览收集到的标签,并查找包含新报告日期的标签: 24 April
。 如果找到这样的结果,则我们从中提取链接并形成新报告已发布的文本。
2.在新报告中搜索签证ID
所以现在需要在这里做什么:
- 下载此新报告。
- 解析pdf文件。
- 在其中找到我的ID。
- 查找对应的状态。
功能代码如下:
def check_visa(report_url, filename, visa_id, text): pdf = requests.get(report_url) file_path = Path(filename) file_path.write_bytes(pdf.content) pdfFileObj = open(filename, 'rb') pdfReader = PyPDF2.PdfFileReader(pdfFileObj, strict=False) for pageNum in range(0, pdfReader.numPages): page = str(pdfReader.getPage(pageNum).extractText().encode('utf-8')).split('\\n') if visa_id in page: visa_index = page.index(visa_id) status = page[visa_index + 1] text = text + '\t' + visa_id + '\t' + status return text
再次使用requests
库,我们对此报告进行请求。 接下来,将其保存在本地。 使用PyPDF2
库, PyPDF2
读取了文件。 之后,我们对它的页面进行排序,并在令牌数组中查找visa_id
。 此pdf文件的标记是, visa_id
之后的下一个标记直接是visa_id
状态: Approved
或Refused
。 接下来,我们将现有文本与id和status连接起来。
3.以松弛状态发送状态消息
好啊 脚本找到了我的ID,但是您需要在某处通知我。 我们公司使用Slack作为Messenger,因此我认为在此接收通知会很方便。
该链接允许您配置您的Webhook。 您可以在此处选择要向其发布消息的渠道或收件人(此步骤可能需要成为WorkSpace管理员)。 在那里,您将收到Webhook的唯一URL,可在代码中使用它。
def send_to_slack(webhook_url, text): post = {"text": "{0}".format(text)} json_data = json.dumps(post) req = requests.post(webhook_url, data=json_data.encode('ascii'), headers={'Content-Type': 'application/json'}) return req.status_code
使用相同的requests
库,我们通过Webhook发出包含text
内容的POST请求。
4.功能使用
其余代码如下所示:
url = 'https://www.dfa.ie/irish-embassy/russia/visas/weekly-decision-report/' div_class = 'gen-content-landing__block' date = '24 April' filename = 'weekly_report.pdf' visa_id = '38644112' webhook_url = 'https://hooks.slack.com/services/...' text, report_url = check_report(url, div_class, date) if text != '': text = check_visa(report_url, filename, visa_id, text) print(send_to_slack(webhook_url, text))
我们为所有必需的变量分配值,然后运行规定的功能。
5.按计划发射
好啦 我写了一个脚本,但是如果我每次都要自己拉它,那么我离最初的状况还差得很远,在那里我必须坐下来更新页面。
$ crontab -e
向其添加一行:
*/10 * * * * python3 /home/ubuntu/embassy.py >/dev/null 2>&1
我认为只要cron在装有ubuntu的服务器上每10分钟运行一次此脚本,就足够了。
6.结论
11:50,我收到一条消息,说有新的报道出现了,但是签证不在里面……之后,我去了使馆。 他大吃一惊(他们几个星期都没有回信和打电话),结果拿到了签证的护照。
通常,即使您不是程序员,编程技巧在现代世界中也很重要。 它使您可以自动化一些例行操作,从而使您的世界更加方便。 实际上,甚至可以将其安排在单独的服务中,一个人只需输入自己的身份证和电子邮件,然后他就会收到一条有关签证准备就绪的消息。