关于python3.x:爬取搜狗微信文章

一、获取索引页。增加好headers,params间接get申请即可。二、在索引页中获取详情页的url。在浏览器中间接关上这个url,认真看浏览器上方中url,你会发现url会跳转,就是说他进行了重定向。这里咱们须要应用fiddler这个抓包工具对他进行抓包。你会发现他返回的是一段js代码,代码拼接成的url就是咱们想要的真正的real_url,这里咱们间接用正则表达式,进行匹配、拼接就ok了。三、获取详情页。既然获取到了详情页的实在url,剩下的结构一下申请头headers,间接申请即可,这里我不举荐加cookie参数到申请头里,因为加上之后拜访次数过多,他会封cookie,让你输出验证码进行验证。四、总结。我看网上说他是封ip,封cookie的,然而我爬了几百篇并没有发现这个状况,之后遇到再补充。附上代码: import requestsfrom lxml import etreeimport reimport urllib3# 重定向、封ip、封cookieurllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)def get_index(start_url, page): params = { 'query': '美女', '_sug_type_': '', 'sut': '1828', 'lkt': '1,1597298703444,1597298703444', 's_from': 'input', '_sug_': 'y', 'type': '2', 'sst0': '1597298703546', 'page': page, 'ie': 'utf8', 'w': '01019900', 'dr': '1', } headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Cookie': 'ABTEST=5|1597380273|v1; SNUID=59BBCE9AEAEF4626F956F592EA96FE70; IPLOC=CN3709; SUID=B3512470160DA00A000000005F3616B1; JSESSIONID=aaapSleD9Qep4fAnwHYox; SUV=0004E05A702451B35F3616B1A47C7070; SUID=B35124706A13A00A000000005F3616B1', 'Host': 'weixin.sogou.com', 'Referer': 'https://weixin.sogou.com/weixin?query=%E7%BE%8E%E5%A5%B3&_sug_type_=&sut=1828&lkt=1%2C1597298703444%2C1597298703444&s_from=input&_sug_=y&type=2&sst0=1597298703546&page=4&ie=utf8&w=01019900&dr=1', 'Sec-Fetch-Dest': 'document', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-User': '?1', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36', } response = requests.get(url=start_url, params=params, headers=headers, verify=False) if response.status_code == 200: html = etree.HTML(response.text) urls = html.xpath('//ul[@class="news-list"]/li//h3/a/@href') for url in urls: url = 'https://weixin.sogou.com/' + url print(url) yield url else: print('getting index page fail')def get_real_url(url): headers = { 'Host': 'weixin.sogou.com', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Referer': 'https://weixin.sogou.com/weixin?type=2&s_from=input&query=%E7%BE%8E%E5%A5%B3&ie=utf8&_sug_=n&_sug_type_=', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'Cookie': 'SUID=D85024704A21A00A000000005EFDF58C; SUV=0035E9CD702450D85EFDF58D4E7EB415; weixinIndexVisited=1; LCLKINT=121; LSTMV=468%2C24; pgv_pvi=2192807936; ABTEST=0|1596950375|v1; IPLOC=CN3709; SNUID=C32054007175DCCBC54D7C1071164832; JSESSIONID=aaaMv1RDeodhj5yAwCYox; PHPSESSID=34n87c5popss5ckq1gcinpc9s2', } response = requests.get(url=url, headers=headers, verify=False) pattern = re.compile('\+=.*?\'(.*?)\';', re.S) url_list = re.findall(pattern, response.text) real_url = '' for i in url_list: real_url += i real_url.replace('@', '') return real_urldef get_detail(url): headers = { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'cache-control': 'max-age=0', 'if-modified-since': 'Fri, 14 Aug 2020 12:33:50 +0800', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'cross-site', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36', } response = requests.get(url, headers=headers,verify=False) html = etree.HTML(response.text) if html.xpath('//*[@id="activity-name"]/text()'): title = html.xpath('//*[@id="activity-name"]/text()')[0].strip() else: title = '' result = { 'title': title, } return resultif __name__ == '__main__': start_url = 'https://weixin.sogou.com/weixin' for page in range(1, 11): urls = get_index(start_url=start_url, page=page) for url in urls: real_url = get_real_url(url) result = get_detail(real_url) print(result)

