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

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

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

科技資訊

科技學(xué)院

科技百科

科技書籍

網(wǎng)站大全

軟件大全

最近需要用為 Python 項(xiàng)目寫文檔,但是 Sphinx 官方文檔看的我云里霧里,各位能否推薦一個(gè)易懂的教程?
最好是手把手一步步的那種。
前沿探索
2020-08-21 08:05:29
建立表的時(shí)候是使用了 django 的 model 來建立表,數(shù)據(jù)庫選擇 sqlite3 anum = models.CharField(max_length=50, default='') # 但是在 sql 語句插入的時(shí)候卻報(bào)了一個(gè)錯(cuò), # sqlite3.IntegrityError: NOT NULL constraint failed: table.anum # 但是在建表的時(shí)候不是設(shè)置了默認(rèn)值么, 為什么還是需要 anum 這個(gè)字段,另外, 使用 mysql 插入數(shù)據(jù)的時(shí)候不會(huì)報(bào)這個(gè)錯(cuò)誤, 難道非要加個(gè) null=True 么, 另外使用 sqlite3 時(shí)候加上 null=True 如果 insert 的時(shí)候不傳值就會(huì)默認(rèn)為 null,default 的值就會(huì)沒用了,那么應(yīng)該怎么解決呢
前沿探索
2020-08-21 08:05:22
準(zhǔn)備找工作了,先花點(diǎn)時(shí)間刷些面試題吧。謝謝分享,可以是鏈接,可以是文件。附 QQ 郵箱:119 。189 。[email?protected] 忽略掉中間多余的符號。
前沿探索
2020-08-21 08:05:03
miniforge 由 conda-forge 在幾個(gè)月前開始開發(fā),相當(dāng)于一個(gè)把 conda-forge 作為默認(rèn) channel 的 miniconda 。 我的直觀感受是它在 solving environments 的時(shí)候比 anaconda/miniconda 快多了。 另一個(gè)好處是 miniforge 支持 aarch64,樹莓派 4B 用戶的福音,未來 ARM Mac 也能用。 conda-forge 是社區(qū),和 anaconda 是個(gè)公司不一樣,miniforge 會(huì)優(yōu)先開發(fā)大家需要的東西。
前沿探索
2020-08-21 08:04:56
按照文檔上 pyautogui 快捷鍵代碼為 pyautogui.hotkey('command', 'r') 但是不知道為何我的電腦上 command 沒有點(diǎn)擊,只執(zhí)行了 r 變?yōu)榱溯敵鑫谋?目前處理方式為,手動(dòng)模擬快捷鍵 for arg in args: pyautogui.keyDown(arg) for arg in args: pyautogui.keyUp(arg)
但是很多時(shí)候有快捷鍵無效的情況
前沿探索
2020-08-21 08:04:50
需求:同一局域網(wǎng)目標(biāo)服務(wù)器 Mac 名是 tommac,用戶 tom,ip:192.168.50.4,本地服務(wù)器 Mac 名是 jasonmac,用戶 jason.需要把 /Users/tom/Documents/working/purchase.xlsx 復(fù)制到 /Users/jasonmac/Documents/working
嘗試了 pysmb 和 paramiko 兩個(gè)庫
前者報(bào) not connected,后者報(bào) Error reading SSH protocol banner.總之就是各種連接不上目標(biāo)服務(wù)器.(確認(rèn)目標(biāo)服務(wù)器已經(jīng)打開共享,并且在網(wǎng)絡(luò)里可以訪問) 同時(shí)我也有點(diǎn)搞不清楚,mac 的計(jì)算機(jī)名到底應(yīng)該是 jason 這種,還是 jason.local,似乎嘗試了也都錯(cuò).端口不管是官網(wǎng)范例的 139,還是很多人用的 445 都不行.
stackoverflow 上看了好半天都研究不出,有沒有熟悉的朋友說下可能的原因?或者推薦下自己熟悉的庫 預(yù)先感謝大家!
下面是 pysmb 時(shí)候的一段代碼(import 部分忽略)
share_name = "jason" user_name = "jason" password = "57777" local_machine_name = "tommac" server_machine_name = "jasonmac" server_ip = "192.168.50.4"
conn = SMBConnection(user_name, password, local_machine_name, server_machine_name, use_ntlm_v2=True) assert conn.connect(server_ip, 139) print('connected')
file_obj = tempfile.NamedTemporaryFile() file_name = file_obj.name file_attributes, copysize = conn.retrieveFile(share_name, "/Documents/working/purchase.xlsx", file_obj) print(copysize) file_obj.close() shutil.copy(file_name, "/Users/tom/Documents/working/purchase.xlsx") conn.close()
前沿探索
2020-08-21 08:04:44
def loggingDecorator(func): """記錄日志的裝飾器"""
def wrapperLogging(*args, **kwargs): logging.info("開始執(zhí)行 %s() ..." % func.__name__) func(*args, **kwargs) logging.info("%s() 執(zhí)行完成!" % func.__name__) return wrapperLogging
def showInfo(*args, **kwargs): print("這是一個(gè)測試函數(shù),參數(shù):", args, kwargs)
decoratedShowInfo = loggingDecorator(showInfo)
decoratedShowInfo('arg1', 'arg2', kwarg1=1, kwarg2=2)
我期待的結(jié)果是:
INFO:root:開始執(zhí)行 showInfo() ...
這是一個(gè)測試函數(shù),參數(shù): ('arg1', 'arg2') {'kwarg1': 1, 'kwarg2': 2}
INFO:root:showInfo() 執(zhí)行完成!
但實(shí)際結(jié)果是:
這是一個(gè)測試函數(shù),參數(shù): ('arg1', 'arg2') {'kwarg1': 1, 'kwarg2': 2}
INFO:root:開始執(zhí)行 showInfo() ...
INFO:root:showInfo() 執(zhí)行完成!
或者:
INFO:root:開始執(zhí)行 showInfo() ...
INFO:root:showInfo() 執(zhí)行完成!
這是一個(gè)測試函數(shù),參數(shù): ('arg1', 'arg2') {'kwarg1': 1, 'kwarg2': 2}
請問各位這是為何啊
前沿探索
2020-08-21 08:04:32
Mac 下跑 Python,調(diào)用 gsheets 庫
相關(guān)的 Google Drive 和 Google Sheets API 都已經(jīng) Enable, 下載了 client_secret.json,
運(yùn)行相關(guān) Python 程序, 且登錄相關(guān)頁面后,完成驗(yàn)證,顯示 The authentication flow has completed.
但 terminal 提示 ConnectionResetError: [Errno 54] Connection reset by peer
網(wǎng)上有搜索到可能和 OpenSSL 有關(guān),但不確定.這個(gè)是被和諧的意思嗎? 系統(tǒng)是 Catalina,還需要手動(dòng)升級 OpenSSL 嗎?
前沿探索
2020-08-21 08:04:23
標(biāo)題是抖音里一個(gè)推廣 Python 課程的視頻宣傳語。
我想利用暑假學(xué)習(xí)計(jì)算機(jī)語言,從什么開始學(xué)起比較好呢?另外,我是一個(gè)文科生。
前沿探索
2020-08-21 08:04:09
先上代碼 from concurrent.futures import ThreadPoolExecutor import time from loguru import logger def func1(x): time.sleep(2) return x def func2(): my = [] exe = ThreadPoolExecutor() for r in exe.map(func1,range(10)): my.append(r) exe.shutdown() logger.info(my) def func3(): exe = ThreadPoolExecutor(1) exe.submit(func2) # 這里我想先返回 1,然后異步執(zhí)行函數(shù) haha2,但是我如果設(shè)置了 wait 為 False 的話 haha2 就不會(huì)執(zhí)行, # 不設(shè)置的話得等到 haha2 執(zhí)行完畢才能返回 1,我該怎么做 exe.shutdown(wait=False) return 1 if __name__ == '__main__': res = func3() print(res)
我現(xiàn)在的需求是有三個(gè)函數(shù),函數(shù) 2 中會(huì)使用 ThreadPoolExecutor 去執(zhí)行函數(shù) 1(為了提升效率),函數(shù) 3 中會(huì)執(zhí)行函數(shù) 2 并返回一個(gè)值,但是我想函數(shù) 3 先返回值就給一個(gè) ThreadPoolExecutor(1)并且設(shè)置 wait 為 False,但是這樣函數(shù) 2 并沒有執(zhí)行,請問我該如何實(shí)現(xiàn)我得目的。。。還是說 ThreadPoolExecutor 不適用這種場景,那么我應(yīng)該怎么辦呢
前沿探索
2020-08-21 08:04:03
1 、win10 里面如何寫爬蟲的定時(shí)任務(wù)?沒想過定時(shí)任務(wù)這塊不太懂 2 、每次爬取出來的數(shù)據(jù),有重復(fù)的,用的是 mysql 數(shù)據(jù)庫,如何更好的解決這個(gè)問題? 暫時(shí)想到的兩個(gè)方法,一個(gè)是定時(shí)清除重復(fù)數(shù)據(jù),另外一種是顯示最新的那條數(shù)據(jù)
前沿探索
2020-08-21 08:03:43
CSS 文件類似: https://pastebin.com/QVdRQzPJ
想要提取 Class 值和對應(yīng) font-family 值,以及 font-family 值和對應(yīng) Url 。試了下使用 cssutils 庫只能提取到 font-family 值,無法獲得 Class 值。
請問還有什么別的方法嗎 sheet = cssutils.parseString(cssText) for rule in sheet: for property in rule.style: print(property.name) print(property.value)
前沿探索
2020-08-21 08:03:30
機(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-21 08:03:23
問題
使用 python manage.py runserver 正常啟動(dòng),使用 django-admin 出錯(cuò)。查看 manage.py 中也是用的'Bill.settings',參考了 overflow 加了命令的參數(shù)還是不行,請教大家到底啥原因,如何解決
錯(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-21 08:03:17
you-get 單單作為 B 站(嗶哩嗶哩、 bilibili.com )視頻下載器還湊合,但是大小問題卻不少: 當(dāng)前 PyPI 上的版本尚不支持 4K 視頻流(這個(gè)早晚會(huì)得到正式更新) 某些視頻的大會(huì)員 1080P+或 1080P60 畫質(zhì)無法正常獲取(這個(gè) Bug 不知道開發(fā)者會(huì)不會(huì)重視) 默認(rèn)下載文件名不包括 av 號 BV 號 UP 主用戶名(這是個(gè)人需求,但目前版本無法實(shí)現(xiàn)) 默認(rèn)的文件名長度限制有點(diǎn)短,某些視頻的分 p 子標(biāo)題很長,會(huì)被截?cái)?
想等正式版修 Bug 加功能遙遙無期,只能著手魔改。雖然還有很多其他的同類工具,然而…… B 站移動(dòng)端 APP 離線緩存后,還要從設(shè)備導(dǎo)出,轉(zhuǎn)換格式,多了兩個(gè)環(huán)節(jié),費(fèi)時(shí)費(fèi)力,做不到隨時(shí)隨地,而且離線緩存下來的是 AVC 編碼,文件體積比 HEVC 大得多 jijidown 則是圖形界面,操作流程無法批量化,任務(wù)稍多,鼠標(biāo)點(diǎn)的人想死的心都有,而且如果沒搞錯(cuò)的話,jijidown 同樣不支持 HEVC youtube-dl 里面的 B 站模塊年久失修,不僅大會(huì)員的畫質(zhì)無法通過 cookies 獲取,而且 HEVC 格式也不支持,4K 就沒更戲了 annie 還湊合但是目前它不抓 HEVC 而且也不支持自定義格式的下載文件名
(合著我看中 you-get 的點(diǎn)主要就是 HEVC ?)
好煩,不過好在還有 you-get 。you-get 的毛病最少,而且 you-get 是 python 寫的?!斑@個(gè)我能改,而且這個(gè)工作量最小(大概)”,我心里這樣嘀咕道。
然而 you-get 的軟件框架實(shí)在談不上合理,比較亂,模塊間耦合太重,負(fù)責(zé)實(shí)際工作的方法函數(shù)的代碼普遍太長(動(dòng)不動(dòng)三四百行一個(gè)方法函數(shù),明明還可以細(xì)分的)。
這就導(dǎo)致對象層面的 Monkey Patch 實(shí)現(xiàn)起來很不劃算——我總不能為了改一個(gè)三四百行代碼的函數(shù),就另外寫一個(gè)三四百行的函數(shù),然后這倆的區(qū)別無非只有那么幾行?
最好既保持原版模塊的文件不變,同時(shí)將其中的源碼導(dǎo)入內(nèi)存,修改之,再將修改后的源碼轉(zhuǎn)換成新的模塊,并按照原版模塊的路徑替換掉原版模塊。
即,在 main.py 中調(diào)用 xxx,并且改變 xxx 中的部分代碼(可能是一段,可能是一行,可能只是幾個(gè)詞),但是 xxx.py 這個(gè)文件并沒有被動(dòng)手腳。
這其實(shí)也是一種 Monkey Patch,因?yàn)椴粫?huì)改變原版文件。
實(shí)現(xiàn)這個(gè)功能的函數(shù)很簡單(這個(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ù)很簡單,幾個(gè)步驟很清楚,我很懶,所以不細(xì)說了。
但是用起來,還是有一些訣竅的。這主要取決于場景,如果只是單純替換一個(gè)源代碼不長的小模塊,直接調(diào)用函數(shù)就好了;但如果原模塊代碼很長,需要精確定位替換,或者模塊間相互調(diào)用的關(guān)系比較復(fù)雜,或者模塊路徑很深卻又被淺層模塊調(diào)用……遇到等等這類情況的時(shí)候,還是需要多多思考多多嘗試,具體問題具體分析的。
個(gè)中過程一概不表,只分享最終方案,我懶。
算了,方案也省略,直接上代碼,我好懶,代碼里額外加了注釋作為概述: # 下面這個(gè)函數(shù)用于修改 you-get 的 B 站下載模塊`you_get.extractors.bilibili`的源碼 def code_modify_you_get_bilibili(x: str): # `x`是輸入的源代碼字符串,就是原模塊的代碼,直接對其進(jìn)行替換,以此修改源代碼的文本 # 這里用的方法是在要替換的代碼的上下文找到特征明顯的一段,然后直接 replace # 下面是給尚未支持 B 站 4K 的當(dāng)前版本,加上 4K 相關(guān)的視頻流信息 # 其實(shí)就是在原來的 dict 對象中加了一項(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 不需要判斷,所以沒有) 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 號][BV 號][上傳者用戶名] 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 對相當(dāng)多的 B 站視頻無法獲取大會(huì)員的 1080P+、1080P60 等格式 # 原版這里的邏輯有問題,按下面這樣修改后,用到現(xiàn)在沒發(fā)現(xiàn)異常 # 究竟是什么原因?我沒有徹底搞明白,但肯定與原版代碼中`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ì),但用的格式名稱比較長,不如數(shù)字 ID 本身來得方便 # 所以加了一個(gè)`del_unwanted_dash_streams()`,用數(shù)字來指定最高畫質(zhì)和需要下載的畫質(zhì) # (其實(shí)加這個(gè)方法,還是因?yàn)?Bug 修得不徹底,權(quán)宜之計(jì)罷了) # 順便一提,這個(gè)`del_unwanted_dash_streams`方法不是原版 you-get 代碼里自帶的 # 而是在新的`YouGetBilibiliX`類里自定義的方法 # 而`YouGetBilibiliX`則是繼承的魔改版`bilibili.Bilibili` # 替換原版代碼 -> 調(diào)用一個(gè)原版沒有的方法 -> 魔改版 -> 繼承魔改版的新類 -> 在新類中補(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ì)把文件名里面的方括號替換成圓括號 # 魔改版不需要這個(gè)特性,所以將這兩行代碼加#注釋掉了 x = x.replace("ord('['): '(',", "#ord('['): '(',") x = x.replace("ord(']'): ')',", "#ord(']'): ')',") # 下面把最大文件名字符串長度從 80 延長到 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` # 對 python,此時(shí)原版的`you_get`及其下級子路徑都已經(jīng)注冊在模塊名空間中了 # 在此基礎(chǔ)上,下面一行代碼將模塊名空間中的原版的`you_get.util.fs`替換成經(jīng)過修改的新模塊 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 開頭的字符串或者整形數(shù),將之變成 B 站視頻的 av 嗯號或者 BV 號 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 # 更新視頻頁面的 HTML 文檔(超長字符串) 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 號 BV 號 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 號][BV 號] 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-21 08:03:13
我覺得我學(xué)了 Python 也不會(huì)寫代碼,最近在上極客時(shí)間的 Python 訓(xùn)練營, 目前在做第一周的作業(yè),無從下手。 感覺自己什么都學(xué)不好。只會(huì)修電腦
前沿探索
2020-08-21 08:03:02
目前我已知的類型提示帶來的好處:- debug 時(shí)的錯(cuò)誤提示,結(jié)合編輯器也會(huì)有注釋提示等 - 提升可讀性、維護(hù)性 - ... (請教大家補(bǔ)充~) 還有就是最近的 web 框架 fastapi, 如果按照 pydantic 的類型提示和數(shù)據(jù)建模的話可以自動(dòng)生成符合 OpenAPI 標(biāo)準(zhǔn)的 swagger 調(diào)試文檔。個(gè)人感覺這個(gè)還是很有用的。 但是類型提示不是類型聲明,對提升性能也無用處,大家覺得 python 這個(gè)動(dòng)態(tài)語言有必要養(yǎng)成寫類型提示的習(xí)慣嗎? 說道可讀性,其實(shí) typing 模塊有些定義的可讀性不是那么一目了然,也需要一定的學(xué)習(xí)成本... 希望聽聽大家的看法
前沿探索
2020-08-21 08:02:56
hello,小伙伴們,大家好,今天給大家介紹的開源項(xiàng)目是: Spider-Crack_Js ,想學(xué)習(xí)爬蟲解密 js 登陸的可以看看這個(gè)開源項(xiàng)目,這個(gè)開源項(xiàng)目可以給你提供一個(gè)不錯(cuò)的思路。 代碼教程 [ OpenLaw ] 登陸參數(shù)加密過程分析 [中華英才網(wǎng)] 登陸參數(shù)加密過程分析 [大眾點(diǎn)評網(wǎng)] 登陸參數(shù)過程分析 [新浪微博] 登陸參數(shù)過程手把手分析
JS 解密案例目錄 JS 解密案例 ├─ openlaw │ ├── openlaw_login.js // JavaScript 解密 demo │ ├── openlaw_login.py // Python 版 demo ├─ 大眾點(diǎn)評網(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è)廳 │ ├── yinyeting_login.js // JavaScript 解密 demo ├─ 企名片 │ ├── crad.js // JavaScript 解密 demo │ ├── crad_login.py // Python 版 demo ├─ 咪咕視頻 │ ├── migu_video.js // JavaScript 解密 demo ├─ 當(dāng)樂網(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è)他的思路。
開源地址: https://github.com/Bindian9710/Spider-Crack_Js
今天的推薦不知道大家喜不喜歡?如果大家喜歡話,請?jiān)谖恼碌撞苛粞曰螯c(diǎn)贊,以表示對我的支持,你們的留言,點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注是我持續(xù)更新的動(dòng)力,peace !
關(guān)注公眾號回復(fù):" 1024 ",免費(fèi)領(lǐng)取一大波學(xué)習(xí)資源,先到先得哦!
前沿探索
2020-08-21 08:02:49
最近把以前不會(huì)弄多進(jìn)程時(shí)候,寫的單進(jìn)程的 python 程序,修改成用 concurrent 模塊,使用多進(jìn)程去運(yùn)行。。。有個(gè)這樣的場景沒有辦法解決: 把封裝好的函數(shù)(假如函數(shù)叫 executFunc())交給 futures.ProcessPoolExecutor()去執(zhí)行,事實(shí)上發(fā)生了嚴(yán)重超時(shí),超過了 1000 秒,想去結(jié)束它,發(fā)現(xiàn)沒有辦法在主程序流程上,在外部把這個(gè)進(jìn)程所產(chǎn)生的系統(tǒng)進(jìn)程結(jié)束( concurrent 沒有這樣的方法,只能默認(rèn)一直等?),futures.Future()的.running(),一直返回 Ture 假如 executFunc()創(chuàng)建了 4 個(gè) chrome.exe ,如果把系統(tǒng)中的 chrome.exe 全 kill 了,又會(huì)影響到其它的進(jìn)程。。。。 請問各位高手,遇到這樣的情況,應(yīng)該如何處理? 或者有什么其它的模塊更好面對這樣的問題? executFunc() 是可以小修改一下 time.clock - startTime > 1000,然后就做些事情的。。。。
前沿探索
2020-08-21 08:02:05
前提是假設(shè)了這個(gè)字典的 key 和 vlaue,包括嵌套內(nèi)再 N 層嵌套的,都是 String 類型。。。
根據(jù)字典 k,v,sqlalchemy 做自動(dòng)建臨時(shí)表,效率開銷會(huì)非常大,而且嵌套再嵌套 N 層的,建表存儲(chǔ)很麻煩。。。
整個(gè)字典轉(zhuǎn)成 String 存進(jìn) TEXT ? 取出來再轉(zhuǎn)成 dict,量多的話,干起來會(huì)不會(huì)不利索? 想存進(jìn)去就是一個(gè)字段內(nèi)容,
取出來輕輕松松,不用太啰嗦處理,就是一個(gè) dict 這樣子?
是否有輕輕松松很好的方式?
前沿探索
2020-08-21 08:01:59
hello,小伙伴們,大家好,今天給大家分享的開源項(xiàng)目是: Python-crawler-tutorial-starts-from-zero ,這個(gè)開源項(xiàng)目主要寫是分布式爬蟲從零到一,感興趣的小伙伴可以閱讀一下。
目錄

