#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/4/15 12:06
# @Author  : shaofei
# @Email   : shaochenshuo@126.com
# @File    : 内核月报搜索exe版.py
# @Software: PyCharm#pip3 install beautifulsoup4
#pip3 install lxml
#pip install requests
#import urllib2
import urllib.request
import requests
import threading
import argparse
import re
import os
import sys
import datetime
import time
from bs4 import BeautifulSoup
url = "http://mysql.taobao.org/monthly"
#加上请求头,模拟成浏览器取访问网站,避免请求头反爬策略:HTTP Error 418,注意headers是dic
USER_AGENT  = {'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Mobile Safari/537.36'}
URL_TIMEOUT = 15def get_input():key_str = input('请输入关键字,最多支持3个关键字,多个关键字间用逗号分隔:')key = []key_relation = 0key = key_str.split(',')if 1 < len(key) <= 3:key_relation = input('\n指定多个过滤关键字时,需要同时指定关键字间关系(请输入or 或者 and):')print('\n')elif len(key) == 1:if key[0] == '':print('你还未指定搜索关键字,请指定!!!')key, key_relation = get_input()else:#print('本次过滤指定的关键字为:{}'.format(key[0]))key_relation = 0else:print('\nERROR:最多只支持指定三个关键字')sys.exit()return key, key_relationdef parameter_parse():# 解析命令行参数(-k 指定过滤的关键字,-l指定多个关键字间的关系)parse = argparse.ArgumentParser()parse.add_argument('-k', '--key', nargs='+', type=str, default=None,help='指定搜索的关键字,必填参数,支持指定多个关键字,多个关键字间以空格分隔', required=True)parse.add_argument('-l', '--relation', type=str, choices=['or', 'and'], help='多个关键词之间的关系 or或者and')args = parse.parse_args()# print(args)# print(args.key[0])if 1 < len(args.key) <= 3:if args.relation:print('本次过滤指定的关键字列表为:{},关键字间关系为:{}'.format(args.key, args.relation))else:print('当你使用 -k 指定多个关键字时,必须使用 -l 指定关键字间的关系(and 或者 or)')sys.exit()elif len(args.key) == 1:print('本次过滤指定的关键字为:{}'.format(args.key[0]))else:print('  -k 最多只支持指定三个关键字')sys.exit()return argsdef get_html(url, USER_AGENT, URL_TIMEOUT):"""访问url返回html"""response = requests.get(url, headers=USER_AGENT, timeout=URL_TIMEOUT)response.encoding = response.apparent_encoding#text = response.texthtml = response.content.decode('utf-8')#print(text)return htmldef call_gethtml(url, USER_AGENT, URL_TIMEOUT):try:html = get_html(url, USER_AGENT, URL_TIMEOUT)except Exception as e:error = str(e)if "Connection to mysql.taobao.org timed out" in error:print('访问网页超时,重新访问')html = get_html(url, USER_AGENT, URL_TIMEOUT)else:print('访问网页报错,报错代码如下:{}'.format(e))return htmldef get_month_list():"""用户生成淘宝内核月报,每月url 列表"""html = call_gethtml(url, USER_AGENT, URL_TIMEOUT)#通过BeautifulSoup对html进行格式化,便于访问soup = BeautifulSoup(html, 'lxml')h3_list = soup.find_all('h3')#上面的 soup 是 'bs4.element.Tag' 类型,下面的 h3 也是 'bs4.element.Tag'类型month_url = []for h3 in h3_list:#h3.a['href'] 访问h3的a标签,h3.a.string 获取a标签的文本内容(如果有多个a标签,下面获取的是第一个a标签)child_list = '{}{}'.format('http://mysql.taobao.org', h3.a['href'])#print('链接为:{}, 链接标题为:{}'.format(child_list, h3.a.string))month_url.append(child_list)#print('月报列表长度为:{}。月报列表如下:{}'.format(len(month_url), month_url))return month_urldef key_check(url_month, key: list, relation = 0):"""匹配标题,正文,代码中的关键字,匹配成功输出文章标题及url:param url_month: 如http://mysql.taobao.org/monthly/2022/03/:param key::return:"""#访问某月的内核月报列表(如http://mysql.taobao.org/monthly/2022/03/)html_title = call_gethtml(url_month, USER_AGENT, URL_TIMEOUT)soup = BeautifulSoup(html_title, 'lxml')article_h3_list = soup.find_all('h3')for h3_in in article_h3_list:#指定3个关键字参数时对月报进行过滤if len(key) == 3:#对所有的关键字进行标题,正文,代码匹配,只要有一个关键字匹配上,则匹配成功if relation == 'or':url_page = '{}{}'.format('http://mysql.taobao.org', h3_in.a['href'])url_string = h3_in.a.string.strip()# 访问具体某篇内核月报(如http://mysql.taobao.org/monthly/2022/03/01/)html_page = call_gethtml(url_page, USER_AGENT, URL_TIMEOUT)soup_page = BeautifulSoup(html_page, 'lxml')if (h3_in.find('a', text=re.compile(key[0], re.I)) or soup_page.find_all('p', text=re.compile(key[0],re.I)) or soup_page.find_all('code', text=re.compile(key[0], re.I))or h3_in.find('a', text=re.compile(key[1], re.I)) or soup_page.find_all('p', text=re.compile(key[1],re.I)) or soup_page.find_all('code', text=re.compile(key[1], re.I))or h3_in.find('a', text=re.compile(key[2], re.I)) or soup_page.find_all('p', text=re.compile(key[2],re.I)) or soup_page.find_all('code', text=re.compile(key[2], re.I))):print('{},链接地址为:{}'.format(url_string, url_page))article_url['{}'.format(url_string)] = url_pageelse:pass#对多个关键字同时进行标题,正文,代码过滤,几个关键字同时匹配上,则匹配成功if relation == 'and':url_page = '{}{}'.format('http://mysql.taobao.org', h3_in.a['href'])url_string = h3_in.a.string.strip()# 访问具体某篇内核月报(如http://mysql.taobao.org/monthly/2022/03/01/)html_page = call_gethtml(url_page, USER_AGENT, URL_TIMEOUT)soup_page = BeautifulSoup(html_page, 'lxml')if (h3_in.find('a', text=re.compile(key[0], re.I)) or soup_page.find_all('p', text=re.compile(key[0], re.I)) or soup_page.find_all('code', text=re.compile(key[0], re.I))) and (h3_in.find('a', text=re.compile(key[1], re.I)) or soup_page.find_all('p', text=re.compile(key[1], re.I)) or soup_page.find_all('code', text=re.compile(key[1], re.I))) and (h3_in.find('a', text=re.compile(key[2], re.I)) or soup_page.find_all('p', text=re.compile(key[2], re.I)) or soup_page.find_all('code', text=re.compile(key[2], re.I))):print('{},链接地址为:{}'.format(url_string, url_page))article_url['{}'.format(url_string)] = url_pageelse:pass#指定两个关键字参数时,对月报进行过滤elif len(key) == 2:# 只要标题,正文或者代码中有一处匹配上第一个或是第二个关键字,则匹配成功if relation == 'or':url_page = '{}{}'.format('http://mysql.taobao.org', h3_in.a['href'])url_string = h3_in.a.string.strip()# 访问具体某篇内核月报(如http://mysql.taobao.org/monthly/2022/03/01/)html_page = call_gethtml(url_page, USER_AGENT, URL_TIMEOUT)soup_page = BeautifulSoup(html_page, 'lxml')if (h3_in.find('a', text=re.compile(key[0], re.I)) or soup_page.find_all('p', text=re.compile(key[0], re.I)) orsoup_page.find_all('code', text=re.compile(key[0], re.I)) or h3_in.find('a', text=re.compile(key[1], re.I))or soup_page.find_all('p', text=re.compile(key[1], re.I)) or soup_page.find_all('code', text=re.compile(key[1], re.I))):article_url['{}'.format(url_string)] = url_pageprint('{},链接地址为:{}'.format(url_string, url_page))# 对多个关键字同时进行标题,正文,代码过滤,几个关键字同时匹配上,则匹配成功if relation == 'and':url_page = '{}{}'.format('http://mysql.taobao.org', h3_in.a['href'])url_string = h3_in.a.string.strip()# 访问具体某篇内核月报(如http://mysql.taobao.org/monthly/2022/03/01/)html_page = call_gethtml(url_page, USER_AGENT, URL_TIMEOUT)soup_page = BeautifulSoup(html_page, 'lxml')if (h3_in.find('a', text=re.compile(key[0], re.I)) or soup_page.find_all('p', text=re.compile(key[0], re.I)) or soup_page.find_all('code', text=re.compile(key[0], re.I))) and (h3_in.find('a', text=re.compile(key[1], re.I)) or soup_page.find_all('p', text=re.compile(key[1], re.I)) or soup_page.find_all('code', text=re.compile(key[1], re.I))):article_url['{}'.format(url_string)] = url_pageprint('{},链接地址为:{}'.format(url_string, url_page))else:pass#只指定一个关键字参数时对月报进行过滤else:#过滤标题,正文,代码中是否有相关关键字,如果存在,则匹配成功url_page = '{}{}'.format('http://mysql.taobao.org', h3_in.a['href'])url_string = h3_in.a.string.strip()# 访问具体某篇内核月报(如http://mysql.taobao.org/monthly/2022/03/01/)html_page = call_gethtml(url_page, USER_AGENT, URL_TIMEOUT)soup_page = BeautifulSoup(html_page, 'lxml')if h3_in.find('a', text=re.compile(key[0], re.I)) or soup_page.find_all('p', text=re.compile(key[0], re.I)) or soup_page.find_all('code', text=re.compile(key[0], re.I)):url_page = '{}{}'.format('http://mysql.taobao.org', h3_in.a['href'])url_string = h3_in.a.string.strip()print('{},链接地址为:{}'.format(url_string, url_page))article_url['{}'.format(url_string)] = url_pagecontinueelse:passif __name__ == '__main__':# args = parameter_parse()# key = args.key# if len(key) > 1:#     key_relation = args.relation# key_str = input('请输入关键字,最多支持3个关键字,多个关键字间用逗号分隔:')# key = key_str.split(',')# if 1 < len(key) <= 3:#     key_relation = input('\n指定多个过滤关键字时,需要同时指定关键字间关系(请输入or 或者 and):')#     print('\n')# elif len(key) == 1:#     print('本次过滤指定的关键字为:{}'.format(key[0]))#     key_relation = 0# elif len(key) == 0:#     print('你还未指定搜索关键字,程序自动退出')# else:#     print('\nERROR:最多只支持指定三个关键字')#     sys.exit()key, key_relation = get_input()print('关键字为:{},关系为:{}'.format(key,key_relation))#这里不比考虑python 中字典是否线程安全,因为我的并发线程只会对自字典增加不同key:value 键值对article_url = {}i_parallel = 2month_list = get_month_list()list_count = len(month_list)operate_count = 1print('开始搜索:{} ......'.format(datetime.datetime.now()))if list_count > 1:while operate_count <= list_count:threads = []for i in range(i_parallel):t_check = threading.Thread(target=key_check, args=(month_list[operate_count - 1], key, key_relation))threads.append(t_check)operate_count += 1if operate_count > (list_count):breakfor s in threads:s.start()for j in threads:j.join()print('当前过滤分析进度为 ---------------------{}%---------------------'.format(round(((operate_count - 1)/list_count)*100, 2)))else:key_check(month_list[0], key)print('搜索结束:{}'.format(datetime.datetime.now()))print('\n最终检查结果为:{}'.format(article_url))filename = '搜索结果_{}.txt'.format(datetime.datetime.strftime(datetime.datetime.now(), "%Y%m%d%H%M%S"))with open(filename, 'a', encoding='utf-8') as fileobj:title = article_url.keys()for i in title:fileobj.writelines('{}:{}'.format(i, os.linesep))fileobj.writelines('{0}{1}{1}'.format(article_url[i], os.linesep))print('\n 请注意结果保存在当前目录的\'{}\'文件中,该窗口将在5分钟后自动关闭!!!'.format(filename))time.sleep(300)