August 14, 2020 · 2 min · jiezi

关于python3.x:python-解析htmlscript标签内变量内容

最近在试用scrapy爬取网站数据发现局部图表是通过异步生成的,scrapy获取到的html页面内只有一个空标签。因而只能查找其原数据,还好通过翻查实例化表格的js文件就追溯到了。然而数据在原html页面内的script标签内以js间接定义,如下图:不能间接通过xpath获取,而且是一般object和array两种格局,通过间接字符串操作必定不够优雅。因而须要绕一下: import js2xmlimport jsonimport xmltodictfrom lxml.etree import tostringimport xmldict_simplify #下文定义的办法#中略...dataName ="forecast_1h"scripts = response.xpath('//script/text()').extract()#获取特定script标签的内容,不蕴含标签自身script =list(filter(lambda x: (dataName in x ),scripts))[0]#script内容 → xmlxml = js2xml.parse(script,encoding='utf-8',debug=False)如果这一步间接xml转json的话,会失去这样的数据即带数据类型的json数据,然而这样的dict天然是不好用的,因而定义个办法解决下 def typeParse(xmlobj): keys = list(xmlobj.keys()) if(len(keys)>1): #援用类型嵌套调用 if(keys[1]=="array"): return {xmlobj[keys[0]]:list(map(lambda x:typeParse(x),xmlobj["array"]["object"]))} elif(keys[1]=="object"): return {xmlobj[keys[0]]:typeParse(xmlobj["object"])} if(len(keys)==1 and keys[0]=="property"): _property = {} for item in xmlobj["property"]: _keys = list(item.keys()) #值类型间接输入 if(_keys[1]=="string"): _property[item["@name"]] = item["string"] elif(_keys[1]=="number"): _property[item["@name"]] = item["number"]["@value"] #援用类型持续解决 else: _property[item["@name"]] = int(typeParse(item)[item["@name"]]) return _property在主流程内应用 ...

August 12, 2020 · 1 min · jiezi

python3-调用-ansible-模块和-fastapi-实现项目监控接口-实例

问题说明1.pm2 通过 json 文件 启动node service时,当同时开启多实例(instances)集群和 --inspect 断点 websocket 端口将无法指定2.而且项目可能在不同环境部署在不同的系统中 3.开发同学权限不足无法查看pid从而找到websocket 端口 { "apps": { "args": [ "debug", "3121" ], "cwd": "/data/source/service-sk_platform_professional_rda/publish/", "error_file": "/data/pm2-log/errlogs/service-sk_platform_professional_rda-err.log", "exec_interpreter": "node", "exec_mode": "fork", "instances": "4", "log_date_format": "YYYY-MM-DD HH:mm Z", "max_memory_restart": "8100M", "max_restarts": "50", "merge_logs": true, "min_uptime": "20s", "name": "service-sk_platform_professional_rda", "node_args": "--inspect=0.0.0.0:33121 --max-old-space-size=8000", "out_file": "/data/pm2-log/outlogs/service-sk_platform_professional_rda-out.log", "pid_file": "/data/pm2-log/outlogs/service-sk_platform_professional_rda.pid", "script": "/data/source/service-sk_platform_professional_rda/publish/service/server.js", "watch": false }}python3 安装ansible 模块pip3 install ansiblepip3 install ansible_runner pip3 install ansible_inventory pip3 install ansible_playbook ...

July 8, 2020 · 5 min · jiezi

爬取今日头条街拍图片