我分享過很多關(guān)于 Python 爬蟲入門到精通的開源項(xiàng)目,每個(gè)作者的側(cè)重點(diǎn)都不一樣,感興趣的小伙伴可以翻閱一下歷史文章,希望可以給你提供一個(gè)不錯(cuò)的選擇。
開源地址: https://github.com/Kr1s77/Python-crawler-tutorial-starts-from-zero
今天的推薦不知道大家喜歡嗎?如果你們喜歡話,請?jiān)谖恼碌撞苛粞曰螯c(diǎn)贊,以表示對我的支持,你們的留言,點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注是我持續(xù)更新的動(dòng)力哦!
關(guān)注公眾號回復(fù):" 1024 ",免費(fèi)領(lǐng)取一大波學(xué)習(xí)資源,先到先得哦!
前沿探索
2020-08-21 08:01:51
比如我有一個(gè)測試類,第一個(gè) case 會(huì)購買一個(gè)商品,產(chǎn)生一個(gè)訂單號,然后下一個(gè) case 會(huì)用到,那么第二個(gè) case 要如何獲取這個(gè)訂單號呢
前沿探索
2020-08-21 08:01:44
hello,小伙伴們,大家好,今天給大家推薦的開源項(xiàng)目是: Restore-JS ,這個(gè)開源項(xiàng)目主要是做 Python 反爬蟲的,如: 發(fā)布 JS 破解,App 協(xié)議分析,Xposed 和 Frida 教程 做爬蟲方向的小伙伴可以了解一下,這個(gè)開源項(xiàng)目才剛剛起步,以后會(huì)一直更新,感興趣的小伙伴可以持續(xù)關(guān)注?。。?
項(xiàng)目目錄


