亚洲色成人网站www永久,亚洲欧美人成视频一区在线,亚洲国产成人高清在线观看,亚洲精品久久久久久动漫,亚洲国产精品久久电影欧美

數(shù)據(jù)專欄

智能大數(shù)據(jù)搬運(yùn)工,你想要的我們都有

科技資訊

科技學(xué)院

科技百科

科技書籍

網(wǎng)站大全

軟件大全

我就有比較強(qiáng)的潔癖 要求實(shí)習(xí)生寫 python 不符合 pep8 直接 close PR. 要求團(tuán)隊(duì)內(nèi)部統(tǒng)一代碼風(fēng)格, 用拼音或者風(fēng)格不一致的我會(huì)揪出來(lái)重點(diǎn)批評(píng), 復(fù)雜一點(diǎn)的函數(shù)逼每個(gè)人都寫文檔 并且隨改隨更新.
今天上午又因?yàn)橐粋€(gè)實(shí)習(xí)生使用 git add * , 結(jié)果加進(jìn)來(lái)一大堆臨時(shí)文件發(fā)火了...感覺(jué)其他人都不理解自己好累...
前沿探索
2020-08-18 03:39:19
nosetests 怎么保證 setUp 和 teardown 之間調(diào)用 case 報(bào)錯(cuò)情況下,保證執(zhí)行 teardown ?
前沿探索
2020-08-18 03:39:16
Crawlab 是一款基于 Golang 的分布式爬蟲管理平臺(tái),產(chǎn)品發(fā)布已經(jīng)一年有余,經(jīng)過(guò)開(kāi)發(fā)團(tuán)隊(duì)的不斷打磨,即將迭代到 v0.5 版本。在這期間我們?yōu)?Crawlab 加入了大量社區(qū)用戶共同期望的功能,使產(chǎn)品更加專業(yè)。但與此同時(shí)我們也注意到,部分用戶并不是分布式爬蟲用戶,他們更多只是在單機(jī)情況下使用 Crawlab 。其次目前 Crawlab 逐步加入了豐富的功能,也使整個(gè)產(chǎn)品逐漸巨化,大部分用戶并不能充分使用所有的功能。
因此 Crawlab Lite 作為 Crawlab 的輕量化版本正式發(fā)布,相較于 Crawlab,該版本將專注于解決單機(jī)環(huán)境下的爬蟲管理,并且平臺(tái)本身不再依賴任何外部數(shù)據(jù)庫(kù),現(xiàn)有以及未來(lái)加入的功能都僅限于高頻使用的必需功能,做到最大化的功能克制。
功能特性
首次發(fā)布的版本為 v0.0.1 版本,該版本作為首個(gè)體驗(yàn)版本,已經(jīng)具備了 Lite 版規(guī)劃的核心功能,相較于 Crawlab 主要區(qū)別: 僅支持單機(jī)環(huán)境下的爬蟲管理,不再具備分布式功能 內(nèi)置依賴 Key-Value 文件數(shù)據(jù)庫(kù),運(yùn)行不再需要配置外部數(shù)據(jù)庫(kù) 刪減了大量非必需的功能,平臺(tái)更加輕量與易用 后端代碼大量重構(gòu),平臺(tái)的穩(wěn)定和速度大幅提升
運(yùn)行方式
我們依然保留通過(guò) docker-componse 這種最方便的方式: 在任意目錄下創(chuàng)建 docker-compose.yml ,內(nèi)容如下: version: '3' services: master: image: zkqiang/crawlab-lite:latest container_name: master ports: - "8080:8080" 在目錄下運(yùn)行命令: docker-compose up -d 訪問(wèn) http://localhost:8080
項(xiàng)目地址
https://github.com/crawlab-team/crawlab-lite
項(xiàng)目截圖