参考于崔庆才的Python爬虫教程,但是崔的视频时间过长,今日头条网站反爬虫也有了变化,因此写下此文章来记录自己的爬取过程遇到的问题,也给大家一些借鉴。欢迎大家讨论。一、获取街索引页。我们会发现doc下服务器给出的response里面全是些js代码,没有我们想要的二级页面链接。然后查看XHR下,preview会发现我们要的数据全在这里面,他是以一个json对象的存放的,由此我们知道他是由Ajax渲染的。(一般下滑加载出数据的基本都是ajax动态渲染的)。再看他的请求字符参数、请求头参数有很多,不过没什么问题,直接复制过来即可。 def get_index(offset, keyword): para = { 'aid': '24', 'app_name': 'web_search', 'offset': offset, 'format': 'json', 'keyword': keyword, 'autoload': 'true', 'count': '20', 'en_qc': '1', 'cur_tab': '1', 'from': 'search_tab', 'pd': 'synthesis', 'timestamp': '1593665684775', '_signature': '7' + 'yD7.AAgEBApd0Jxcjcfwe8huuAALHovmaBcff719uWpg6PhnCCgTgbuUckg1kLI3dQFdQZ1b3VwbtvV9P3ZaGHpjzTDdgJm.hxt6TELcPiJAsAOBYizC - 15.PpPHKolFtN' } headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', 'cookie': 'tt_webid=6844895200352765453; ttcid=147baf1d0de44bcfaa3aaccb43de319231; csrftoken=e72569f7c754e03b930bbb54f34b7759; WEATHER_CITY=%E5%8C%97%E4%BA%AC; tt_webid=6845096485504583176; s_v_web_id=verify_kc5ojvq4_iZKfsEzB_AubR_44PZ_AgkE_hvFA5OJnJ4nc; SLARDAR_WEB_ID=ba4439ab-f467-42a9-9dcd-8be836757cc3; __tasessionId=mbg1eigaz1593748245904; tt_webid=6845096485504583176; __ac_nonce=05efeab2d00f5555e228f; __ac_signature=_02B4Z6wo00f01JctsQwAAIBDjnNXOcxFq8yXKbWAAHs9kTU3N2TXnkkV75OXvSXoT5pfhWopyS8N2zbrE1VOQlMWB8pFBr0ZvUmL9qtI0GvgW6d9cv9TeAEXgf1HZ3bDCooMMUBc9Rq-r53241; tt_scid=8TNWiPBmsnVRkGGZJ5frIVGKsH4gMngyY0s4KQWdyckfgNuI45yMdiqvIa1sudDF15e8' } url = 'https://www.toutiao.com/api/search/content/?' + urlencode(para) # urlencode可以吧字典类型转化为url中的请求参数 try: response = requests.get(url, headers=headers) if response.status_code == 200: print('索引页请求成功') response.encoding = 'UTF-8' return response.text return None except RequestException: print('索引页请求失败') return None二、解析索引页数据。由于这个数据是在js中存储的,一般的爬虫库并不适用,所以我们使用正则表达式的方法将他匹配出来,然后取出各个索引的Url与Title。 ...

July 4, 2020 · 3 min · jiezi

AtCoder-Context-ABC-172-D-Sum-of-Divisors

本文章为原创文章,未经过允许不得转载运行要求 运行时间限制: 2sec 内存限制: 1024MB 原题链接 题目给定一个正整数X,正整数的X的约数的函数为f(X)给定一个正整数N,求F(1)x1 + F(2)x2 .... + F(N)xN 输入前提条件 1 <=N <= 10000000输出输出 F(1)x1 + F(2)x2 .... + F(N)xN 例1 输入 4输出 23f(1) = 1f(2) = 2f(3) = 2f(4) = 3所以最终的结果是1x1 + 2x2 + 2x3 + 3x4 = 1 + 4 + 6 + 12 = 23 例2输入 100输出 26879例3输入 10000000输出 838627288460105注意溢出问题 读懂题目从1到N,每个数乘以这个数约数的个数,然后相加N最大可以达到10的7次方,所以,不能用o(N*N)的复杂度 解题思路如图所示,我们以N=6为例。1到6的每个数的约数都在下面的方块中显示因为最终要求的是f(1)x1 + f(2)x2 + f(3)x3 + f(4)x4 + f(5)x5 + f(6)x6 ...

June 30, 2020 · 1 min · jiezi

微博自动发微博脚本

git仓库地址:https://github.com/MasakiOvO/weibo-create-new-post weibo-create-new-post使用 selenium 写成的 自动发微博脚本 安装依赖需要在国内服务器上运行脚本 pip install -r requirements.txt 配置cp config/user.config.example config/user.config修改config/user.config内的参数 启动脚本python index.py微博内容设置在config/message.txt 默认设置的是一些土味情话。 设置定时任务我设置的是每天8点发一条微博 00 08 * * * python3 /www/weibo-auto-new-post/index.py效果