感興趣的小伙伴可以長期關(guān)注,加油你可以的?。?!
開源地址: https://github.com/LoseNine/Restore-JS
今天的推薦不知道大家喜歡嗎?如果你們喜歡話,請?jiān)谖恼碌撞苛粞曰螯c(diǎn)贊,以表示對我的支持,你們的留言,點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注是我持續(xù)更新的動(dòng)力哦!
關(guān)注公眾號回復(fù):" 1024 ",免費(fèi)領(lǐng)取一大波學(xué)習(xí)資源,先到先得哦!
前沿探索
2020-08-21 08:01:34
GitHub:Python 爬蟲逆向 JS 經(jīng)驗(yàn)
hello,小伙伴們,大家好,今天給大家分享的開源項(xiàng)目是: Review_Reverse ,這個(gè)開源項(xiàng)目是由 Python 語言編寫的關(guān)于 JS 逆向 的相關(guān)項(xiàng)目,想了解關(guān)于如何做好 JS 逆向 , JS 反爬蟲 的同學(xué)可以 clone 一下這個(gè)開源項(xiàng)目,做一個(gè)參考,說不定可以給你提供一些意向不到的思路。
??目錄


感興趣的小伙伴可以嘗試一下,種好一棵樹??最好的時(shí)間是十年前,其次就是現(xiàn)在。
開源地址: https://github.com/lateautumn4lin/Review_Reverse
今天的推薦不知道大家喜歡嗎?如果你們喜歡話,請?jiān)谖恼碌撞苛粞曰螯c(diǎn)贊,以表示對我的支持,你們的留言,點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注是我持續(xù)更新的動(dòng)力哦!
關(guān)注公眾號回復(fù):" 1024 ",免費(fèi)領(lǐng)取一大波學(xué)習(xí)資源,先到先得哦!
前沿探索
2020-08-21 08:01:27
用 Python 操作 Appium 滑動(dòng)小紅書,大概能滑動(dòng)個(gè)幾十次,然后幾分鐘后,屏幕就不動(dòng)了。真機(jī)調(diào)試。Appium 就出錯(cuò),顯示 ESOCKETTIMEDOUT,具體信息如下: [WD Proxy] Got response with unknown status: {"code":"ESOCKETTIMEDOUT","connect":false} [W3C (ddaa6dba)] Encountered internal error running command: UnknownError: An unknown server-side error occurred while processing the command. Original error: Could not proxy command to remote server. Original error: Error: ESOCKETTIMEDOUT [W3C (ddaa6dba)] at JWProxy.command (/Applications/ Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-base-driver/lib/jsonwp-proxy/proxy.js:266:13 )我最開始以為是手機(jī)端電源管理,殺掉了 Appium 進(jìn)程,但把所有電源的東西都放開以后,沒有變化。請問有啥解決辦法嗎?
前沿探索
2020-08-21 08:01:18
我以前都是 pip download 下來之后一個(gè)個(gè)手動(dòng)安裝, 今天直接試了一下 pip install * 發(fā)現(xiàn)只有在聯(lián)網(wǎng)情況下直接安裝, 但是在斷網(wǎng)安裝有的包的時(shí)候會(huì)直接報(bào)錯(cuò), 比如說以下包 ['aiocontextvars-0.2.2-py2.py3-none-any.whl', 'argparse-1.4.0-py2.py3-none-any.whl', 'certifi-2020.6.20-py2.py3-none-any.whl', 'chardet-3.0.4-py2.py3-none-any.whl', 'contextvars-2.4.tar.gz', 'EasyProcess-0.3-py2.py3-none-any.whl', 'entrypoint2-0.2.1-py2.py3-none-any.whl', 'idna-2.10-py2.py3-none-any.whl', 'immutables-0.14-cp36-cp36m-manylinux1_x86_64.whl', 'jeepney-0.4.3-py3-none-any.whl', 'loguru-0.5.1-py3-none-any.whl', 'MouseInfo-0.1.3.tar.gz', 'mss-5.1.0-py3-none-any.whl', 'numpy-1.19.0-cp36-cp36m-manylinux2010_x86_64.whl', 'opencv_python-3.4.0.14-cp36-cp36m-manylinux1_x86_64.whl', 'Pillow-7.2.0-cp36-cp36m-manylinux1_x86_64.whl', 'PyAutoGUI-0.9.50.tar.gz', 'PyGetWindow-0.0.8.tar.gz', 'PyMsgBox-1.0.8.tar.gz', 'PyMySQL-0.9.3-py2.py3-none-any.whl', 'pyperclip-1.8.0.tar.gz', 'PyRect-0.1.4.tar.gz', 'pyscreenshot-2.2-py2.py3-none-any.whl', 'PyScreeze-0.1.26.tar.gz', 'python3-xlib-0.15.tar.gz', 'PyTweening-1.0.3.zip', 'requests-2.24.0-py2.py3-none-any.whl', 'selenium-3.141.0-py2.py3-none-any.whl', 'SQLAlchemy-1.3.18-cp36-cp36m-manylinux2010_x86_64.whl', 'threadpool-1.3.2-py3-none-any.whl', 'urllib3-1.25.9-py2.py3-none-any.whl']
斷網(wǎng)安裝 PyMsgBox 的時(shí)候還是會(huì)連接 pypi, 導(dǎo)致報(bào)錯(cuò)。
那么, 對于大量本地包應(yīng)該怎么快速安裝呢?
前沿探索
2020-08-21 08:01:13
我就有比較強(qiáng)的潔癖 要求實(shí)習(xí)生寫 python 不符合 pep8 直接 close PR. 要求團(tuán)隊(duì)內(nèi)部統(tǒng)一代碼風(fēng)格, 用拼音或者風(fēng)格不一致的我會(huì)揪出來重點(diǎn)批評, 復(fù)雜一點(diǎn)的函數(shù)逼每個(gè)人都寫文檔 并且隨改隨更新.
今天上午又因?yàn)橐粋€(gè)實(shí)習(xí)生使用 git add * , 結(jié)果加進(jìn)來一大堆臨時(shí)文件發(fā)火了...感覺其他人都不理解自己好累...
前沿探索
2020-08-21 08:01:05
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)感覺效率太低了...
前沿探索
2020-08-21 08:00:58
我最近遇到一個(gè)問題。我用 python 寫了一個(gè) selenium 爬蟲,自動(dòng)處理一些任務(wù)。現(xiàn)在放在 4 個(gè) windows 服務(wù)器上,我更新爬蟲文件都是用遠(yuǎn)程桌面連接,將新代碼復(fù)制粘貼進(jìn)去,然后關(guān)閉正在運(yùn)行的爬蟲程序,再打開新更換的。 現(xiàn)在還好,以后服務(wù)器多了,這樣手動(dòng)維護(hù)總感覺不太對勁。 請教一下有什么好的辦法沒有?如何能夠自動(dòng)更新代碼并在更新后自動(dòng)重啟爬蟲 python 程序?有什么工具可以使用嗎?謝謝!
前沿探索
2020-08-21 08:00:44
我想要抓取這個(gè)網(wǎng)站的數(shù)據(jù), http://ouhe.aiball365.com/league-center/detail?leagueId=31
每次點(diǎn)擊頁面的時(shí)候, 后臺(tái)會(huì)看到一個(gè) post 請求, " http://backend.aiball365.com/web/leagueSummaryWeb "
我把 header 和 data 復(fù)制出來, 模擬一個(gè)請求的時(shí)候。 post data 為: {"channel":"web","os":"browser","leagueId":"31","season":"2019-2020","round":2}
這個(gè) round 是根據(jù)比賽輪數(shù)變化的, 因?yàn)槊恳豁摱际且粋€(gè)新的輪數(shù), 所以也可以認(rèn)為一頁修改一個(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)該獲取到第一頁和第二頁的, 但是我實(shí)際上獲取到的是第 32 頁的而且兩次獲取的內(nèi)容一樣請問是怎么回事?
前沿探索
2020-08-21 08:00:37
對不起了,我是標(biāo)題黨了
事情是醬紫的,我在使用 selenium 的鼠標(biāo)事件,用了 ActionChains 這個(gè)庫; 該說不說,我有些時(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)讲僮鳎?那么問題來了,這個(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í)行;
那么問題來了,如何可以清空鼠標(biāo)位置到 0 的位置呢?我不想每次都在上次移動(dòng)的位置疊加執(zhí)行。 這個(gè)時(shí)候有人就說了,你干嘛不試試 move_by_offset(-10, -20) 這樣讓他回歸呢? 嗯,因?yàn)槲也恢?xy 坐標(biāo),所以沒辦法回歸原來,我就是想讓他每次鼠標(biāo)在左上角,就那么難嗎?
大佬們,你們遇到了嗎?有解決辦法嘛?
前沿探索
2020-08-21 08:00:30
先把最后的問題提前:有沒有減少循環(huán)的方法?圖 A,圖集 B,從 B 中找 A 相似 圖集 B,千萬級,數(shù)據(jù)庫,有字節(jié)、CRC32 、以及一些 image hash 數(shù)據(jù)等字段 要實(shí)現(xiàn)上述需求是否只有乖乖的逐個(gè)算?有沒有偷懶(省點(diǎn)算力)的方法?
前沿探索
2020-08-21 08:00:21
比如 peewee 中 query: Person.select().where(Person.age == 20).order_by(Person.age.desc())
比如 url 傳入的 ?age=20&sort=age_desc, 怎樣通過 'age' 湊出 Person.age 來?
前沿探索
2020-08-21 08:00:15
用 requests 獲取一個(gè) json 格式的數(shù)據(jù),之前請求后都可以正常返回 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 看,請求的鏈接 Response 返回 json 數(shù)據(jù)正常
想問下如何通過 requests 向服務(wù)器端提供支持 json 的信息?
前沿探索
2020-08-21 08:00:10
原有的代碼是爬蟲,化簡完代碼是這樣 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%,是我對于協(xié)程有錯(cuò)誤的理解嗎,求指點(diǎn)
前沿探索
2020-08-21 08:00:05
首先說一下是 Python 技術(shù)棧,現(xiàn)在需求是有大量的文件不斷生成在一個(gè)目錄下(文件幾 k 到幾百 k 不等,同期數(shù)量約 20W ),想做一個(gè)服務(wù),使得其它服務(wù)來請求的時(shí)候能快速地取走該文件,并在取走后刪除。
當(dāng)然,最簡單的做法就是 Tornado/Flask 直接寫個(gè)接口,然后 os.remove 就行,想問下大伙兒還有什么高效率的方法來實(shí)現(xiàn)嗎?
前沿探索
2020-08-21 07:59:57
新人,現(xiàn)在是因?yàn)镚oogle App Engine才學(xué)習(xí)Python,實(shí)在不熟悉Python系統(tǒng)對象。故此有疑問請教各位大大: 假設(shè)我的應(yīng)用可以通過aaa.com和bbb.com這2個(gè)域名訪問(即:綁定了2個(gè)域名), 我該怎么獲取當(dāng)前域名(就是用戶當(dāng)前訪問的是哪個(gè)域名)?
前沿探索
2020-08-21 07:59:39
貌似我每次改完代碼之后都要 Ctrl-C 然后再次 python my_app.py 才能讓代碼生效,改了 tpl 也是。難道 Tornado 不能像 App Engine SDK 那樣自動(dòng)讀取新代碼?
前沿探索
2020-08-21 07:59:28
我想嘗試tornado, 但它需要pycurl支持, 悲劇的是在我的雪豹下死活搞不定, 最后都是import pycurl出錯(cuò), 不知道誰有過成功安裝的經(jīng)驗(yàn)? 謝謝!
前沿探索
2020-08-21 07:59:22
github:https://github.com/liuxu0315/download_nvshen_so 執(zhí)行:$ python nvshen_so.py 用了多線程, 8 條線程,在 /tmp 下生成 nvshen_so/01 等文件夾并下載到相應(yīng)的目錄。 里面有 2 行代碼被注釋掉了,它們是配套的,用來下載 2014/12/下的圖片,有幾百張。 現(xiàn)在有個(gè)問題,我的程序無法一次全部下載完,總是漏一點(diǎn),要么是執(zhí)行一段時(shí)間后就卡死不動(dòng)了不知道是什么原因。。 當(dāng)然下載圖片前有判斷是否有該文件,可以重復(fù)執(zhí)行下載程序,不過這個(gè)治標(biāo)沒治本。。
前沿探索
2020-08-21 07:59:00