前沿探索
2020-08-18 03:39:14
[uwsgi] uid=root gid=root socket = 0.0.0.0:9024 chdir=/root/test-scc/scc_service master=true vhost = True workers = 2 enable-threads = True wsgi-file= run.py callable = flask_app module=run:flask_app logto=/var/error.log python-autoreload=1 touch-chain-reload = true uwsgi_read_timeout = 600 limit-as = 6048 processes=4 gevent= 100
采用 uwsgi 部署成功后: 1.http 接口可以正常訪問(wèn) 2.ws 接口異常:environment = environ['wsgi.websocket'] KeyError: 'wsgi.websocket' 如下方式啟動(dòng)服務(wù)不會(huì)出現(xiàn)上訴問(wèn)題: if name == ' main ': from gevent import pywsgi from geventwebsocket.handler import WebSocketHandler host, port, debug = configuration.get_start_config() flask_app.debug = eval(debug) server = pywsgi.WSGIServer((host, int(port)), flask_app, handler_class=WebSocketHandler) server.serve_forever()
前沿探索
2020-08-18 03:39:11
CSS 文件類似: https://pastebin.com/QVdRQzPJ
想要提取 Class 值和對(duì)應(yīng) font-family 值,以及 font-family 值和對(duì)應(yīng) Url 。試了下使用 cssutils 庫(kù)只能提取到 font-family 值,無(wú)法獲得 Class 值。
請(qǐng)問(wèn)還有什么別的方法嗎 sheet = cssutils.parseString(cssText) for rule in sheet: for property in rule.style: print(property.name) print(property.value)
前沿探索
2020-08-18 03:39:09
機(jī)器配置: Windows 10 企業(yè)版 64 位 Intel(R) Xeon(R) Platinum 8173M 內(nèi)核:56 邏輯處理器:112
用 python multiprocessing 中的進(jìn)程池會(huì)出現(xiàn) ValueError: need at most 63 handles, got a sequence of length 114
這是 windows 才會(huì)有的異常么,很少用 windows,也第一次用這種 U,google 也找不到什么答案
前沿探索
2020-08-18 03:39:05
問(wèn)題
使用 python manage.py runserver 正常啟動(dòng),使用 django-admin 出錯(cuò)。查看 manage.py 中也是用的'Bill.settings',參考了 overflow 加了命令的參數(shù)還是不行,請(qǐng)教大家到底啥原因,如何解決
錯(cuò)誤信息
使用命令
django-admin runserver 8054 --settings="Bill.settings" --pythonpath=.
出現(xiàn)錯(cuò)誤 (venv-django2.2) D:\PythonApp\Bill>django-admin runserver 8054 --settings="Bill.settings" --pythonpath="D:\Program Files\Python\Python36" Traceback (most recent call last): File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\core\management\base.py", line 323, in run_from_argv self.execute(*args, **cmd_options) File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\core\management\commands\runserver.py", line 60, in execute super().execute(*args, **options) File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\core\management\base.py", line 364, in execute output = self.handle(*args, **options) File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\core\management\commands\runserver.py", line 67, in handle if not settings.DEBUG and not settings.ALLOWED_HOSTS: File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\conf\__init__.py", line 79, in __getattr__ self._setup(name) File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\conf\__init__.py", line 66, in _setup self._wrapped = Settings(settings_module) File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\conf\__init__.py", line 157, in __init__ mod = importlib.import_module(self.SETTINGS_MODULE) File "D:\Program Files\Python\Python36\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "", line 994, in _gcd_import File "", line 971, in _find_and_load File "", line 941, in _find_and_load_unlocked File "", line 219, in _call_with_frames_removed File "", line 994, in _gcd_import File "", line 971, in _find_and_load File "", line 953, in _find_and_load_unlocked ModuleNotFoundError: No module named 'Bill' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\Program Files\Python\Python36\lib\runpy.py", line 193, in _run_module_as_main "__main__", mod_spec) File "D:\Program Files\Python\Python36\lib\runpy.py", line 85, in _run_code exec(code, run_globals) File "D:\PythonApp\venvs\venv-django2.2\Scripts\django-admin.exe\__main__.py", line 9, in File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line utility.execute() File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\core\management\__init__.py", line 375, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\core\management\base.py", line 336, in run_from_argv connections.close_all() File "d:\pythonapp\venvs\venv-django2.2\lib\site-packages\django\db
前沿探索
2020-08-18 03:39:02
you-get 單單作為 B 站(嗶哩嗶哩、 bilibili.com )視頻下載器還湊合,但是大小問(wèn)題卻不少: 當(dāng)前 PyPI 上的版本尚不支持 4K 視頻流(這個(gè)早晚會(huì)得到正式更新) 某些視頻的大會(huì)員 1080P+或 1080P60 畫質(zhì)無(wú)法正常獲?。ㄟ@個(gè) Bug 不知道開(kāi)發(fā)者會(huì)不會(huì)重視) 默認(rèn)下載文件名不包括 av 號(hào) BV 號(hào) UP 主用戶名(這是個(gè)人需求,但目前版本無(wú)法實(shí)現(xiàn)) 默認(rèn)的文件名長(zhǎng)度限制有點(diǎn)短,某些視頻的分 p 子標(biāo)題很長(zhǎng),會(huì)被截?cái)?
想等正式版修 Bug 加功能遙遙無(wú)期,只能著手魔改。雖然還有很多其他的同類工具,然而…… B 站移動(dòng)端 APP 離線緩存后,還要從設(shè)備導(dǎo)出,轉(zhuǎn)換格式,多了兩個(gè)環(huán)節(jié),費(fèi)時(shí)費(fèi)力,做不到隨時(shí)隨地,而且離線緩存下來(lái)的是 AVC 編碼,文件體積比 HEVC 大得多 jijidown 則是圖形界面,操作流程無(wú)法批量化,任務(wù)稍多,鼠標(biāo)點(diǎn)的人想死的心都有,而且如果沒(méi)搞錯(cuò)的話,jijidown 同樣不支持 HEVC youtube-dl 里面的 B 站模塊年久失修,不僅大會(huì)員的畫質(zhì)無(wú)法通過(guò) cookies 獲取,而且 HEVC 格式也不支持,4K 就沒(méi)更戲了 annie 還湊合但是目前它不抓 HEVC 而且也不支持自定義格式的下載文件名
(合著我看中 you-get 的點(diǎn)主要就是 HEVC ?)
好煩,不過(guò)好在還有 you-get 。you-get 的毛病最少,而且 you-get 是 python 寫的。“這個(gè)我能改,而且這個(gè)工作量最?。ù蟾牛?我心里這樣嘀咕道。
然而 you-get 的軟件框架實(shí)在談不上合理,比較亂,模塊間耦合太重,負(fù)責(zé)實(shí)際工作的方法函數(shù)的代碼普遍太長(zhǎng)(動(dòng)不動(dòng)三四百行一個(gè)方法函數(shù),明明還可以細(xì)分的)。
這就導(dǎo)致對(duì)象層面的 Monkey Patch 實(shí)現(xiàn)起來(lái)很不劃算——我總不能為了改一個(gè)三四百行代碼的函數(shù),就另外寫一個(gè)三四百行的函數(shù),然后這倆的區(qū)別無(wú)非只有那么幾行?
最好既保持原版模塊的文件不變,同時(shí)將其中的源碼導(dǎo)入內(nèi)存,修改之,再將修改后的源碼轉(zhuǎn)換成新的模塊,并按照原版模塊的路徑替換掉原版模塊。
即,在 main.py 中調(diào)用 xxx,并且改變 xxx 中的部分代碼(可能是一段,可能是一行,可能只是幾個(gè)詞),但是 xxx.py 這個(gè)文件并沒(méi)有被動(dòng)手腳。
這其實(shí)也是一種 Monkey Patch,因?yàn)椴粫?huì)改變?cè)嫖募?
實(shí)現(xiàn)這個(gè)功能的函數(shù)很簡(jiǎn)單(這個(gè)不是我自己寫的,引用出處在下面代碼注釋中): def modify_and_import(module_path: str, code_modifier: str or Callable, package_path: str = None): # How to modify imported source code on-the-fly? # https://stackoverflow.com/a/41863728/7966259 (answered by Martin Valgur) # Modules and Packages: Live and Let Die! (by David Beazley) # http://www.dabeaz.com/modulepackage/ModulePackage.pdf # https://www.youtube.com/watch?v=0oTh1CXRaQ0 spec = importlib.util.find_spec(module_path, package_path) if isinstance(code_modifier, str): source = code_modifier else: source = code_modifier(spec.loader.get_source(module_path)) module = importlib.util.module_from_spec(spec) code_obj = compile(source, module.__spec__.origin, 'exec') exec(code_obj, module.__dict__) sys.modules[module_path] = module return module
正如之前所言,這個(gè)函數(shù)很簡(jiǎn)單,幾個(gè)步驟很清楚,我很懶,所以不細(xì)說(shuō)了。
但是用起來(lái),還是有一些訣竅的。這主要取決于場(chǎng)景,如果只是單純替換一個(gè)源代碼不長(zhǎng)的小模塊,直接調(diào)用函數(shù)就好了;但如果原模塊代碼很長(zhǎng),需要精確定位替換,或者模塊間相互調(diào)用的關(guān)系比較復(fù)雜,或者模塊路徑很深卻又被淺層模塊調(diào)用……遇到等等這類情況的時(shí)候,還是需要多多思考多多嘗試,具體問(wèn)題具體分析的。
個(gè)中過(guò)程一概不表,只分享最終方案,我懶。
算了,方案也省略,直接上代碼,我好懶,代碼里額外加了注釋作為概述: # 下面這個(gè)函數(shù)用于修改 you-get 的 B 站下載模塊`you_get.extractors.bilibili`的源碼 def code_modify_you_get_bilibili(x: str): # `x`是輸入的源代碼字符串,就是原模塊的代碼,直接對(duì)其進(jìn)行替換,以此修改源代碼的文本 # 這里用的方法是在要替換的代碼的上下文找到特征明顯的一段,然后直接 replace # 下面是給尚未支持 B 站 4K 的當(dāng)前版本,加上 4K 相關(guān)的視頻流信息 # 其實(shí)就是在原來(lái)的 dict 對(duì)象中加了一項(xiàng) x = x.replace(''' stream_types = [ {'id': 'flv_p60', 'quality': 116, 'audio_quality': 30280, 'container': 'FLV', 'video_resolution': '1080p', 'desc': '高清 1080P60'}, ''', ''' stream_types = [ {'id': 'hdflv2_4k', 'quality': 120, 'audio_quality': 30280, 'container': 'FLV', 'video_resolution': '2160p', 'desc': '超清 4K'}, {'id': 'flv_p60', 'quality': 116, 'audio_quality': 30280, 'container': 'FLV', 'video_resolution': '1080p', 'desc': '高清 1080P60'}, ''') # 下面也是跟 4K 相關(guān)的判斷條件,B 站視頻流用不同數(shù)字 ID 標(biāo)定不同的格式碼率 # 120 是 4K,112 則是大會(huì)員的 1080P+(即較高碼率的 1080P30 ) # ( 160 是大會(huì)員 1080P60,這里的 160 不需要判斷,所以沒(méi)有) x = x.replace(''' elif height <= 1080 and qn <= 80: return 80 else: return 112 ''', ''' elif height <= 1080 and qn <= 80: return 80 elif height <= 1080 and qn <= 112: return 112 else: return 120 ''') # 下面這段修改了原本代碼中的一行打印提示文本,是為了和自己寫的命令行工具的選項(xiàng)一致 x = x.replace(''' log.w('This is a multipart video. (use --playlist to download all parts.)') ''', r''' sys.stderr.write('# multi-part video: use -p to download other part(s)\n') ''') # 下面這段修改了下載文件名的格式,原版是視頻標(biāo)題+分 p 子標(biāo)題 # 我則是在視頻標(biāo)題+分 p 子標(biāo)題的基礎(chǔ)上,插入了一些有用的元信息:[av 號(hào)][BV 號(hào)][上傳者用戶名] x = x.replace(''' # set video title self.title = initial_state['videoData']['title'] # refine title for a specific part, if it is a multi-part video p = int(match1(self.url, r'[\?&]p=(\d+)') or match1(self.url, r'/index_(\d+)') or '1') # use URL to decide p-number, not initial_state['p'] if pn > 1: part = initial_state['videoData']['pages'][p - 1]['part'] self.title = '%s (P%s. %s)' % (self.title, p, part) ''', ''' # set video title self.title = initial_state['videoData']['title'] self.title += ' ' + self.get_vid_label() + self.get_author_label() # refine title for a specific part, if it is a multi-part video p = int(match1(self.url, r'[\?&]p=(\d+)') or match1(self.url, r'/index_(\d+)') or '1') # use URL to decide p-number, not initial_state['p'] if pn > 1: part = initial_state['videoData']['pages'][p - 1]['part'] self.title = '%s P%s. %s' % (self.title, p, part) ''') # 下面這段是個(gè)重點(diǎn),修改的是原版中`you_get.extractors.bilibili.Bilibili.prepare_by_url`這個(gè)方法函數(shù) # 原版 you-get 對(duì)相當(dāng)多的 B 站視頻無(wú)法獲取大會(huì)員的 1080P+、1080P60 等格式 # 原版這里的邏輯有問(wèn)題,按下面這樣修改后,用到現(xiàn)在沒(méi)發(fā)現(xiàn)異常 # 究竟是什么原因?我沒(méi)有徹底搞明白,但肯定與原版代碼中`current_quality`和`best_quality`有關(guān) x = x.replace(''' # get alternative formats from API for qn in [112, 80, 64, 32, 16]: # automatic format for durl: qn=0 # for dash, qn does not matter if current_quality is None or qn < current_quality: ''', ''' # get alternative formats from API for qn in [116, 112, 80, 64, 32, 16]: # automatic format for durl: qn=0 # for dash, qn does not matter # if current_quality is None or qn < current_quality: if True: ''') # 下面這段,修改的是原版`you_get.extractors.bilibili.Bilibili.prepare_by_url`的結(jié)尾部分 # 新加一個(gè)流程,從已經(jīng)獲取的所有視頻流格式中,刪除一部分不需要的格式 # you-get 默認(rèn)下載最佳畫質(zhì),雖然可以選擇畫質(zhì),但用的格式名稱比較長(zhǎng),不如數(shù)字 ID 本身來(lái)得方便 # 所以加了一個(gè)`del_unwanted_dash_streams()`,用數(shù)字來(lái)指定最高畫質(zhì)和需要下載的畫質(zhì) # (其實(shí)加這個(gè)方法,還是因?yàn)?Bug 修得不徹底,權(quán)宜之計(jì)罷了) # 順便一提,這個(gè)`del_unwanted_dash_streams`方法不是原版 you-get 代碼里自帶的 # 而是在新的`YouGetBilibiliX`類里自定義的方法 # 而`YouGetBilibiliX`則是繼承的魔改版`bilibili.Bilibili` # 替換原版代碼 -> 調(diào)用一個(gè)原版沒(méi)有的方法 -> 魔改版 -> 繼承魔改版的新類 -> 在新類中補(bǔ)上這個(gè)缺失的方法 # 回溯套娃,左右橫跳! x = x.replace(''' def prepare_by_cid(self,avid,cid,title,html_content,playinfo,playinfo_,url): ''', ''' self.del_unwanted_dash_streams() def prepare_by_cid(self, avid, cid, title, html_content, playinfo, playinfo_, url): ''') return x # 下面這個(gè)函數(shù)用于修改 you-get 的文件系統(tǒng)模塊`you_get.util.fs`的源碼 def code_modify_you_get_fs(x: str): # 原版為了兼容 VFAT 文件系統(tǒng),會(huì)把文件名里面的方括號(hào)替換成圓括號(hào) # 魔改版不需要這個(gè)特性,所以將這兩行代碼加#注釋掉了 x = x.replace("ord('['): '(',", "#ord('['): '(',") x = x.replace("ord(']'): ')',", "#ord(']'): ')',") # 下面把最大文件名字符串長(zhǎng)度從 80 延長(zhǎng)到 200,原版的 80 有點(diǎn)小,200 會(huì)不會(huì)太大尚不清楚 x = x.replace(''' text = text[:80] # Trim to 82 Unicode characters long ''', ''' text = text[:200] # Trim to 82 Unicode characters long ''') return x # 上面已經(jīng)導(dǎo)入了原版的`you_get.util.strings` # 對(duì) python,此時(shí)原版的`you_get`及其下級(jí)子路徑都已經(jīng)注冊(cè)在模塊名空間中了 # 在此基礎(chǔ)上,下面一行代碼將模塊名空間中的原版的`you_get.util.fs`替換成經(jīng)過(guò)修改的新模塊 you_get.util.fs = modify_and_import('you_get.util.fs', code_modify_you_get_fs) # 接著把`you_get.util.strings.legitimize`這個(gè)原版的函數(shù)替換成修改后的模塊`you_get.util.fs`中的魔改版函數(shù) # 順便一提,上面的`code_modify_you_get_fs`修改的源碼就是`legitimize`這個(gè)函數(shù)的源碼 # 在原版的 you-get 中,`.util.string`從`.util.fs`中導(dǎo)入了`legitimize`這個(gè)函數(shù) # `.util.string`又利用已經(jīng)導(dǎo)入的`legitimize`和其他幾個(gè)函數(shù),構(gòu)建了一個(gè)`get_filename`函數(shù) # 而`you_get.extractor`和`you_get.common`又都用到了`get_filename`,當(dāng)然是各自分別從`you_get.util.strings`導(dǎo)入的 # 因此,所以,故而,然則, # 只要將原版`you_get.util.strings`中的`legitimize`替換成魔改版的`you_get.util.fs`中的`legitimize`函數(shù)即可 # 其他從``you_get.util.strings`二次導(dǎo)入這個(gè)函數(shù)的模塊會(huì)自動(dòng)導(dǎo)入已經(jīng)被替換成魔改版的函數(shù) you_get.util.strings.legitimize = you_get.util.fs.legitimize # 綜上所述,下面這行可以注釋掉了 # you_get.extractor.get_filename = you_get.common.get_filename = you_get.util.strings.get_filename # 下面則是將 B 站下載模塊替換成魔改版本,所用的源碼替換函數(shù)是上面之前提到的`code_modify_you_get_bilibili` you_get.extractors.bilibili = modify_and_import('you_get.extractors.bilibili', code_modify_you_get_bilibili) # 搜尋 av 、BV 、AV 、bv 開(kāi)頭的字符串或者整形數(shù),將之變成 B 站視頻的 av 嗯號(hào)或者 BV 號(hào) def get_vid(x: str or int) -> str or None: if isinstance(x, int): vid = 'av{}'.format(x) elif isinstance(x, str): for p in (r'(av\d+)', r'(BV[\da-zA-Z]{10})'): m = re.search(p, x, flags=re.I) if m: vid = m.group(1) if vid.startswith('bv'): vid = 'BV' + vid[2:] elif vid.startswith('AV'): vid = 'av' + vid[2:] break else: vid = None else: raise TypeError("'{}' is not str or int".format(x)) return vid # YouGetBilibiliX 繼承了`you_get.extractors.bilibili.Bilibili`,添加了一些新的功能 # 雖然原版`Bilibili`是被繼承的類,但它也是可以調(diào)用繼承后新加的屬性的 class YouGetBilibiliX(you_get.extractors.bilibili.Bilibili): def __init__(self, *args, cookies: str or dict = None, qn_max=116, qn_single=None): super(YouGetBilibiliX, self).__init__(*args) self.cookie = None if cookies: self.set_cookie(cookies) self.qn_max = qn_max self.qn_single = qn_single self.html = None, None # B 站視頻的音頻流分不同檔次,默認(rèn)選擇中檔 128kbps 的(音質(zhì)足夠了),也可以強(qiáng)制選擇最高音質(zhì) # 低檔 30216 碼率偏低,30232 約 128kbps,30280 可能是 320kbps 也可能是 128kbps,貌似跟是否 4K 有關(guān),不是特別清楚 def set_audio_qn(self, qn): for d in self.stream_types: d['audio_quality'] = qn # 更新視頻頁(yè)面的 HTML 文檔(超長(zhǎng)字符串) def update_html_doc(self): url, doc = self.html if url != self.url: url = self.url headers = self.bilibili_headers() r = requests.get(url, headers=headers) doc = html.document_fromstring(r.text) self.html = url, doc # 設(shè)置 cookies,大會(huì)員用得 # `cookie_str_from_dict`和`cookie_str_from_dict`這兩個(gè)函數(shù)另有定義 # 前者將 cookies 字典變成單字符串,后者負(fù)責(zé)讀取 cookies 文件 def set_cookie(self, cookies: str or dict): if isinstance(cookies, dict): c = cookie_str_from_dict(cookies) elif isinstance(cookies, str): if os.path.isfile(cookies): c = cookie_str_from_dict(cookies_dict_from_file(cookies)) else: c = cookies else: raise TypeError("'{}' is not cookies file path str or joined cookie str or dict".format(cookies)) self.cookie = c def bilibili_headers(self, referer=None, cookie=None): if not cookie: cookie = self.cookie headers = super(YouGetBilibiliX, self).bilibili_headers(referer=referer, cookie=cookie) return headers # 從 URL 和 HTML 獲取 av 號(hào) BV 號(hào) def get_vid(self): url = self.url for m in [re.search(r'/(av\d+)', url), re.search(r'/(bv\w{10})', url, flags=re.I)]: if m: vid = m.group(1) if vid.startswith('bv'): vid = 'BV' + vid[2:] break else: vid = None return vid # [av 號(hào)][BV 號(hào)] def get_vid_label(self, fmt='[{}]'): the_vid = self.get_vid() label = fmt.format(the_vid) if the_vid.startswith('BV'): self.update_html_doc() _, h = self.html canonical = h.xpath('//link[@rel="canonical"]')[0].attrib['href'] avid = re.search(r'/(av\d+)/', canonical).group(1) label += fmt.format(avid) return label # 上傳者( UP 主)用戶名 def get_author(self): self.update_html_doc() _, h = self.html return h.xpath('//meta[@name="author"]')[0].attrib['content'] def get_author_label(self, fmt='[{}]'): return fmt.format(self.get_author()) # 刪除不需要的視頻流,限定最高畫質(zhì),選擇下載畫質(zhì) def del_unwanted_dash_streams(self): format_to_qn_id = {t['id']: t['quality'] for t in self.stream_types} for f in list(self.dash_streams): q = format_to_qn_id[f.split('-', maxsplit=1)[-1]] if q > self.qn_max or self.qn_single and self.qn_single == q: del self.dash_streams[f] # 這是一個(gè)任務(wù)函數(shù),包裝了魔改版的 you-get 的 B 站下載功能,供另外編寫的命令行工具調(diào)用 def download_bilibili_video(url: str or int, cookies: str or dict = None, output: str = None, parts: list = None, qn_max: int = None, qn_single: int = None, moderate_audio: bool = True, fmt=None, info: bool = False, playlist: bool = False, caption: bool = True, **kwargs): ensure_sigint_signal() dr = SimpleDrawer(sys.stderr.write, '\n') if not output: output = '.' if not qn_max: qn_max = 116 url = BILIBILI_VIDEO_URL_PREFIX + get_vid(url) dr.hl() dr.print('{} -> {}'.format(url, output)) dr.hl() bd = YouGetBilibiliX(cookies=cookies, qn_max=qn_max, qn_single=qn_single) if info: dl_kwargs = {'info_only': True} else: dl_kwargs = {'output_dir': output, 'merge': True, 'caption': caption} if fmt: dl_kwargs['format'] = fmt if moderate_audio: bd.set_audio_qn(30232) if playlist: bd.download_playlist_by_url(url, **dl_kwargs) else: if parts: base_url = url for p in parts: url = base_url + '?p={}'.format(p) dr.print(url) dr.hl() bd.download_by_url(url, **dl_kwargs) else: bd.download_by_url(url, **dl_kwargs)
前沿探索
2020-08-18 03:39:00
我覺(jué)得我學(xué)了 Python 也不會(huì)寫代碼,最近在上極客時(shí)間的 Python 訓(xùn)練營(yíng), 目前在做第一周的作業(yè),無(wú)從下手。 感覺(jué)自己什么都學(xué)不好。只會(huì)修電腦
前沿探索
2020-08-18 03:38:57
目前我已知的類型提示帶來(lái)的好處:- debug 時(shí)的錯(cuò)誤提示,結(jié)合編輯器也會(huì)有注釋提示等 - 提升可讀性、維護(hù)性 - ... (請(qǐng)教大家補(bǔ)充~) 還有就是最近的 web 框架 fastapi, 如果按照 pydantic 的類型提示和數(shù)據(jù)建模的話可以自動(dòng)生成符合 OpenAPI 標(biāo)準(zhǔn)的 swagger 調(diào)試文檔。個(gè)人感覺(jué)這個(gè)還是很有用的。 但是類型提示不是類型聲明,對(duì)提升性能也無(wú)用處,大家覺(jué)得 python 這個(gè)動(dòng)態(tài)語(yǔ)言有必要養(yǎng)成寫類型提示的習(xí)慣嗎? 說(shuō)道可讀性,其實(shí) typing 模塊有些定義的可讀性不是那么一目了然,也需要一定的學(xué)習(xí)成本... 希望聽(tīng)聽(tīng)大家的看法
前沿探索
2020-08-18 03:38:55
hello,小伙伴們,大家好,今天給大家介紹的開(kāi)源項(xiàng)目是: Spider-Crack_Js ,想學(xué)習(xí)爬蟲解密 js 登陸的可以看看這個(gè)開(kāi)源項(xiàng)目,這個(gè)開(kāi)源項(xiàng)目可以給你提供一個(gè)不錯(cuò)的思路。 代碼教程 [ OpenLaw ] 登陸參數(shù)加密過(guò)程分析 [中華英才網(wǎng)] 登陸參數(shù)加密過(guò)程分析 [大眾點(diǎn)評(píng)網(wǎng)] 登陸參數(shù)過(guò)程分析 [新浪微博] 登陸參數(shù)過(guò)程手把手分析
JS 解密案例目錄 JS 解密案例 ├─ openlaw │ ├── openlaw_login.js // JavaScript 解密 demo │ ├── openlaw_login.py // Python 版 demo ├─ 大眾點(diǎn)評(píng)網(wǎng) │ ├── dianping_pwd.js // JavaScript 解密 demo │ ├── dianping_token.js // Token 解密 demo ├─ steam │ ├── steam_pwd.js // JavaScript 解密 demo │ ├── steam_login.py // Python 版 demo ├─ 中華英才網(wǎng) │ ├── chinahr_login.js // JavaScript 解密 demo │ ├── chinahr_login.py // Python 版 demo ├─ 36 氪 │ ├── login.js // JavaScript 解密 demo │ ├── login.py // Python 版 demo ├─ 37 玩 │ ├── sqwan_login.js // JavaScript 解密 demo ├─ 移動(dòng)營(yíng)業(yè)廳 │ ├── yinyeting_login.js // JavaScript 解密 demo ├─ 企名片 │ ├── crad.js // JavaScript 解密 demo │ ├── crad_login.py // Python 版 demo ├─ 咪咕視頻 │ ├── migu_video.js // JavaScript 解密 demo ├─ 當(dāng)樂(lè)網(wǎng) │ ├── danle_login.js // JavaScript 解密 demo ├─ 惠金所 │ ├── huijinsuo.js // JavaScript 解密 demo ├─ 房天下 │ ├── fantianxia.js // JavaScript 解密 demo ├─ 新浪二手房 │ ├── xlesf_login.js // JavaScript 解密 demo ├─ 新浪微博 │ ├── weibo_login.js // JavaScript 解密 demo │ ├── weibo_login.py // Python 版 demo ├─ 易通貸 │ ├── ytd_login.js // JavaScript 解密 demo ├─ 楚楚街 │ ├── chuchujie_login.js // JavaScript 解密 demo ├─ 汽車之家 │ └── autoHome_login.js // JavaScript 解密 demo └─ 芒果 tv └── gmtv_login.js // JavaScript 解密 demo
感興趣的鐵子可以去參考一個(gè)他的思路。
開(kāi)源地址: https://github.com/Bindian9710/Spider-Crack_Js
今天的推薦不知道大家喜不喜歡?如果大家喜歡話,請(qǐng)?jiān)谖恼碌撞苛粞曰螯c(diǎn)贊,以表示對(duì)我的支持,你們的留言,點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注是我持續(xù)更新的動(dòng)力,peace !
關(guān)注公眾號(hào)回復(fù):" 1024 ",免費(fèi)領(lǐng)取一大波學(xué)習(xí)資源,先到先得哦!
前沿探索
2020-08-18 03:38:52
這陣子寫了點(diǎn)爬蟲,目前已順利將目標(biāo)網(wǎng)站數(shù)據(jù)爬下來(lái)?,F(xiàn)在我想要給程序的請(qǐng)求加個(gè) ip 代理池。
初次學(xué)習(xí),產(chǎn)生了兩個(gè)疑惑,可能問(wèn)題太過(guò)小白,因此沒(méi)能在網(wǎng)上找到答案,在此特來(lái)請(qǐng)教下各位大佬。
1 、如果我們使用的 ip 代理池中某個(gè) ip 失效了,requests 請(qǐng)求是否會(huì)自動(dòng)幫我們從 IP 代理池?fù)Q個(gè)新的 ip 重新進(jìn)行請(qǐng)求,還是直接就掛掉?
2 、同個(gè) session 下進(jìn)行有不同的 post 請(qǐng)求,如果前后請(qǐng)求 ip 出現(xiàn)不一樣,是否會(huì)翻車(后面的是否會(huì)請(qǐng)求失?。?
3 、求大佬推薦免費(fèi)的代理池,因?yàn)槟壳爸皇莻€(gè)人學(xué)習(xí)樂(lè)趣,暫不考慮收費(fèi)代理池。
以下是我爬蟲程序的核心代碼: session = requests.Session() proxies = { "http":"http://ip:端口號(hào)" "https":"https://ip:端口號(hào)" } session.get(url, proxies=proxies) session.post(url, data, proxies=proxies) session.close()
前沿探索
2020-08-18 03:38:50
我現(xiàn)在隨便跑一個(gè)測(cè)試都是 7-10s, 哪怕是一個(gè)簡(jiǎn)單的 self.assertEqual(1,1) 也要這么久,因?yàn)閯?chuàng)建數(shù)據(jù)庫(kù)的表和插入數(shù)據(jù)耗時(shí)太長(zhǎng),有什么辦法加速創(chuàng)建的嗎?
前沿探索
2020-08-18 03:38:47
現(xiàn)在獲取到的值是
""
window._xxxx 里面是一個(gè)對(duì)象
我想獲取 window._xxxx 這個(gè)變量,但是在 console 里面直接打印_xxxx 也是可以獲取到值的,所以想請(qǐng)教下如何獲取到這個(gè)值?
我用的是 scrapy 框架,網(wǎng)上有說(shuō)可以用 selenium 可以解決這個(gè)問(wèn)題,還在看。
前沿探索
2020-08-18 03:38:44
寫給 Python 新人:如何更好地在 V2EX 里貼出 Python 代碼?
起因
每位點(diǎn)進(jìn)本帖里來(lái)的朋友當(dāng)然都知道,對(duì)于 Python 來(lái)說(shuō),代碼格式并不是僅僅服務(wù)于可讀性的,而是 Python 的語(yǔ)法。
也正因?yàn)檫@樣,在貼出自己的代碼時(shí),如果不能保真地展示出自己的代碼縮進(jìn),就幾乎不可能讓愿意幫助自己的人方便地復(fù)現(xiàn)自己的問(wèn)題。
可是在瀏覽 Python 節(jié)點(diǎn)時(shí),相信大伙兒也發(fā)現(xiàn)了,無(wú)法合適地貼出自己 Python 代碼的新人朋友們,還是蠻多的。所以我打算在 V2EX 簡(jiǎn)單地科普一下。
希望可以幫助到一些有需要的朋友。
具體方法
具體的方法很簡(jiǎn)單,只需要 3 步,容易學(xué)會(huì)。
第一步:在創(chuàng)建新主題時(shí),在主題文本框的右下角,將文本框的「文本標(biāo)記語(yǔ)法」從 Default 改為 Markdown
第二步:將自己的代碼通過(guò)空格調(diào)整好縮進(jìn),然后包含在 6 個(gè)反引號(hào)正中間即可。反引號(hào)的位置在英文輸入狀態(tài)下 Tab 鍵之上。還有,部分 Markdown 渲染器可以按指定的代碼語(yǔ)言來(lái)染色,只需要將具體的語(yǔ)言寫在前 3 個(gè)反引號(hào)之后即可。
第三步:通過(guò) V2EX 的預(yù)覽功能,檢查自己的代碼有無(wú)達(dá)到自己期待的效果。
情況示例:
```python
Your Code.
```
效果演示: #Version: Python 3 # Date: 2020-06-25 import datetime import re def general_split_url(u): '''Split URL string to a list.\n''' return re.split('[:/.?&=#]',u) def timestamp(): '''Return a nowtime string. eg. 2019-12-10 Tuesday PM 20:33:18 ''' return datetime.datetime.now().strftime("%Y-%m-%d %A %p %H:%M:%S")
寫在最后
如此,便能合適地貼出自己的代碼。當(dāng)然,如果你是一名老鳥,本文也許可以幫到你的地方是:在沒(méi)法三言兩語(yǔ)教會(huì)新人如何貼出合適的代碼時(shí),直接把我的這個(gè)鏈接甩給他。
而如果你自己就是新手,現(xiàn)在就可以創(chuàng)建一個(gè) V2EX 新主題,練習(xí)一下 Markdown 下是如何張貼代碼的。下次再遇到問(wèn)題需要求助時(shí),就能用得上了。
之所以想寫這個(gè)帖子,一是希望幫助一些朋友,二是希望借 V2EX 這個(gè)平臺(tái)認(rèn)識(shí)一些寫 Python 代碼的朋友。
謝謝大家。
kinvv 于 2020 年 6 月 25 日 端午節(jié)
EOF
前沿探索
2020-08-18 03:38:41
搜索結(jié)果頁(yè)包的信息太少了,關(guān)鍵是沒(méi)有下載使用的數(shù)量。
找個(gè)包根本不清楚哪個(gè)最主流。
相比之下 mvnrepository 就很不錯(cuò)
前沿探索
2020-08-18 03:38:39
>>> l = [i for i in range(1,33)]>>> l [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] >>> len(l) 32 >>> l[:31] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] l[:31]不是取后 31 個(gè)嗎?怎么是前 31 個(gè)
前沿探索
2020-08-18 03:38:36
有很多個(gè)學(xué)校,具體就先用一千萬(wàn)吧,每個(gè)學(xué)校有很多個(gè)班級(jí),每個(gè)班有很多組男女生(男女成對(duì)出現(xiàn),男女生數(shù)量相等)。
現(xiàn)在要求每個(gè)班里的男女生的某個(gè)差,比如身高、年齡,只需要知道這里會(huì)有點(diǎn)耗時(shí),最后按班級(jí)吧結(jié)果輸出到文件
要求用 python 實(shí)現(xiàn),對(duì)速度有要求
前沿探索
2020-08-18 03:38:32
系統(tǒng)內(nèi)置了一個(gè) python2
安裝 xcode 的時(shí)候內(nèi)置了 Command Line Tools 其中有 python3.7
后來(lái)安裝 brew 要求必須再單獨(dú)安裝個(gè) Command Line Tools 其中又包含了 python3.7
通過(guò) brew 安裝了一個(gè)軟件 依賴并安裝了 python3.8
想問(wèn)問(wèn) 這些 python 是都創(chuàng)建軟連接了?會(huì)不會(huì)有沖突?
前沿探索
2020-08-18 03:38:29
dropmark flag high low trade_date mark markf1680 1.0 -1.0 113.2499 111.8426 2020-06-12 09:32:00 -1 -1 1708 1.0 1.0 117.7255 117.5454 2020-06-12 10:00:00 1 1 1740 1.0 -1.0 115.7845 115.5778 2020-06-12 10:32:00 -1 -1 1871 1.0 1.0 117.3920 117.3787 2020-06-12 14:13:00 1 1 1954 1.0 -1.0 116.6383 116.2781 2020-06-15 10:06:00 -1 -1 2040 1.0 1.0 120.5869 120.3935 2020-06-15 13:02:00 1 1 2146 1.0 -1.0 118.6593 118.5726 2020-06-15 14:48:00 -1 -1 2251 1.0 1.0 120.1667 120.1534 2020-06-16 11:03:00 1 1 2383 1.0 -1.0 120.2134 120.1600 2020-06-16 14:45:00 -1 -1 2413 1.0 1.0 120.1000 120.0467 2020-06-17 09:45:00 1 1 2465 1.0 -1.0 118.0590 118.0257 2020-06-17 10:37:00 -1 -1 2474 1.0 1.0 118.6660 118.3525 2020-06-17 10:46:00 1 1 2615 1.0 -1.0 117.6321 117.5654 2020-06-17 14:37:00 -1 -1 2629 1.0 1.0 117.9790 117.8255 2020-06-17 14:51:00 1 1 2758 1.0 -1.0 117.4720 117.4187 2020-06-18 11:30:00 -1 -1 2772 1.0 1.0 117.9656 117.9256 2020-06-18 13:14:00 1 1 2869 1.0 -1.0 118.8594 118.8594 2020-06-18 14:51:00 -1 -1 2923 1.0 1.0 122.3211 122.0010 2020-06-19 10:15:00 1 1 2953 1.0 -1.0 118.7927 118.7260 2020-06-19 10:45:00 -1 -1 3063 1.0 1.0 120.4335 120.4268 2020-06-19 14:05:00 1 1 3072 1.0 -1.0 119.8466 119.7265 2020-06-19 14:14:00 -1 -1 3096 1.0 1.0 120.1267 120.0934 2020-06-19 14:38:00 1 1 3151 1.0 -1.0 114.3972 114.2438 2020-06-22 10:03:00 -1 -1 3268 1.0 1.0 118.6793 118.5793 2020-06-22 13:30:00 1 1 3287 1.0 -1.0 117.5254 117.3320 2020-06-22 13:49:00 -1 -1 3343 1.0 1.0 118.0523 117.9656 2020-06-22 14:45:00 1 1 3357 1.0 -1.0 117.4587 117.0585 2020-06-22 14:59:00 -1 -1 3376 1.0 1.0 124.9100 124.5500 2020-06-23 09:48:00 1 1 3434 1.0 -1.0 120.5100 120.5000 2020-06-23 10:46:00 -1 -1 3535 1.0 1.0 121.9800 121.9000 2020-06-23 13:57:00 1 1 3914 1.0 -1.0 115.1000 115.0500 2020-06-29 10:46:00 -1 -1 3972 1.0 1.0 116.1800 115.8500 2020-06-29 13:14:00 1 1 4077 1.0 -1.0 114.2700 114.2600 2020-06-29 14:59:00 -1 -1 4180 1.0 1.0 121.8400 121.6100 2020-06-30 11:12:00 1 1 4209 1.0 -1.0 122.2600 121.8700 2020-06-30 13:11:00 -1 -1 4236 1.0 1.0 123.7000 123.4100 2020-06-30 13:38:00 1 1 4245 1.0 -1.0 122.5500 122.3300 2020-06-30 13:47:00 -1 -1 要求找出是 markf 列值為-1 的值大于下一個(gè)行的 high 列值,用 for 循環(huán)感覺(jué)效率太低了...
前沿探索
2020-08-18 03:38:14
假設(shè)我的數(shù)據(jù)模型: class Book(Model): id = PrimaryKeyField() title = CharField(max_length=64, unique=True) author = CharField(max_length=64) publisher = CharField(max_length=64) price = DecimalField(max_digits=10, decimal_places=2) desc = CharField(max_length=256)
如果我要根據(jù)條件更新的話, 找了很多文檔基本都是:
Book.update({Book.price: 29.9}).where(Book.author == '魯迅')
但外部調(diào)用的話只能提供字段名比如 {'price': 29.9}, {'author': '魯迅'}, 怎樣才能拼出上邊的語(yǔ)句?
前沿探索
2020-08-18 03:38:11
我最近遇到一個(gè)問(wèn)題。我用 python 寫了一個(gè) selenium 爬蟲,自動(dòng)處理一些任務(wù)?,F(xiàn)在放在 4 個(gè) windows 服務(wù)器上,我更新爬蟲文件都是用遠(yuǎn)程桌面連接,將新代碼復(fù)制粘貼進(jìn)去,然后關(guān)閉正在運(yùn)行的爬蟲程序,再打開(kāi)新更換的。 現(xiàn)在還好,以后服務(wù)器多了,這樣手動(dòng)維護(hù)總感覺(jué)不太對(duì)勁。 請(qǐng)教一下有什么好的辦法沒(méi)有?如何能夠自動(dòng)更新代碼并在更新后自動(dòng)重啟爬蟲 python 程序?有什么工具可以使用嗎?謝謝!
前沿探索
2020-08-18 03:38:08
我想要抓取這個(gè)網(wǎng)站的數(shù)據(jù), http://ouhe.aiball365.com/league-center/detail?leagueId=31
每次點(diǎn)擊頁(yè)面的時(shí)候, 后臺(tái)會(huì)看到一個(gè) post 請(qǐng)求, " http://backend.aiball365.com/web/leagueSummaryWeb "
我把 header 和 data 復(fù)制出來(lái), 模擬一個(gè)請(qǐng)求的時(shí)候。 post data 為: {"channel":"web","os":"browser","leagueId":"31","season":"2019-2020","round":2}
這個(gè) round 是根據(jù)比賽輪數(shù)變化的, 因?yàn)槊恳豁?yè)都是一個(gè)新的輪數(shù), 所以也可以認(rèn)為一頁(yè)修改一個(gè) round 值。
我寫的代碼是這樣的 import requests import json url = "http://backend.aiball365.com/web/leagueSummaryWeb" headers = { 'Accept': 'application/json', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7,ja;q=0.6', 'Content-Length': '69', 'Content-Type': 'application/json;charset=utf-8', 'Host': 'backend.aiball365.com', 'Origin': 'http://ouhe.aiball365.com', 'Proxy-Connection': 'keep-alive', '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', } for i in range(1, 3): data = {"channel": "web", "os": "browser", "leagueId": "31", "season": "2019-2020", "round": i} response = requests.get(url, headers=headers, data=json.dumps(data)) with open('{}.txt'.format(i), 'w+', encoding='utf-8') as the_file: the_file.write(response.text)
我這個(gè)代碼應(yīng)該獲取到第一頁(yè)和第二頁(yè)的, 但是我實(shí)際上獲取到的是第 32 頁(yè)的而且兩次獲取的內(nèi)容一樣請(qǐng)問(wèn)是怎么回事?
前沿探索
2020-08-18 03:38:06
對(duì)不起了,我是標(biāo)題黨了
事情是醬紫的,我在使用 selenium 的鼠標(biāo)事件,用了 ActionChains 這個(gè)庫(kù); 該說(shuō)不說(shuō),我有些時(shí)候不能理解 ActionChains 是咋回事; 比如: from selenium.webdriver.common.action_chains import ActionChains actions = ActionChains(browser) actions.move_by_offset(10, 20).click().perform()
比如這樣的代碼,就是鼠標(biāo)的鏈?zhǔn)讲僮髀?移動(dòng)到指定 xy 坐標(biāo),然后點(diǎn)擊,然后執(zhí)行鏈?zhǔn)讲僮鳎?那么問(wèn)題來(lái)了,這個(gè)鼠標(biāo)的移動(dòng)啊,它不能回歸到默認(rèn)的 0,0 的位置啊。 就是我再次執(zhí)行 move_by_offset 的時(shí)候,xy 坐標(biāo)是根據(jù)上次鼠標(biāo)所在的位置繼續(xù)疊加的,這分分鐘就超出瀏覽器范圍了; 根據(jù)各大網(wǎng)資料,得知了這個(gè)鏈?zhǔn)讲僮鞯讓訉?shí)際上是 self._actions.append
就是他的鏈?zhǔn)讲僮骶褪前阉幸獔?zhí)行的東西依次添加到一個(gè)數(shù)組里,然后執(zhí)行;
那么問(wèn)題來(lái)了,如何可以清空鼠標(biāo)位置到 0 的位置呢?我不想每次都在上次移動(dòng)的位置疊加執(zhí)行。 這個(gè)時(shí)候有人就說(shuō)了,你干嘛不試試 move_by_offset(-10, -20) 這樣讓他回歸呢? 嗯,因?yàn)槲也恢?xy 坐標(biāo),所以沒(méi)辦法回歸原來(lái),我就是想讓他每次鼠標(biāo)在左上角,就那么難嗎?
大佬們,你們遇到了嗎?有解決辦法嘛?
前沿探索
2020-08-18 03:38:03
先把最后的問(wèn)題提前:有沒(méi)有減少循環(huán)的方法?圖 A,圖集 B,從 B 中找 A 相似 圖集 B,千萬(wàn)級(jí),數(shù)據(jù)庫(kù),有字節(jié)、CRC32 、以及一些 image hash 數(shù)據(jù)等字段 要實(shí)現(xiàn)上述需求是否只有乖乖的逐個(gè)算?有沒(méi)有偷懶(省點(diǎn)算力)的方法?
前沿探索
2020-08-18 03:38:01
比如 peewee 中 query: Person.select().where(Person.age == 20).order_by(Person.age.desc())
比如 url 傳入的 ?age=20&sort=age_desc, 怎樣通過(guò) 'age' 湊出 Person.age 來(lái)?
前沿探索
2020-08-18 03:37:58
用 requests 獲取一個(gè) json 格式的數(shù)據(jù),之前請(qǐng)求后都可以正常返回 json 字符串;今天突然出錯(cuò)返回 406,意思是服務(wù)器判斷客戶端不支持 json? 406 - Client browser does not accept the MIME type of the requested page The page you are looking for cannot be opened by your browser because it has a file name extension that your browser does not accept
用 chrome 的 F12 看,請(qǐng)求的鏈接 Response 返回 json 數(shù)據(jù)正常
想問(wèn)下如何通過(guò) requests 向服務(wù)器端提供支持 json 的信息?
前沿探索
2020-08-18 03:37:56
原有的代碼是爬蟲,化簡(jiǎn)完代碼是這樣 import asyncio import aiohttp async def worker(): while 1: try: async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=5)) as session: async with session.post('https://www.baidu.com') as r: _ = await r.text() except RuntimeError: break async def main(): await asyncio.wait([worker() for _ in range(100)]) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()
只需要不到 100 個(gè)協(xié)程,cpu 單核就可以 100%,是我對(duì)于協(xié)程有錯(cuò)誤的理解嗎,求指點(diǎn)
前沿探索
2020-08-18 03:37:53
首先說(shuō)一下是 Python 技術(shù)棧,現(xiàn)在需求是有大量的文件不斷生成在一個(gè)目錄下(文件幾 k 到幾百 k 不等,同期數(shù)量約 20W ),想做一個(gè)服務(wù),使得其它服務(wù)來(lái)請(qǐng)求的時(shí)候能快速地取走該文件,并在取走后刪除。
當(dāng)然,最簡(jiǎn)單的做法就是 Tornado/Flask 直接寫個(gè)接口,然后 os.remove 就行,想問(wèn)下大伙兒還有什么高效率的方法來(lái)實(shí)現(xiàn)嗎?
前沿探索
2020-08-18 03:37:50
模塊鏈接: https://docs.python.org/zh-cn/3.8/library/bdb.html#module-bdb
前沿探索
2020-08-18 03:37:48
使用場(chǎng)景: 還有一臺(tái) 5k 顯示器要外接 寫代碼 寫文檔 想學(xué)習(xí)剪輯視頻
前沿探索
2020-08-18 03:37:44
用 airpods 看愛(ài)奇藝 聲音會(huì)變成 hands free 的那種電話語(yǔ)音聲 而不是 stereo 用網(wǎng)頁(yè)端沒(méi)有這個(gè)問(wèn)題 求問(wèn)是 bug 嗎
前沿探索
2020-08-18 03:37:42
手機(jī)放桌子上
開(kāi)著會(huì)呢
突然屏幕亮了
siri 開(kāi)口道:你好,地球上的小東西
不知道怎么喚醒的
頓時(shí)有種科幻片的感覺(jué)
前沿探索
2020-08-18 03:37:39
你們?cè)谑褂弥杏杏X(jué)得觸控板的摩擦力大嗎?我是用久了磨的手指頭不舒服,有什么結(jié)局方案嗎?
前沿探索
2020-08-18 03:37:37
如題。大家平時(shí)用他們的學(xué)習(xí)工作的 app 有哪些?體驗(yàn)如何? 11 寸還是 12.9 ?
前沿探索
2020-08-18 03:37:35
背景
有點(diǎn)閑錢做了點(diǎn)兒小投資,平時(shí)需要偶爾看看基金和大盤指數(shù)行情;
但是蘋果自帶的股票軟件太蛋疼了,不實(shí)時(shí),延遲 15 分鐘,而且還沒(méi)有基金行情;
每次只能打開(kāi)支付寶,各種跳轉(zhuǎn)進(jìn)基金里看自選列表,太麻煩了,還容易被同事看見(jiàn)在摸魚;
其他軟件又要裝還要開(kāi)賬戶,迫于自身需求,只好自己動(dòng)手了,想來(lái)想去還是 alfred 插件最方便;
好了,不多說(shuō)了,直接上干貨,代碼很簡(jiǎn)單,直接扒的新浪財(cái)經(jīng)數(shù)據(jù),應(yīng)該還是比較準(zhǔn)確的;
項(xiàng)目地址
https://github.com/marsmay/chinaFinance
點(diǎn)這里下載打包好的插件, 插件下載 。
股票基金代碼 滬市股票 : sh 前綴加 6 位數(shù)字代碼,如 上證指數(shù) sh000001 ; 深市股票 : sz 前綴加 6 位數(shù)字代碼,如 深圳成指 sz399001 ; 開(kāi)放式基金 : fu 前綴加 6 位數(shù)字代碼,如 易方達(dá)滬深 300ETF 聯(lián)接 C fu007339 ;
列表維護(hù)指令 添加股票、基金到自選列表: fin add code ,例如: fin add sh000001 ; 刪除股票、基金到自選列表: fin del code ,例如: fin del sh000001 ; 清空自選列表: fin clean
查詢指令 查詢指定股票、基金行情: fin code ,例如: fin sh000001 ;
查詢自選列表行情: fin
前沿探索
2020-08-18 03:37:32
本打算使用 PS4 手柄連 steam 打游戲的...steam 大屏狀態(tài)下手柄可以使用,但是進(jìn)游戲就不行 steam 控制器設(shè)置那里設(shè)置過(guò)了,而且可以測(cè)試震動(dòng)和燈光調(diào)節(jié) 游戲本身是支持手柄的,官方提示手柄體驗(yàn)更好 steam 有提示更新驅(qū)動(dòng),但是總是更新失敗 Mac mini 和 mbp 都試過(guò)(系統(tǒng)分別為 bigsur 和 Catalina ),都不行 哎...哭了哭了
前沿探索
2020-08-18 03:37:30
這才 7 號(hào)早上,10 號(hào)都滿了?
前沿探索
2020-08-18 03:37:27
前幾天看到小米 10 推出至尊紀(jì)念版,看到那個(gè) 120W 的充電器,忽然感覺(jué)眼睛都綠了。 MacBook Pro 16 峰值功耗超過(guò) 100W 了,而且原配的太大太重也不方便,目前市面上不好找替代產(chǎn)品, 于是決定想等著開(kāi)售后,收一個(gè) 120W 充電器給 MacBook Pro 16 充電,試試。
想提前先問(wèn)問(wèn),MacBook Pro 的雷電接口有最大功率( PD100W )的限制嗎? 有沒(méi)有決定買小米 10 至尊紀(jì)念版的老哥,試一下,能 120W 輸出供給 MacBook Pro 16 嗎? 謝謝
前沿探索
2020-08-18 03:37:24