内核月报搜索exe版 代码相关推荐

  1. 内核月报搜索普通版 代码

    #!/usr/bin/python3 # -*- coding: utf-8 -*- # @Time : 2022/4/11 17:58 # @Author : shaofei # @Email : ...

  2. 淘宝数据库内核月报搜索工具

    一:工具作用 该工具可以根据指定关键字搜索淘宝内核月报的标题,正文及代码三个部分,只要其中一个部分有关键字匹配,就会输出该篇月报的标题及url. 二:工具使用方法 1.工具执行 双击 "内核 ...

  3. 饥荒搜索服务器未响应,饥荒联机版代码用不了?东西无法捡起,怪物打不了?试试这个方法...

    饥荒游戏分为单机版和联机版,不可否认的是,饥荒联机版的用户体验度要比单机版好很多,更新速度也快,但很多菜鸟玩家都发现这样一个问题,那就是饥荒联机版貌似无法使用代码,或者代码时灵时不灵,搞到玩家发际线退 ...

  4. 阿里数据库内核月报导航

    数据库内核月报 是阿里云RDS-数据库内核组维护的一个关于数据库的技术博客,上面的文章质量是有保证的.不过有一点不太友好的是,这个网站首页非常简洁,只是按照时间月份来归档文章,并没有按照类别来分,这样 ...

  5. 阿里巴巴 淘宝数据内核月报 目录(2014--2017)

    淘宝的数据库内核月报文章还是不错的,并且持续更新,但是每次查看的时候需要逐个月份点击进去查看,有些麻烦,花了点时间把2014到2017年的月报信息的目录整理下,方便以后查看. 月报的主页: http: ...

  6. 阿里内核月报2017年02月

    The future of the page cache 持久化内存用得越来越多, 促使了内核的一系列变更, 内核是否还真的需要页面缓存呢? 在2017 linux.conf.au会上, Matthe ...

  7. Linux阅码场 - Linux内核月报(2020年06月)

    关于Linux内核月报 Linux阅码场 Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向. 限于篇幅,只会对最新技术 ...

  8. Linux阅码场 - Linux内核月报(2020年09月)

    关于Linux内核月报 Linux阅码场 Linux阅码场内核月报栏目,是汇总当月Linux内核社区最重要的一线开发动态,方便读者们更容易跟踪Linux内核的最前沿发展动向. 限于篇幅,只会对最新技术 ...

  9. 《源码分析转载收藏向—数据库内核月报》

    月报原地址: 数据库内核月报 现在记录一下,我可能需要参考的几篇文章吧,不然以后还得找: MySQL · 代码阅读 · MYSQL开源软件源码阅读小技巧 MySQL · 源码分析 · 聚合函数(Agg ...

最新文章

  1. 模拟京东快递单号的查询效果
  2. mysql sql语句最大长度设置方法
  3. OpenGL绘制一个四边形
  4. 利用Python编写网络爬虫下载文章
  5. 关于msbuild 编译.net 4.5新语法错误的解决方法
  6. python中代理模式分为几种_Python设计模式之代理模式实例详解
  7. C++primer第九章 顺序容器 9.3 顺序容器操作
  8. jdbc java连接oracle_java连接oracle jdbc连接
  9. python爬虫爬图片教程_python爬去妹子网整个图片资源教程(最详细版)
  10. 泰勒公式推导过程_#泰勒#(Taylor)公式真的很难很难吗?
  11. Python read()/pack()/try
  12. 小学计算机知识题,小学信息技术基础知识试题
  13. 物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平...
  14. RabbitMQ学习笔记:mandatory、publisher-confirms、publisher-return属性区别
  15. Visual Studio日文乱码解决方法
  16. java 叠加层_java简单设置图层实现图片叠加
  17. 监控安装ESXi on Arm的树莓派4b的CPU温度
  18. [原创] 如何带好一个团队
  19. 推箱子android课程设计,推箱子游戏课程设计精选.doc
  20. Spirngboot整合之Mybatis-plus yml配置

热门文章

  1. C# SolidWorks 二次开发 API --- 2018版 中文翻译-完整版共享
  2. 测井计算机使用的总线,1553总线在测井系统中的应用及实现
  3. “买卖股票的最佳时机” 系列——我来教你稳赚不亏~
  4. 鲁大师2022年Q3季度电动车报告:九号机械师霸榜,绿源发力智能化
  5. RTT之创建工程模板
  6. 杭州预约挂号辅助软件 源代码开源
  7. 基于springboot的自动排课系统
  8. Spring学习(适合新人)
  9. 关于沥青路面的一些小常识
  10. html页面图片分页样式,HTML页面打印分页标签样式