June 30, 2020 · 1 min · jiezi

Python爬虫Selenium和动作链实现淘宝模拟登录

一、准备话不多说,咋们先来看看淘宝登陆页面,可以看到登陆网址太长了,但其实"?"后面的可以是舍弃的,得到https://login.taobao.com/member/login.jhtml 就登陆而言页面默认是密码登录,也给我们少去了一些麻烦,目前来说只要找到使用Selenium找到账号和密码框赋值后,再点击登录按钮就可以实现淘宝模拟登录了,但事实并非如此,我们接着往下看。在我使用如下代码进行测试登陆的时候,惊奇的发现多出来了滑块验证码。区区滑块验证码算啥,撸起袖子就是干!!! from selenium import webdriverimport timefrom PIL import Imagefrom selenium.webdriver import ActionChains#初始def main(): bro = webdriver.Chrome() bro.maximize_window() bro.get("https://login.taobao.com/member/login.jhtml") time.sleep(1) bro.find_element_by_name("fm-login-id").send_keys("淘宝账号") time.sleep(1) bro.find_element_by_name("fm-login-password").send_keys("淘宝密码") time.sleep(1) time.sleep(10)if __name__ == "__main__": main() 想要破解滑块验证码其实不难,大体来说肯定是要找到滑块验证码然后使用动作链进行点击滑动,然后再点击登录就OK了。那接下来开始代码分析。 二、代码分析第一部分 #初始def main(): bro = webdriver.Chrome() bro.maximize_window() bro.get("https://login.taobao.com/member/login.jhtml") #get方式请求淘宝登陆页面 time.sleep(1) #休眠一秒,不要太快 bro.find_element_by_name("fm-login-id").send_keys("淘宝账号") 根据name找到账号input标签 time.sleep(1) bro.find_element_by_name("fm-login-password").send_keys("淘宝密码") 根据name找到密码input标签 time.sleep(1) GetImage(bro) #得到滑块截图第二部分 #获取def GetImage(bro): # save_screenshot 就是将当前页面进行截图且保存 bro.save_screenshot('taobao.png') code_img_ele = bro.find_element_by_xpath("//*[@id='nc_1__scale_text']/span") #根据xpath语法找到滑块验证码 location = code_img_ele.location #验证码图片左上角的坐标 x,y size = code_img_ele.size # 验证码的标签对应的长和宽 # 左上角和右下角的坐标 rangle = ( int(location['x']),int(location['y']),int(location['x'] + size['width']),int(location['y'] + size['height']) ) i = Image.open("./taobao.png") # code_img_name = './tb.png' # crop裁剪 frame = i.crop(rangle) #得到滑块验证码图片 # frame.save(code_img_name) Action(bro,code_img_ele) #执行注意截图时机,登录页面一开始加载后滑块验证码并不会出现,等到账号和密码输入后才会出现,所以截图的时机要放在账号和密码输入之后。 ...

June 28, 2020 · 2 min · jiezi

AtCoder-Context-ABC-171-E-Red-Scarf

本文章为原创文章,未经过允许不得转载运行要求 运行时间限制: 2sec 内存限制: 1024MB 原题链接 题目小明有N只猫,N为偶数。给每个猫一个编号从1到N。每个猫给一个标牌,标牌上面写着一个非负整数。小明最近在学习异或运算xor。XOR的定义 对于N个非负整数x1,x2,x3...xN,这些数的异或 x1 xor x2 xor x3...xor xN按照下面的方式定义x1 xor x2 xor x3 ... xor xn,把他们用2进制表示。对应的位数上的1的个数为奇数的话,那么该位的结果为1,对应的位数的1的个数为偶数的话,该位的结果为0小明在给猫的标牌上写数字的时候,赶快用一下刚刚学到的xor异或运算。 现在给1到N号猫另外一串特殊编号ai。 这里的ai表示,除了i号猫以外,其他的猫的标牌号的xor运算结果。 我们给定1到N号猫的特殊编号a1,a2,a3....aN 请根据ai求出,每个小猫的标牌号。 输入前提条件 所有的输入均为整数2 <= N <= 200000N为偶数0 <= ai <= 1000000000给出的输入都能够找到相应的输出输入 Na1 a2 … aN输出 输出一行,里面包含用空格分开的N个标牌号从左往右第i个数字代表第i只猫的标牌号满足条件的结果由多个的话,输出任意的结果 例1 输入 420 11 9 24输出 26 5 7 22按照上面输出的标牌号,非自身以外的标牌号的xor结果,满足给定条件ai 5 xor 7 xor 22 = 2026 xor 7 xor 22 = 1126 xor 5 xor 22 = 926 xor 5 xor 7 = 24读懂题目xor 用^来代替 ...

June 22, 2020 · 2 min · jiezi

Python-reStructuredText-帮助文件中文乱码

在使用 IntelliJ 对 reStructuredText 文件进行编辑的时候。 我们可能会遇到乱码的情况。 如下图: 可以看到,我们在使用 IntelliJ 的时候中文是乱码的。 这里有几个地方是需要修改的,首先你需要修改你的项目使用的是 UTF-8 编码。 Ctrl + Alt + S 进入设置,然后选择 Editor > File Encodings 你需要将你的全局设置,项目编码都设置成 UTF-8,如果你使用的是中文操作系统,可能这里默认设置是 GBK,不要使用 GBK。 然后重启你的 IntelliJ, 你可能会发现你的修改没有生效。 这是因为 reStructuredText 的插件使用了 Java 的 JavaFX 或者 Swing,这在默认情况下是不支持 UTF-8 的。 你需要对 IntelliJ 的启动参数进行设置。 选择帮助下面的修改自定 VM 选项。 在文件的最后添加 -Dfile.encoding=UTF-8这个表示的是在 IntelliJ 启动的时候,我们将 VM 的启动参数强制使用 UTF-8 编码。 在完成上面的修改后,重启你的 IntelliJ,然后在对文件进行对比查看。 你可以看到你的 IntelliJ 已经能够支持中文了。 因为你 IntelliJ 是基于 Java 平台,Java 平台中的 JavaFX 和 Swing 对 UTF-8 的支持一种不是非常理想,不是开箱即用的那种。 ...

June 17, 2020 · 1 min · jiezi

AtCoder-Context-ABC-079-D-Wall

本文章为原创文章,未经过允许不得转载运行要求 运行时间限制: 2sec 内存限制: 1024MB 未经允许,不得许转载原题链接 题目魔法少女想要把这个世界上所有的数字都变为1把一个数字从i变成j需要cij个魔法点数。0<=i,j<=9现在面前有一堵墙,宽为W,高为H。只要有一个砖块里写着0以上9以下的整数。从上往下,从左往右i行(1<=i<=H),第j列(1<=j<=W),写着数情报Aij Aij = -1 的情况下,代表砖头上没有写数字Aij != -1 的情况下,代表砖头上写着数字Aij求把墙壁上所有的数字都变成1,所需要的最小魔法值。 输入前提条件 所有的输入均为整数1 <= H,W <= 200cij = 0 (i = j)-1 <= Aij <= 9墙上至少写了一个整数输入 输入按照以下形式标准输入 H Wc0,0 ... c0,9::c9,0 ... c9,9A1,1 ... A1,W:AH,1 ... AH,W输出输出把墙壁上所有的数都变成1,所需要的最小魔法值 例1 输入 2 40 9 9 9 9 9 9 9 9 99 0 9 9 9 9 9 9 9 99 9 0 9 9 9 9 9 9 99 9 9 0 9 9 9 9 9 99 9 9 9 0 9 9 9 9 29 9 9 9 9 0 9 9 9 99 9 9 9 9 9 0 9 9 99 9 9 9 9 9 9 0 9 99 9 9 9 2 9 9 9 0 99 2 9 9 9 9 9 9 9 0-1 -1 -1 -18 1 1 8输出 ...

June 10, 2020 · 3 min · jiezi

解决问题matplotlib-生成的图像中无法显示中文字符

matplotlib 生成的图像中无法显示中文字符开发环境windows 8.1 64bitpython 3.6.0matplotlib 3.2.1问题背景使用 matplotlib 绘制函数图像的时候,发现设置图像名称或图例需要汉字显示的时候只能得到空格生成图像中的中文错误效果 原因分析python中的matplotlib仅支持Unicode编码,默认是不显示中文的.解决方案解决方案1python文件中添上一段语句plt.rcParams['font.sans-serif']=['Simhei']之后再次运行得出图像 解决方案2制定加载本地的字体文件在python文件中导入matplotlib的字体控制方法 from matplotlib.font_manager import FontProperties 另设font变量存储设置好的属性 font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=14) 设置 title 内容时将 font的存储对象赋给 fontproperties 属性 plt.title(u'y=x 与 y=x^0.5 的函数图像比较',fontproperties = font)修改源码后生成的图像 附件修改前的 python 文件 import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,100) # 设置自变量的取值[0,100] y1 = x y2 = x**0.5 plt.figure() plt.plot(x,y1,label='y=x') plt.plot(x,y2,label='y=x^0.5',color='red') plt.title('y=x 与 y=x^0.5 的函数图像比较') plt.legend() plt.show()经解决方案1修改后的源码 import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,100) # 设置自变量的取值[0,100] y1 = x y2 = x**0.5 plt.figure() plt.plot(x,y1,label='y=x') plt.plot(x,y2,label='y=x^0.5',color='red') plt.title('y=x 与 y=x^0.5 的函数图像比较') plt.rcParams['font.sans-serif']=['Simhei'] plt.legend() plt.show()经解决方案2修改后的源码 import numpy as np from matplotlib.font_manager import FontProperties import matplotlib.pyplot as plt x = np.linspace(0,100) # 设置自变量的取值[0,100] y1 = x y2 = x**0.5 plt.figure() plt.plot(x,y1,label='y=x') plt.plot(x,y2,label='y=x^0.5',color='red') font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=14) plt.title(u'y=x 与 y=x^0.5 的函数图像比较',fontproperties = font) plt.legend() plt.show()

June 10, 2020 · 1 min · jiezi

AtCoder-ContextABC-084-D-2017like-Number

本文章为原创文章,未经过允许不得转载运行要求 运行时间限制: 2sec 内存限制: 1024MB 未经允许,不得许转载原题链接 题目如果有一个奇数N,N和(N+1//2)都是素数的话,N为2017的相似数现在给定Q次查询第i(1<=i<=Q)次查询,第i次查询给定奇数li,ri,求li<=x<=ri范围内,2017相似数的x的个数 输入前提条件 1<=Q<=1000001<=li<=ri<=100000li,ri为奇数所有的输入都为整数输入 输入按照以下形式标准输入 Ql1 r1l2 r1...lQ rQ输出第i行输出,第i次查询的结果 例1 输入 13 7输出 23和((3+1)/2)都为素数,所以3为2017的相似数5和((5+1)/2)都为素数,所以5为2017的相似数7虽然是素数,但是5((7+1)/2)不是素数,所以7不是2017的相似数以上所述,查询1的结果为2 例2输入 413 137 117 112017 2017输出 1001注意2017也是2017的相似数 例2输入 61 5313 9137 5519 5173 9113 49输出 441112读懂题目给定一个区间,在这个区间的所有素数当中,挑选出折半以后仍然是素数的数字 解题思路首先我们要看到li,ri的最大值是100000,最小值是1li,ri决定了区间的左边界和右边界所以区间的最大跨度是1到100000 首先我们要找到这个区间里面的所有的素数因为是代码竞技所以不能使用第三方的扩展包我们手写素数生成器具体的方法用到素数筛选法英文叫sieve of Eratosthenes 我们取一串区间,记住最少要从2开始。我们找出这串数字的最小的元素,这里为2先找出2的倍数,然后去掉它们 在从剩下的里面找第1个没有被遍历的元素,这里是3找出3的倍数,然后去掉它们 依此类推,找出5的倍数,去掉他们 有的时候,最小元素的倍数不存在了,那么什么都不用做 以这种方式可以找到所有的素数 但是有一点要注意的是,遍历结束的标志。区间从2到某个地方的方start可以从区间的开头遍历到区间的结尾,但是如果区间很大的话,我们只需要遍历到区间的平方根的地方就好了比如2-16的话我们只需要遍历到2-42-100的话我们只需要遍历到2-10 好,我们拿到了1-100000的所有的素数 我们再次遍历一次1-100000,判断每一个数是不是2017的相似数用累积和的求法,算出从1到遍历点i的相似数的个数 具体就是如果i为2017的相似数,那么1到i的2017相似数的个数 = 1到(i-1)的2017相似数的个数 + 1 具体就是如果i不是2017的相似数,那么1到i的2017相似数的个数 = 1到(i-1)的2017相似数的个数 最后对于区间(li,ri)内2017相似数的个数的统计=1到ri的2017相似数的个数 - 1到(li-1)的2017相似数的个数 代码 import mathdef sushu(n): arr = [] for i in range(2, n + 1): arr.append(i) limit = int(math.sqrt(n)) + 1 prev = [] while True: start = arr[0] prev.append(start) if start > limit: break brr = [] for i in arr: if i % start != 0: brr.append(i) arr = brr prev.extend(arr) return prevn = 100000shushu = sushu(100000)marks = []for i in range(n + 1): marks.append(False)for j in shushu: marks[j] = Truemarks2 = []result = []for i in range(n + 1): if i % 2 == 0: marks2.append(False) if i == 0: result.append(0) else: result.append(result[i - 1]) else: if marks[(i + 1) // 2] and marks[i]: marks2.append(True) result.append(result[i - 1] + 1) else: marks2.append(False) result.append(result[i - 1])Q = int(input())ARR = []for i in range(Q): ARR.append(list(map(int, input().split())))for i in range(Q): start = ARR[i][0] end = ARR[i][1] print(result[end] - result[start - 1])总结这道题考察了对素数的求法。运用素数筛选法可以求出某一个区间以内的所有的素数 ...

June 6, 2020 · 1 min · jiezi

多线程拉取impala数据到本地

import threadingimport timefrom impala.dbapi import connectimport pandas as pdimport osclass MyThread(threading.Thread): def __init__(self, threadid, name, day, min): threading.Thread.__init__(self) self.threadID = threadid self.name = name self.day = day self.min = min def run(self): print("开始线程:" + self.name) run_task(self.name, self.day, self.min) print("退出线程:" + self.name)def run_task(thread_name, day, min): hour = 24 while hour: if hour < 11: _hour = '0' + str(hour - 1) else: _hour = hour - 1 try: query_and_write(day, _hour, min) except Exception as e: print(str(day) + str(_hour) + '-----need--rey--try-' + str(e)) time.sleep(10) continue time.sleep(2) print("%s: %s" % (thread_name, time.ctime(time.time()))) hour -= 1def impala_conn_exec(sql): conn = connect(host='*.*.*.*', port=21050) cur = conn.cursor() cur.execute(sql) cur.close result = cur.fetchall() return resultdef query_and_write(_date, _hour, _min): """ 初始化sql,调用查询并写入CSV :param _date: :param _time: :return: """ sql = "select * " \ "from 表名 m where date= '{0}' " \ "and substr(cast(time as string),1,15) = '{0} {1}:{2}'/*SA(production)*/".format(_date, _hour, _min) print(sql) result = impala_conn_exec(sql) # result = [] df = pd.DataFrame(data=result) path = _date if os.path.exists(path): pass else: os.mkdir(path) file_name = "data_{0}-{1}-{2}.csv".format(_date, _hour, _min) df.to_csv(path + '/' + file_name, encoding="utf-8", index=False)# 按日期范围循环 遍历区间开闭示意: [起始日期,截止日期)for j in range(5, 7): daterange = "2020-02" if j < 10: daterange = daterange + "-0" + str(j) else: daterange = daterange + "-" + str(j) print(daterange) # 创建新线程 threads = [] for i in range(0, 6): if i < 10: id = "thread0" + str(i) else: id = "thread" + str(i) threadName = MyThread(1, id, daterange, i) threads.append(threadName) try: # 启动线程 for thread in threads: thread.setDaemon(True) thread.start() time.sleep(1) # 等待所有线程结束 for thread in threads: thread.join() except Exception as e: print(e) j += 1print("退出主线程")

June 5, 2020 · 2 min · jiezi