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

數(shù)據(jù)專(zhuān)欄

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

科技資訊

科技學(xué)院

科技百科

科技書(shū)籍

網(wǎng)站大全

軟件大全

DataFrame 有點(diǎn)像 Excel 的表還有點(diǎn)像 SQL 中的表,但是其功能和二者差別又不小。如果要像不熟悉 Python 的人介紹 DataFrame, 該給它取個(gè)什么名字呢?最好比較形象生動(dòng)又能體現(xiàn) DataFrame 的主要特征。數(shù)據(jù)陣列式怎么樣?
前沿探索
2020-08-21 08:11:00
如何讓 scrapy 抓取完成之后的結(jié)果返回到 shell 窗口;
我想實(shí)現(xiàn)的是,a 用戶發(fā)起一個(gè)抓取請(qǐng)求,后端接收到請(qǐng)求,調(diào)起 scrapy 進(jìn)行抓取,然后返回?cái)?shù)據(jù)到 a 用戶那。。
我想問(wèn)一下,這個(gè)結(jié)構(gòu),如何實(shí)現(xiàn)?
我所知道的,大概就僅僅是用命令運(yùn)行爬蟲(chóng),然后存入庫(kù)。。然而我并不想讓他存庫(kù)。我想讓他把結(jié)果返回出去。。
那如果我使用 python 的 subprocess 執(zhí)行命令,獲取 shell 的返回值,然后返給 a 用戶,你們覺(jué)得這樣是可行的嗎?
前沿探索
2020-08-21 08:10:46
hello,小伙伴們大家好,今天給大家推薦的開(kāi)源項(xiàng)目是: fake-useragent ,這個(gè)開(kāi)源項(xiàng)目對(duì)搞爬蟲(chóng)的業(yè)務(wù)的人來(lái)說(shuō)是一個(gè)福利,不用去自己搭建自己的 UA 池,只需要調(diào)用對(duì)應(yīng)的方法即可,簡(jiǎn)單易用,感興趣的小伙伴不妨去下載嘗試一下。
使用方法 from fake_useragent import UserAgent ua = UserAgent() ua.ie # Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US); ua.msie # Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)' ua['Internet Explorer'] # Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US) ua.opera # Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11 ua.chrome # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2' ua.google # Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13 ua['google chrome'] # Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11 ua.firefox # Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1 ua.ff # Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1 ua.safari # Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25 # and the best one, random via real world browser usage statistic ua.random # Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
筆記
fake-useragent 將收集的數(shù)據(jù)存儲(chǔ)在您的操作系統(tǒng)臨時(shí)目錄中,例如 /tmp
如果您只想更新保存的數(shù)據(jù)庫(kù): from fake_useragent import UserAgent ua = UserAgent() ua.update()
如果您不想緩存數(shù)據(jù)庫(kù)或沒(méi)有可寫(xiě)文件系統(tǒng): from fake_useragent import UserAgent ua = UserAgent(cache=False)
有時(shí), useragentstring.com 或 w3schools.com 更改其 html 或向下更改,在這種情況下,fake-useragent 使用 heroku 后備
如果您不想使用托管的緩存服務(wù)器(添加了 0.1.5 版) from fake_useragent import UserAgent ua = UserAgent(use_cache_server=False)
在極少數(shù)情況下,如果托管的緩存服務(wù)器和源不可用,fake-useragent 將無(wú)法下載數(shù)據(jù):(添加了 0.1.3 版) from fake_useragent import UserAgent ua = UserAgent() # Traceback (most recent call last): # ... # fake_useragent.errors.FakeUserAgentError # You can catch it via from fake_useragent import FakeUserAgentError try: ua = UserAgent() except FakeUserAgentError: pass
如果您嘗試獲取未知的瀏覽器:(版本 0.1.3 已更改) from fake_useragent import UserAgent ua = UserAgent() ua.best_browser # Traceback (most recent call last): # ... # fake_useragent.errors.FakeUserAgentError
您可以通過(guò)添加來(lái)完全禁用任何煩人的異常 fallback:(添加了 0.1.4 版) import fake_useragent ua = fake_useragent.UserAgent(fallback='Your favorite Browser') # in case if something went wrong, one more time it is REALLY!!! rare case ua.random == 'Your favorite Browser'
要控制數(shù)據(jù)文件的位置嗎?(添加了 0.1.4 版) import fake_useragent # I am STRONGLY!!! recommend to use version suffix location = '/home/user/fake_useragent%s.json' % fake_useragent.VERSION ua = fake_useragent.UserAgent(path=location) ua.randoms
如果需要保護(hù)某些屬性,以免__getattr__使用方法在 UserAgent 中覆蓋某些屬性,則可以在 safe_attrs 此處傳遞屬性名稱。至少這將防止您在找不到屬性時(shí)引發(fā) FakeUserAgentError 。
例如,將 fake_useragent 與注入配合使用時(shí),您需要: import fake_useragent ua = fake_useragent.UserAgent(safe_attrs=('__injections__',))
請(qǐng)不要使用,如果您不明白為什么需要它。這在極少數(shù)情況下是不可思議的。
遇到問(wèn)題???
確保您使用的是最新版本! pip install -U fake-useragent
通過(guò) python 控制臺(tái)檢查版本:(添加了 0.1.4 版) import fake_useragent print(fake_useragent.VERSION)
安裝 pip install fake-useragent
開(kāi)源地址: https://github.com/hellysmile/fake-useragent
今天的推薦不知道大家喜歡嗎?如果你們喜歡話,請(qǐng)?jiān)谖恼碌撞苛粞曰螯c(diǎn)贊,以表示對(duì)我的支持,你們的留言,點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注是我持續(xù)更新的動(dòng)力哦!
關(guān)注公眾號(hào)回復(fù):" 1024 ",免費(fèi)領(lǐng)取一大波學(xué)習(xí)資源,先到先得哦!
前沿探索
2020-08-21 08:10:32
有一部分是我們自己的。有些是其他人同類(lèi)產(chǎn)品的。要求提取資料后整合成表格,以便分類(lèi)分析。 需要附帶產(chǎn)品鏈接。 通過(guò)關(guān)鍵詞提取。 要求:公司名稱,聯(lián)系人,地址,電話,郵件,產(chǎn)品鏈接,售價(jià)。
前沿探索
2020-08-21 08:10:22
剛學(xué) python,學(xué)校發(fā)了成績(jī)?cè)诓樵兙W(wǎng)站上,想把全校的成績(jī)爬下來(lái),分析完網(wǎng)頁(yè)后寫(xiě)了好多次代碼都不行,網(wǎng)頁(yè)如下
查詢頁(yè)面
結(jié)果頁(yè)面
查詢頁(yè)面點(diǎn)擊確定后觸發(fā) js 函數(shù)發(fā)送 POST 請(qǐng)求,驗(yàn)證信息正確就用 location.href 跳轉(zhuǎn)到結(jié)果頁(yè)面,整個(gè)過(guò)程貌似是用 cookie 里的 PHPSESSID 來(lái)記錄信息的(結(jié)果頁(yè)面會(huì)檢測(cè) header 里的 Referer ),這個(gè)用 requests 怎么實(shí)現(xiàn)呢?
前沿探索
2020-08-21 08:10:13
需求是將多個(gè)文件分別或合并處理,再按需求導(dǎo)出到 excel 的不同 sheet 。計(jì)算過(guò)程還好,速度挺快的,但導(dǎo)出 Excel 的時(shí)候就很慢,想加個(gè)進(jìn)度條,有了解的 v 友嗎?
目前是用 pd.ExcelWriter 將文件導(dǎo)出。嘗試了 tqdm,但好像只支持對(duì) pandas 計(jì)算過(guò)程直接上進(jìn)度條,試了一下 Dask 的 ProgresBar 好像也不行。
前沿探索
2020-08-21 08:10:06
我是 Quick Cut https://v2ex.com/t/693041 的 Mac 打包測(cè)試者
Github
現(xiàn)在用的打包方法是用 py2app
但是目前無(wú)法打包出的軟件無(wú)法在 Mac Big Sur 運(yùn)行(低版本可以)
并且有 609MB,不適合安裝和分發(fā)(能用了,可以體驗(yàn)體驗(yàn))
https://cloud.189.cn/t/f2ErUreInI7b (訪問(wèn)碼:2spp )
請(qǐng)問(wèn)有什么方法能縮小體積嗎?
或者有什么其他工具推薦?
謝謝各位
前沿探索
2020-08-21 08:09:58
本地 python requests 直接抓這個(gè)網(wǎng)址的內(nèi)容是 ok 的, 我從快代理上買(mǎi)了代理再用 requests 抓就不行, 但是我用 selenium 加上代理是可以看到這個(gè)網(wǎng)頁(yè)的, 于是我先用 selenium 加代理打開(kāi)網(wǎng)頁(yè), 然后把 requests headers(包括 cookies) 復(fù)制出來(lái)(就是從開(kāi)發(fā)者模式復(fù)制出來(lái)), 再用 request 還是不行, requests 抓到的頁(yè)面需要驗(yàn)證, 但是如果不使用代理, 直接用我本機(jī)的 ip, requests 使用 selenium + 代理 獲取到的 requests header 使用 也是成功的。 請(qǐng)問(wèn)這樣的問(wèn)題應(yīng)該如何解決, 為什么 selenium 沒(méi)有被禁, 但是 request 使用同樣的 headers + 代理就不行, 除了 request header 里面的信息, 服務(wù)器是什么邏輯判斷我的 request 是爬蟲(chóng)的
https://www.amazon.co.uk/s?k=dress&ref=nb_sb_noss
前沿探索
2020-08-21 08:09:53
最近剛剛開(kāi)始學(xué)習(xí) Tornado 框架,也在熟悉公司的后端源碼。不過(guò)公司的 web 搭建時(shí)是前后端分離的,不太能理解后端的路由信息表示什么含義。譬如以下這行代碼 routes = [(r"/message", MessageHandler)] application = tornado.web.Application(routes, **settings)
我想知道其中的 /message 句柄是如何被匹配的呢?
有這樣問(wèn)題的原因是:在我看的視頻和文字教程中,這里的匹配式都是與瀏覽器訪問(wèn)的 url 相關(guān)聯(lián)的。但是在瀏覽器訪問(wèn)公司網(wǎng)址時(shí),并不會(huì)輸入這樣一種格式的 url 。
因?yàn)槲业哪康氖窍胫涝谠L問(wèn)一個(gè)頁(yè)面的過(guò)程中,調(diào)用了哪些 handler 進(jìn)行處理。所以這樣一下子就不知道該如何入手了,特來(lái)向大家請(qǐng)教~
前沿探索
2020-08-21 08:09:47
文章如下所示 我想提取文章中的代理機(jī)構(gòu),中標(biāo)機(jī)構(gòu) ,項(xiàng)目名稱等信息 有沒(méi)有好用的分析方法或者好用的庫(kù)
‘’‘ 山東省煙臺(tái)市蓬萊市蓬萊市教育和體育局電器設(shè)備采購(gòu)項(xiàng)目成交公告 一、采購(gòu)人:蓬萊市教育和體育局 地址:蓬萊市海市路 177 號(hào)(蓬萊市教育和體育局) 聯(lián)系方式:0535-5647984(蓬萊市教育和體育局) 采購(gòu)代理機(jī)構(gòu):山東金諾建設(shè)項(xiàng)目管理有限公司煙臺(tái)分公司 地址:山東省煙臺(tái)市萊山縣(區(qū))迎春大街 177 號(hào)潤(rùn)華大廈 1 號(hào)樓 1703a 聯(lián)系方式:0535-6905395 二、采購(gòu)項(xiàng)目名稱:山東省煙臺(tái)市蓬萊市蓬萊市教育和體育局電器設(shè)備采購(gòu)項(xiàng)目 采購(gòu)項(xiàng)目編號(hào)(采購(gòu)計(jì)劃編號(hào)):SDGP370684202002000108 三、公告發(fā)布日期:2020 年 7 月 21 日四、成交日期:2020 年 7 月 27 日五、采購(gòu)方式:競(jìng)爭(zhēng)性談判六、成交情況: 標(biāo)包 貨物服務(wù)名稱 供應(yīng)商名稱 地址 成交結(jié)果 A 山東省煙臺(tái)市蓬萊市蓬萊市教育和體育局電器設(shè)備采購(gòu)項(xiàng)目 山東新華書(shū)店集團(tuán)有限公司 山東省濟(jì)南市市中區(qū)英雄山路 189 號(hào) 15.28 萬(wàn)元 七、采購(gòu)小組成員名單:標(biāo)包 A:譚莉、劉青志、景仕壯八、公告期限:2020 年 7 月 29 日 至 2020 年 7 月 29 日九、采購(gòu)項(xiàng)目聯(lián)系方式: 聯(lián)系人:張婷婷 聯(lián)系方式:0535-6905395 十一、未中標(biāo)(成交)供應(yīng)商的未中標(biāo)(成交)原因:1 、蓬萊渤海電子科技有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) 2 、蓬萊市遠(yuǎn)望電腦網(wǎng)絡(luò)工程有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) 3 、煙臺(tái)雅瑞商貿(mào)有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) 4 、煙臺(tái)鐘金商貿(mào)有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) 5 、龍口軍浩辦公設(shè)備有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) ’‘’
前沿探索
2020-08-21 08:09:41
比如說(shuō)我一次創(chuàng)建 10 個(gè)線程,當(dāng)我想關(guān)閉(滿足條件的)其中一個(gè)線程時(shí),如何關(guān)閉,而不影響其他 9 個(gè)線程的運(yùn)行
前沿探索
2020-08-21 08:09:27
抓取的網(wǎng)址:https://leetcode-cn.com/problemset/all/?topicSlugs=greedy response.xpath("http://*[@id="question-app"]/div/div[2]/div[2]/div[2]/table/tbody[1]/tr")的結(jié)果為空。請(qǐng)教各位大佬,問(wèn)題出在了哪里呢?
前沿探索
2020-08-21 08:09:21
如題: str 對(duì)象,統(tǒng)一的 Unicode 字符串
有興趣的童鞋歡迎一起組隊(duì)研究,這樣更容易堅(jiān)持下去……
前沿探索
2020-08-21 08:09:15
射擊訓(xùn)練,需要給每個(gè)士兵發(fā)子彈,發(fā)子彈的個(gè)數(shù)規(guī)則是根據(jù)士兵的訓(xùn)練成績(jī)給定的,傳入士兵的訓(xùn)練成績(jī),要求 相鄰士兵中,成績(jī)好的士兵的子彈數(shù)必須更多,每個(gè)士兵至少分配一個(gè)子彈。
輸入描述:
輸入每個(gè)士兵的訓(xùn)練成績(jī),如 1,2,3,代表 3 位士兵的成績(jī)分別為 1,2,3
輸出描述:
最少分配的子彈數(shù)
示例 1:
輸入:1,2,2
輸出:4
前沿探索
2020-08-21 08:09:08
很簡(jiǎn)單的問(wèn)題,難住我了,就是想在同一行里面去匹配多個(gè)字符串,但是死活報(bào)錯(cuò),代碼如下:import re text = '曾經(jīng)有一份經(jīng)典的愛(ài)情' keyword = '愛(ài)情' exlude_keyword = re.search('愛(ài)情'|'承諾', text, re.I) print(exlude_keyword) 報(bào)錯(cuò): Traceback (most recent call last): File "C:/Users/scndwg/Documents/Viya/aml8.1/AutoFiles/aml/ zzz.py ", line 6, in exlude_keyword = re.search('愛(ài)情'|'承諾', text, re.I) TypeError: unsupported operand type(s) for |: 'str' and 'str'
前沿探索
2020-08-21 08:09:01
老哥們,我用的是 pyinstaller 打包成 exe 單文件后程序調(diào)用的模塊好像沒(méi)有效果 用 freeze 打包后本機(jī)可以運(yùn)行所有功能,換電腦運(yùn)行提示無(wú)相關(guān)環(huán)境(提示環(huán)境還是相關(guān)原電腦的絕對(duì)路徑) 但是我已經(jīng)打包了所有依賴
前沿探索
2020-08-21 08:08:55
今年剛畢業(yè)入職一家小公司,主要用 Python 開(kāi)發(fā) API 。之前我都是用 Django 和 DRF,工作之后公司的項(xiàng)目全是異步的...以后的項(xiàng)目也都用 fastapi 了,現(xiàn)在異步、asgi 在 Python 越來(lái)越火了嗎
前沿探索
2020-08-21 08:08:46
本來(lái)是不會(huì)想要分享發(fā)出來(lái)的。
但是因?yàn)樵?comment 區(qū)發(fā)了解法,然后有人問(wèn)解釋一下這行代碼,所以就解釋了一下。
本著解釋都解釋了,敲了那么多行字,所以不如分享出來(lái)給更多的人看到。
(the)Problem
[問(wèn)題] :Leetcode#1470. Shuffle the Array
[描述] :
給你一個(gè)數(shù)組 nums,數(shù)組中有 2n 個(gè)元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。
請(qǐng)你將數(shù)組按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的數(shù)組。
示例 1: 輸入:nums = [2,5,1,3,4,7], n = 3 輸出:[2,3,5,4,1,7] 解釋?zhuān)河捎?x1=2, x2=5, x3=1, y1=3, y2=4, y3=7,所以答案為 [2,3,5,4,1,7]
示例 2:N/A
示例 3: 輸入:nums = [1,1,2,2], n = 2 輸出:[1,2,1,2]
[提示] : 1 <= n <= 500 nums.length == 2n 1 <= nums[i] <= 10^3
來(lái)源:力扣( LeetCode ) 鏈接: https://leetcode-cn.com/problems/shuffle-the-array 著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
Solution
我的一行解法: class Solution: def shuffle(self, nums: List[int], n: int) -> List[int]: return reduce(add, zip(nums[:n], nums[n:]))
解釋
對(duì)這一行代碼的 explain:
https://leetcode.com/problems/shuffle-the-array/discuss/751957/Python-one-line-(Memory-Usage-less-then-100.00):-the-more-pythonic-way/629230
前沿探索
2020-08-21 08:08:34
背景:從 java 轉(zhuǎn) python 的初學(xué)者我想實(shí)現(xiàn)的目的是: 在這三個(gè)方法中可以怎樣選擇性執(zhí)行 one() or two() or three()? 我百度了下,可以創(chuàng)建測(cè)試類(lèi),但是它會(huì)輸出一個(gè)測(cè)試報(bào)告,且會(huì)進(jìn)行斷言,而我的目的不是進(jìn)行單元測(cè)試,是要在一個(gè) py 文件里單獨(dú)執(zhí)行不同的方法 還可以在 pycharm 里使用 shift+alt+e 執(zhí)行代碼片段,但是我會(huì)些一些邏輯在里面,還有 import,這個(gè)方法也不行 對(duì)比 java,有 junit 可以實(shí)現(xiàn): 可以分別執(zhí)行這三個(gè)方法,那么輪子眾多的 python 也一定有相應(yīng)的方法才對(duì),只是我沒(méi)有找到,所以請(qǐng)教各位,我可以怎么做?
前沿探索
2020-08-21 08:08:28
公司打算自己做一個(gè)圖像識(shí)別的東西 ,用顯卡計(jì)算
但是圖像比較大,希望能減少計(jì)算時(shí)間
有沒(méi)有做過(guò)的大佬推薦下,怎么搭配顯卡最好
前沿探索
2020-08-21 08:08:16
功能很簡(jiǎn)單,就是用戶通過(guò)表單 'POST' 提交用戶名,然后根據(jù)用戶名生成一個(gè)用戶頭像的 portrait.png 的 圖片返回。 方式一:是把已經(jīng)生成好的頭像圖片,返回給頁(yè)面,圖片可以正常顯示,也可以另存。 def generate_portrait(): user_img = Image.open('portrait.png') out = BytesIO() user_img.save(out, 'PNG') out.seek(0) return send_file(out, mimetype='image/png') 方式二:如果是用戶通過(guò)表單提交用戶名,生成 portrait.png 之后,立即返回給頁(yè)面。在頁(yè)面上,圖片可以顯示,但是無(wú)法保存(要么提示網(wǎng)絡(luò)錯(cuò)誤,要么保存到硬盤(pán)也打不開(kāi)) def generate_portrait(): form = PortraitForm() if form.validate_on_submit(): ... some code to generate portrait.png and save to local disk ... user_img = Image.open('portrait.png') out = BytesIO() user_img.save(out, 'PNG') out.seek(0) return send_file(out, mimetype='image/png') ....
看起來(lái)方式一、和方式二并沒(méi)有大的區(qū)別,方式二我也把 portrait.png 先落盤(pán)存到磁盤(pán)上,再讀取返回,也不行。
方式一是把圖片生成和返回在 2 個(gè) request 里完成的,方式二就是在 1 個(gè) request 里同時(shí)“生成”圖片并“返回”圖片
這個(gè)問(wèn)題搜了不少地方,都沒(méi)有看到類(lèi)似的問(wèn)題和解決方法。不清楚問(wèn)題到底處在哪兒了
前沿探索
2020-08-21 08:08:10
去年這個(gè)時(shí)候開(kāi)始的想法,獨(dú)立開(kāi)發(fā)了一年,期間在公司的一些項(xiàng)目里也用上了?,F(xiàn)在感覺(jué)可以見(jiàn)人了,歡迎大家來(lái)使用 & 噴我代碼,也歡迎 ISSUE/PR ??。
https://github.com/abersheeran/index.py
我開(kāi)始開(kāi)發(fā) Index.py 的時(shí)候就一個(gè)目的——不想再去折騰路由。然后才逐漸增加功能。
功能和 FastAPI 高度重合,開(kāi)發(fā)也幾乎是同一時(shí)期……但我兩肯定沒(méi)抄對(duì)方的,我相信它的作者看不懂中文文檔,我英文也挺菜的,FastAPI 沒(méi)火之前我壓根不知道還有人在弄類(lèi)似的項(xiàng)目。
不過(guò)大型項(xiàng)目肯定我比它快,因?yàn)槲覍ふ衣酚墒?O(1),其他基于 starlette 的框架都是 O(n)。說(shuō)實(shí)話,Python 社區(qū)的 web 框架,路由系統(tǒng)全部用的遍歷,不知道咋想的。我以前一直以為大家都是前綴樹(shù)……
總之??希望大家有空來(lái)用用。
前沿探索
2020-08-21 08:08:03
查了一下 Stack Overflow 問(wèn)題可能在 ssl 上, 但是改了還是不行。 import asyncio import requests import time import json import random import aiohttp from ori_async import get_proxy list_url = 'https://www.amazon.co.uk/s?k=dress&ref=nb_sb_noss' product_url = 'https://www.amazon.co.uk/AUSELILY-Womens-Sleeve-Pleated-Pockets/dp/B082W811L3/ref=sr_1_1_sspa?dchild=1&keywords=dress&qid=1596264150&s=clothing&sr=1-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzTEpRR0NLRlhQMFFDJmVuY3J5cHRlZElkPUEwMDY5Nzg5MkZTUllZWTM3VFVIQiZlbmNyeXB0ZWRBZElkPUEwOTU0NzQ1MTE0QzhFV0w0SjJOMCZ3aWRnZXROYW1lPXNwX2F0ZiZhY3Rpb249Y2xpY2tSZWRpcmVjdCZkb05vdExvZ0NsaWNrPXRydWU=' baidu_url = 'https://www.baidu.com' headers = { "authority": "www.amazon.co.uk", "method": "GET", "path": "/s?k=dress&i=clothing&ref=nb_sb_noss", "scheme": "https", "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": "zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7,ja;q=0.6,zh-TW;q=0.5", "cache-control": "max-age=0", "cookie": "session-id=258-7467381-0898317; i18n-prefs=GBP; ubid-acbuk=262-6045121-6110346; x-wl-uid=13CgqXYwZCFN3okL9HYQm7Iyt8Md2S5Dj4uA/dwKZrgtM0V8Ii0/OTO/AbtTOSRVzmlpbyCfIvZw=; session-token=\"K1UgAkfjQLKORhX6CN0AXXcRycoGecW5zqC3Nk8y/0rr7ZHQPpm5kzjT0YPAY/M8vVOWYNXoWCDYhSbrXyHP/bnNILWcLd2I+04dfUASNtpMHQkTh2YNffN748Rd9HxMQ6wFjVkDsfhgbm/YgEQ5uy8H+qWM1i9z+8uePKVL1BfVQtQpOEFxLQK+1GRQHBfdt7urN81Bkg0WjHz3pOVR31pILIjf3aM1nhncWG1P/A93yPpUOBTFeMh5/6V4RrddfHGn4uifWdg=\"; session-id-time=2082758401l; csm-hit=tb:3GP38DER2C68WEEPMTK8+s-KCAYBB85E78WBDWP92X7|1595834228498&t:1595834228498&adb:adblk_yes", "downlink": "9.75", "ect": "4g", "rtt": "200", "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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4181.9 Safari/537.36" } url = list_url # proxies = get_proxy() async def main(): connector = aiohttp.TCPConnector(ssl=False) async with aiohttp.ClientSession(connector=connector) as session: async with session.get(url, headers=data["headers"]) as resp: print(resp.status) content = await resp.text() print(len(content)) start = time.time() loop = asyncio.get_event_loop() loop.run_until_complete(main()) end = time.time() print('spend time is {}'.format(end - start)) # response = requests.get(url, headers=headers, proxies=proxies, timeout=8, verify=False) response = requests.get(url, headers=headers, timeout=8, verify=False) print("length is {}".format(len(response.text)))
前沿探索
2020-08-21 08:07:54
PyLongObject 頭部信息是一個(gè) PyVarObject,PyObject 能訪問(wèn)到引用次數(shù)和類(lèi)型信息,那 PyObject 能不能訪問(wèn)到 PyLongObject 所維護(hù)的真實(shí) int 值
前沿探索
2020-08-21 08:07:46
‘’‘ 山東省煙臺(tái)市蓬萊市蓬萊市教育和體育局電器設(shè)備采購(gòu)項(xiàng)目成交公告 一、采購(gòu)人:蓬萊市教育和體育局 地址:蓬萊市海市路 177 號(hào)(蓬萊市教育和體育局) 聯(lián)系方式:0535-5647984(蓬萊市教育和體育局) 采購(gòu)代理機(jī)構(gòu):山東金諾建設(shè)項(xiàng)目管理有限公司煙臺(tái)分公司 地址:山東省煙臺(tái)市萊山縣(區(qū))迎春大街 177 號(hào)潤(rùn)華大廈 1 號(hào)樓 1703a 聯(lián)系方式:0535-6905395 二、采購(gòu)項(xiàng)目名稱:山東省煙臺(tái)市蓬萊市蓬萊市教育和體育局電器設(shè)備采購(gòu)項(xiàng)目 采購(gòu)項(xiàng)目編號(hào)(采購(gòu)計(jì)劃編號(hào)):SDGP370684202002000108 三、公告發(fā)布日期:2020 年 7 月 21 日四、成交日期:2020 年 7 月 27 日五、采購(gòu)方式:競(jìng)爭(zhēng)性談判六、成交情況: 標(biāo)包 貨物服務(wù)名稱 供應(yīng)商名稱 地址 成交結(jié)果 A 山東省煙臺(tái)市蓬萊市蓬萊市教育和體育局電器設(shè)備采購(gòu)項(xiàng)目 山東新華書(shū)店集團(tuán)有限公司 山東省濟(jì)南市市中區(qū)英雄山路 189 號(hào) 15.28 萬(wàn)元 七、采購(gòu)小組成員名單:標(biāo)包 A:譚莉、劉青志、景仕壯八、公告期限:2020 年 7 月 29 日 至 2020 年 7 月 29 日九、采購(gòu)項(xiàng)目聯(lián)系方式: 聯(lián)系人:張婷婷 聯(lián)系方式:0535-6905395 十一、未中標(biāo)(成交)供應(yīng)商的未中標(biāo)(成交)原因:1 、蓬萊渤海電子科技有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) 2 、蓬萊市遠(yuǎn)望電腦網(wǎng)絡(luò)工程有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) 3 、煙臺(tái)雅瑞商貿(mào)有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) 4 、煙臺(tái)鐘金商貿(mào)有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) 5 、龍口軍浩辦公設(shè)備有限公司:評(píng)審得分較低(其他情形本項(xiàng)目采用最低評(píng)標(biāo)價(jià)法,報(bào)價(jià)高導(dǎo)致未中標(biāo)) ’‘’
文章如上所示 我想提取文章中的代理機(jī)構(gòu),中標(biāo)機(jī)構(gòu) ,項(xiàng)目名稱等信息 有沒(méi)有好用的分析方法或者好用的庫(kù)
前沿探索
2020-08-21 08:07:36
我根據(jù)指引文檔的例子創(chuàng)建了一個(gè)表使用以下的類(lèi),想讓表增加行時(shí),當(dāng)給 name 賦值中文字符串時(shí)出現(xiàn)類(lèi)型出錯(cuò)的提示,我想知道用什么類(lèi)型才能支持中文。 class Particle(IsDescription): name = StringCol(itemsize=16) # 16-character string
前沿探索
2020-08-21 08:07:22
分享一篇文章:
在 C/C++/Java 等等語(yǔ)言中,整型變量的自增或自減操作是標(biāo)配,它們又可分為前綴操作(++i 和 --i )與后綴操作( i++ 和 i--),彼此存在著一些細(xì)微差別,各有不同的用途。
這些語(yǔ)言的使用者在接觸 Python 時(shí),可能會(huì)疑惑為什么它不提供 ++ 或 -- 的操作呢?在我前不久發(fā)的《 Python 的十萬(wàn)個(gè)為什么? 》里,就有不少同學(xué)在調(diào)查問(wèn)卷中表示了對(duì)此話題感興趣。
Python 中雖然可能出現(xiàn) ++i 這種前綴形式的寫(xiě)法,但是它并沒(méi)有“++”自增操作符,此處只是兩個(gè)“+”(正數(shù)符號(hào))的疊加而已,至于后綴形式的“++”,則完全不支持( SyntaxError: invalid syntax )。
本期“ Python 為什么 ”欄目,我們將會(huì)從兩個(gè)主要的角度來(lái)回答: Python 為什么不支持 i++ 自增語(yǔ)法? ( PS:此處自增指代“自增和自減”,下同)
首先,Python 當(dāng)然可以實(shí)現(xiàn)自增效果,即寫(xiě)成 i += 1 或者 i = i + 1 ,這在其它語(yǔ)言中也是通用的。
雖然 Python 在底層用了不同的魔術(shù)方法( __add__() 和 __iadd__() )來(lái)完成計(jì)算,但表面上的效果完全相同。
所以,我們的問(wèn)題可以轉(zhuǎn)化成: 為什么上面的兩種寫(xiě)法會(huì)勝過(guò) i++,成為 Python 的最終選擇呢?
1 、Python 的整數(shù)是不可變類(lèi)型
當(dāng)我們定義 i = 1000 時(shí),不同語(yǔ)言會(huì)作出不同的處理: C 之類(lèi)的語(yǔ)言(寫(xiě)法 int i = 1000 )會(huì)申請(qǐng)一塊內(nèi)存空間,并給它“綁定”一個(gè)固定的名稱 i,同時(shí)寫(xiě)入一個(gè)可變的值 1000 。在這里,i 的地址以及類(lèi)型是固定的,而值是可變的(在一定的表示范圍內(nèi)) Python (寫(xiě)法 i = 1000 )也會(huì)申請(qǐng)一塊內(nèi)存空間,但是它會(huì)“綁定”給數(shù)字 1000,即這個(gè) 1000 的地址以及類(lèi)型是固定的( immutable ),至于 i,只是一個(gè)名稱標(biāo)簽貼在 1000 上,自身沒(méi)有固定的地址和類(lèi)型
所以當(dāng)我們令 i “自增”時(shí)( i = i + 1 ),它們的處理是不同的: C 之類(lèi)的語(yǔ)言先找到 i 的地址上存的數(shù)值,然后令它加 1,操作后新的數(shù)值就取代了舊的數(shù)值 Python 的操作過(guò)程是把 i 指向的數(shù)字加 1,然后把結(jié)果綁定到新申請(qǐng)的一塊內(nèi)存空間,再把名稱標(biāo)簽 i “貼”到新的數(shù)字上。新舊數(shù)字可以同時(shí)存在,不是取代關(guān)系
打一個(gè)不太恰當(dāng)?shù)谋确剑篊 中的 i 就像一個(gè)宿主,數(shù)字 1000 寄生在它上面;而 Python 中的 1000 像個(gè)宿主,名稱 i 寄生在它上面。C 中的 i 與 Python 中的 1000,它們則寄生在底層的內(nèi)存空間上……
還可以這樣理解: C 中的變量 i 是一等公民,數(shù)字 1000 是它的一個(gè)可變的屬性; Python 中的數(shù)字 1000 是一等公民,名稱 i 是它的一個(gè)可變的屬性。
有了以上的鋪墊,我們?cè)賮?lái)看看 i++,不難發(fā)現(xiàn): C 之類(lèi)的語(yǔ)言,i++ 可以表示 i 的數(shù)字屬性的增加, 它不會(huì)開(kāi)辟新的內(nèi)存空間,也不會(huì)產(chǎn)生新的一等公民 Python 之類(lèi)的語(yǔ)言,i++ 如果是對(duì)其名稱屬性的操作,那樣就沒(méi)有意義了(總不能按字母表順序,把 i 變成 j 吧);如果理解成對(duì)數(shù)字本體的操作,那么情況就會(huì)變得復(fù)雜:它會(huì)產(chǎn)生新的一等公民 1001,因此需要給它分配一個(gè)內(nèi)存地址,此時(shí)若占用 1000 的地址,則涉及舊對(duì)象的回收,那原有對(duì)于 1000 的引用關(guān)系都會(huì)受到影響,所以只能開(kāi)辟新的內(nèi)存空間給 1001
Python 若支持 i++,其操作過(guò)程要比 C 的 i++ 復(fù)雜,而且其含義也 不再是“令數(shù)字增加 1”(自增),而是“創(chuàng)建一個(gè)新的數(shù)字”(新增), 這樣的話,“自增操作符”( increment operator )就名不副實(shí)了。
Python 在理論上可以實(shí)現(xiàn) i++ 操作,但它就必須重新定義“自增操作符”,還會(huì)令有其它語(yǔ)言經(jīng)驗(yàn)的人產(chǎn)生誤解,不如就讓大家直接寫(xiě)成 i += 1 或者 i = i + 1 好了。
2 、Python 有可迭代對(duì)象
C/C++ 等語(yǔ)言設(shè)計(jì)出 i++,最主要的目的是為了方便使用三段式的 for 結(jié)構(gòu): for(int i = 0; i < 100; i++){ // 執(zhí)行 xxx }
這種程序關(guān)心的是數(shù)字本身的自增過(guò)程,數(shù)字做加法與程序體的執(zhí)行相關(guān)聯(lián)。
Python 中沒(méi)有這種 for 結(jié)構(gòu)的寫(xiě)法,它提供了更為優(yōu)雅的方式: for i in range(100): # 執(zhí)行 xxx my_list = ["你好", "我是 Python 貓", "歡迎關(guān)注"] for info in my_list: print(info)
這里體現(xiàn)了不同的思維方式,它關(guān)心的是在一個(gè)數(shù)值范圍內(nèi)的迭代遍歷,并不關(guān)心也不需要人為對(duì)數(shù)字做加法。
Python 中的可迭代對(duì)象 /迭代器 /生成器提供了非常良好的迭代 /遍歷用法,能夠做到對(duì) i++ 的完全替代。
例如,上例中實(shí)現(xiàn)了對(duì)列表內(nèi)值的遍歷,Python 還可以用 enumerate() 實(shí)現(xiàn)對(duì)下標(biāo)與具體值的同時(shí)遍歷: my_list = ["你好", "我是 Python 貓", "歡迎關(guān)注"] for i, info in enumerate(my_list): print(i, info) # 打印結(jié)果: 0 你好 1 我是 Python 貓 2 歡迎關(guān)注
再例如對(duì)于字典的遍歷,Python 提供了 keys()、values()、items() 等遍歷方法,非常好用: my_dict = {'a': '1', 'b': '2', 'c': '3'} for key in my_dict.keys(): print(key) for key, value in my_dict.items(): print(key, value)
有了這樣的利器,哪里還有 i++ 的用武之地呢?
不僅如此,Python 中基本上很少使用 i += 1 或者 i = i + 1 ,由于存在著隨處可見(jiàn)的可迭代對(duì)象,開(kāi)發(fā)者們很容易實(shí)現(xiàn)對(duì)一個(gè)數(shù)值區(qū)間的操作,也就很少有對(duì)于某個(gè)數(shù)值作累加的訴求了。
所以,回到我們開(kāi)頭的問(wèn)題,其實(shí)這兩種“自增”寫(xiě)法并沒(méi)有勝出 i++ 多少,只因?yàn)樗鼈兪峭ㄓ眯筒僮?又不需要引入新的操作符,所以 Python 才延續(xù)了一種基礎(chǔ)性的支持。 真正的贏家其實(shí)是各種各樣的可迭代對(duì)象!
稍微小結(jié)下:Python 不支持自增操作符,一方面是因?yàn)樗恼麛?shù)是不可變類(lèi)型的一等公民,自增操作(++)若要支持,則會(huì)帶來(lái)歧義;另一方面主要因?yàn)樗懈线m的實(shí)現(xiàn),即可迭代對(duì)象,對(duì)遍歷操作有很好的支持。
如果你覺(jué)得本文分析得不錯(cuò),那你應(yīng)該會(huì)喜歡這些文章:
1 、 Python 為什么使用縮進(jìn)來(lái)劃分代碼塊?
2 、 Python 的縮進(jìn)是不是反人類(lèi)的設(shè)計(jì)?
3 、 Python 為什么不用分號(hào)作語(yǔ)句終止符?
4 、 Python 為什么沒(méi)有 main 函數(shù)?為什么我不推薦寫(xiě) main 函數(shù)?
5 、 Python 為什么推薦蛇形命名法?
6 、 Python 為什么不支持 i++ 自增語(yǔ)法,不提供 ++ 操作符
7 、 Python 為什么只需一條語(yǔ)句“a,b=b,a”,就能直接交換兩個(gè)變量?
寫(xiě)在最后:本文屬于“Python 為什么”系列( Python 貓出品),該系列主要關(guān)注 Python 的語(yǔ)法、設(shè)計(jì)和發(fā)展等話題,以一個(gè)個(gè)“為什么”式的問(wèn)題為切入點(diǎn),試著展現(xiàn) Python 的迷人魅力。
前沿探索
2020-08-21 08:07:14
分享一篇文章:
從接觸 Python 時(shí)起,我就覺(jué)得 Python 的元組解包( unpacking )挺有意思,非常簡(jiǎn)潔好用。
最顯而易見(jiàn)的例子就是多重賦值,即在一條語(yǔ)句中同時(shí)給多個(gè)變量賦值: >>> x, y = 1, 2 >>> print(x, y) # 結(jié)果:1 2
在此例中,賦值操作符“=”號(hào)的右側(cè)的兩個(gè)數(shù)字會(huì)被存入到一個(gè)元組中,即變成 (1,2),然后再被解包,依次賦值給“=”號(hào)左側(cè)的兩個(gè)變量。
如果我們直接寫(xiě) x = 1,2 ,然后打印出 x,或者在“=”號(hào)右側(cè)寫(xiě)成一個(gè)元組,就能證實(shí)到這一點(diǎn): >>> x = 1, 2 >>> print(x) # 結(jié)果:(1, 2) >>> x, y = (1, 2) >>> print(x, y) # 結(jié)果:1 2
一些博客或公眾號(hào)文章在介紹到這個(gè)特性時(shí),通常會(huì)順著舉一個(gè)例子,即基于兩個(gè)變量,直接交換它們的值: >>> x, y = 1, 2 >>> x, y = y, x >>> print(x, y) # 結(jié)果:2 1
一般而言,交換兩個(gè)變量的操作需要引入第三個(gè)變量。道理很簡(jiǎn)單,如果要交換兩個(gè)杯子中所裝的水,自然會(huì)需要第三個(gè)容器作為中轉(zhuǎn)。
然而,Python 的寫(xiě)法并不需要借助中間變量,它的形式就跟前面的解包賦值一樣。正因?yàn)檫@個(gè)形式相似,很多人就誤以為 Python 的變量交換操作也是基于解包操作。
但是,事實(shí)是否如此呢?
我搜索了一番,發(fā)現(xiàn)有人試圖回答過(guò)這個(gè)問(wèn)題,但是他們的回答基本不夠全面。(當(dāng)然,有不少是錯(cuò)誤的答案,還有更多人只是知其然,卻從未想過(guò)要知其所以然)
先把本文的答案放出來(lái)吧: Python 的交換變量操作不完全基于解包操作,有時(shí)候是,有時(shí)候不是!
有沒(méi)有覺(jué)得這個(gè)答案很神奇呢?是不是聞所未聞?!
到底怎么回事呢?先來(lái)看看標(biāo)題中最簡(jiǎn)單的兩個(gè)變量的情況,我們上 dis 大殺器看看編譯的字節(jié)碼:
上圖開(kāi)了兩個(gè)窗口,可以方便比較“a,b=b,a”與“a,b=1,2”的不同: “a,b=b,a”操作:兩個(gè) LOAD_FAST 是從局部作用域中讀取變量的引用,并存入棧中,接著是最關(guān)鍵的 ROT_TWO 操作,它會(huì)交換兩個(gè)變量的引用值,然后兩個(gè) STORE_FAST 是將棧中的變量寫(xiě)入局部作用域中。 “a,b=1,2”操作:第一步 LOAD_CONST 把“=”號(hào)右側(cè)的兩個(gè)數(shù)字作為元組放到棧中,第二步 UNPACK_SEQUENCE 是序列解包,接著把解包結(jié)果寫(xiě)入局部作用域的變量上。
很明顯,形式相似的兩種寫(xiě)法實(shí)際上完成的操作并不相同。在交換變量的操作中,并沒(méi)有裝包和解包的步驟!
ROT_TWO 指令是 CPython 解釋器實(shí)現(xiàn)的對(duì)于棧頂兩個(gè)元素的快捷操作,改變它們指向的引用對(duì)象。
還有兩個(gè)類(lèi)似的指令是 ROT_THREE 和 ROT_FOUR,分別是快捷交換三和四個(gè)變量(摘自:ceval.c 文件,最新的 3.9 分支):
預(yù)定義的棧頂操作如下:
查看官方文檔中對(duì)于這幾個(gè)指令的解釋,其中 ROT_FOUR 是 3.8 版本新加的: ROT_TWO
Swaps the two top-most stack items. ROT_THREE
Lifts second and third stack item one position up, moves top down to position three. ROT_FOUR
Lifts second, third and forth stack items one position up, moves top down to position four. New in version 3.8.
CPython 應(yīng)該是以為這幾種變量的交換操作很常見(jiàn),因此才提供了專(zhuān)門(mén)的優(yōu)化指令。就像 [-5,256] 這些小整數(shù)被預(yù)先放到了整數(shù)池里一樣。
對(duì)于更多變量的交換操作,實(shí)際上則會(huì)用到前面說(shuō)的解包操作:
截圖中的 BUILD_TUPLE 指令會(huì)將給定數(shù)量的棧頂元素創(chuàng)建成元組,然后被 UNPACK_SEQUENCE 指令解包,再依次賦值。
值得一提的是,此處之所以比前面的“a,b=1,2”多出一個(gè) build 操作,是因?yàn)槊總€(gè)變量的 LOAD_FAST 需要先單獨(dú)入棧,無(wú)法直接被組合成 LOAD_CONST 入棧。也就是說(shuō),“=”號(hào)右側(cè)有變量時(shí),不會(huì)出現(xiàn)前文中的 LOAD_CONST 一個(gè)元組的情況。
最后還有一個(gè)值得一提的細(xì)節(jié),那幾個(gè)指令是跟棧中元素的數(shù)量有關(guān),而不是跟賦值語(yǔ)句中實(shí)際交換的變量數(shù)有關(guān)??匆粋€(gè)例子就明白了:
分析至此,你應(yīng)該明白前文中的結(jié)論是怎么回事了吧?
我們稍微總結(jié)一下: Python 能在一條語(yǔ)句中實(shí)現(xiàn)多重賦值,這是利用了序列解包的特性 Python 能在一條語(yǔ)句中實(shí)現(xiàn)變量交換,不需引入中間變量,在變量數(shù)少于 4 個(gè)時(shí)( 3.8 版本起是少于 5 個(gè)),CPython 是利用了 ROT_* 指令來(lái)交換棧中的元素,當(dāng)變量數(shù)超出時(shí),則是利用了序列解包的特性。 序列解包是 Python 的一大特性,但是在本文的例子中,CPython 解釋器在小小的操作中還提供了幾個(gè)優(yōu)化的指令,這絕對(duì)會(huì)超出大多數(shù)人的認(rèn)知
如果你覺(jué)得本文分析得不錯(cuò),那你應(yīng)該會(huì)喜歡這些文章:
1 、 Python 為什么使用縮進(jìn)來(lái)劃分代碼塊?
2 、 Python 的縮進(jìn)是不是反人類(lèi)的設(shè)計(jì)?
3 、 Python 為什么不用分號(hào)作語(yǔ)句終止符?
4 、 Python 為什么沒(méi)有 main 函數(shù)?為什么我不推薦寫(xiě) main 函數(shù)?
5 、 Python 為什么推薦蛇形命名法?
6 、 Python 為什么不支持 i++ 自增語(yǔ)法,不提供 ++ 操作符?
寫(xiě)在最后:本文屬于“Python 為什么”系列( Python 貓出品),該系列主要關(guān)注 Python 的語(yǔ)法、設(shè)計(jì)和發(fā)展等話題,以一個(gè)個(gè)“為什么”式的問(wèn)題為切入點(diǎn),試著展現(xiàn) Python 的迷人魅力。
前沿探索
2020-08-21 08:07:07
今天在做動(dòng)態(tài)規(guī)劃的時(shí)候創(chuàng)建二維列表的時(shí)候發(fā)現(xiàn)了一個(gè)疑問(wèn), 代碼如下 def func(N, total_weight): weight = [1, 2, 3, 4] value = [2, 4, 4, 5] dp = [[0 for i in range(total_weight+1)] for j in range(N+1)] print(dp) # dp = [[0] * (total_weight + 1)] * (N+1) # print(dp) for i in range(1, N + 1): for j in range(1, total_weight + 1): if j >= weight[i - 1]: value1 = dp[i - 1][j - weight[i - 1]] + value[i - 1] dp[i][j] = max(value1, dp[i - 1][j]) else: dp[i][j] = dp[i - 1][j] return dp func(4, 6)
dp = [[0 for i in range(total_weight+1)] for j in range(N+1)] 創(chuàng)建的列表和 dp = [[0] * (total_weight + 1)] * (N+1)創(chuàng)建的列表完全相同, 但是最后兩者得到的結(jié)果完全不同, 前者使用 for 循環(huán)得到的結(jié)果最后是正確的, 為什么會(huì)這樣呢???
for 循環(huán)得到的列表值: [[0, 0, 0, 0, 0, 0, 0], [0, 2, 2, 2, 2, 2, 2], [0, 2, 4, 6, 6, 6, 6], [0, 2, 4, 6, 6, 8, 10], [0, 2, 4, 6, 6, 8, 10]]
直接乘號(hào)得到的列表值: [[0, 2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12], [0, 2, 4, 6, 8, 10, 12]]
前沿探索
2020-08-21 08:06:56
hello,小伙伴們,大家好,今天給大家分享的開(kāi)源項(xiàng)目是: proxy_pool ,這個(gè)開(kāi)源項(xiàng)目是抓取個(gè)大免費(fèi)代理 IP 網(wǎng)站,感興趣的爬蟲(chóng)可以嘗試把代碼 clone 下載然后嘗試應(yīng)用一下,加油?。?! ______ ______ _ | ___ \_ | ___ \ | | | |_/ / \__ __ __ _ __ _ | |_/ /___ ___ | | | __/| _// _ \ \ \/ /| | | || __// _ \ / _ \ | | | | | | | (_) | > < \ |_| || | | (_) | (_) || |___ \_| |_| \___/ /_/\_\ \__ |\_| \___/ \___/ \_____\ __ / / /___ /
免費(fèi)代理源
目前實(shí)現(xiàn)的采集免費(fèi)代理網(wǎng)站有(排名不分先后, 下面僅是對(duì)其發(fā)布的免費(fèi)代理情況, 付費(fèi)代理測(cè)評(píng)可以參考 這里 ):
如果還有其他好的免費(fèi)代理網(wǎng)站, 可以在提交在 issues , 下次更新時(shí)會(huì)考慮在項(xiàng)目中支持。
運(yùn)行項(xiàng)目
下載代碼: git clone [email?protected] :jhao104/proxy_pool.git
or https://github.com/jhao104/proxy_pool/releases 下載對(duì)應(yīng) zip 文件
安裝依賴: pip install -r requirements.txt
更新配置: # setting.py 為項(xiàng)目配置文件 # 配置 API 服務(wù) HOST = "0.0.0.0" # IP PORT = 5000 # 監(jiān)聽(tīng)端口 # 配置數(shù)據(jù)庫(kù) DB_CONN = 'redis://@127.0.0.1:8888' # 配置 ProxyFetcher PROXY_FETCHER = [ "freeProxy01", # 這里是啟用的代理抓取方法名,所有 fetch 方法位于 fetcher/proxyFetcher.py "freeProxy02", # .... ]
啟動(dòng)項(xiàng)目: # 如果已經(jīng)具備運(yùn)行條件, 可用通過(guò) proxyPool.py 啟動(dòng)。 # 程序分為: schedule 調(diào)度程序 和 server Api 服務(wù) # 啟動(dòng)調(diào)度程序 python proxyPool.py schedule # 啟動(dòng) webApi 服務(wù) python proxyPool.py server
Docker 運(yùn)行 docker pull jhao104/proxy_pool docker run --env DB_CONN=redis://: [email?protected] :port/db -p 5010:5010 jhao104/proxy_pool:2.1.0
使用
如果要在爬蟲(chóng)代碼中使用的話, 可以將此 api 封裝成函數(shù)直接使用,例如: import requests def get_proxy(): return requests.get("http://127.0.0.1:5010/get/").json() def delete_proxy(proxy): requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy)) # your spider code def getHtml(): # .... retry_count = 5 proxy = get_proxy().get("proxy") while retry_count > 0: try: html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)}) # 使用代理訪問(wèn) return html except Exception: retry_count -= 1 # 刪除代理池中代理 delete_proxy(proxy) return None
擴(kuò)展代理
項(xiàng)目默認(rèn)包含幾個(gè)免費(fèi)的代理獲取源,但是免費(fèi)的畢竟質(zhì)量有限,所以如果直接運(yùn)行可能拿到的代理質(zhì)量不理想。所以,提供了代理獲取的擴(kuò)展方法。
添加一個(gè)新的代理源方法如下: 1 、首先在 ProxyFetcher 類(lèi)中添加自定義的獲取代理的靜態(tài)方法, 該方法需要以生成器(yield)形式返回 host:ip 格式的代理,例如: class ProxyFetcher(object): # .... # 自定義代理源獲取方法 @staticmethod def freeProxyCustom1(): # 命名不和已有重復(fù)即可 # 通過(guò)某網(wǎng)站或者某接口或某數(shù)據(jù)庫(kù)獲取代理 # 假設(shè)你已經(jīng)拿到了一個(gè)代理列表 proxies = ["x.x.x.x:3128", "x.x.x.x:80"] for proxy in proxies: yield proxy # 確保每個(gè) proxy 都是 host:ip 正確的格式返回
2 、添加好方法后,修改 setting.py 文件中的 PROXY_FETCHER 項(xiàng):  在 PROXY_FETCHER 下添加自定義方法的名字: PROXY_FETCHER = [ "freeProxy01", "freeProxy02", # .... "freeProxyCustom1" # # 確保名字和你添加方法名字一致 ]
schedule 進(jìn)程會(huì)每隔一段時(shí)間抓取一次代理,下次抓取時(shí)會(huì)自動(dòng)識(shí)別調(diào)用你定義的方法。
以上就是這個(gè)開(kāi)源項(xiàng)目的詳細(xì)介紹了,感興趣的小伙伴可以嘗試應(yīng)用一下。
開(kāi)源地址: https://github.com/jhao104/proxy_pool
今天的推薦不知道大家喜歡嗎?如果你們喜歡話,請(qǐng)?jiān)谖恼碌撞苛粞曰螯c(diǎn)贊,以表示對(duì)我的支持,你們的留言,點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注是我持續(xù)更新的動(dòng)力哦!
關(guān)注公眾號(hào)回復(fù):" 1024 ",免費(fèi)領(lǐng)取一大波學(xué)習(xí)資源,先到先得哦!
前沿探索
2020-08-21 08:06:46
借用官網(wǎng)例子說(shuō)明我的疑問(wèn): with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: # Start the load operations and mark each future with its URL future_to_url = {executor.submit(load_url, url, 60): url for url in URLS} for future in concurrent.futures.as_completed(future_to_url): ...
官網(wǎng)的例子都是這樣,將所有任務(wù)一次性放到 executor 后才使用 as_completed 判斷。
如果我需要從隊(duì)列中不斷取任務(wù)的話,該怎么使用 as_completed 比較合適呢? # 類(lèi)似于這個(gè)意思 while True: executor.submit(load_url) time.sleep(1) while True: for future in concurrent.futures.as_completed(): #do sth...
使用兩個(gè)線程?感覺(jué)在套娃……
或者說(shuō) ThreadPoolExecutor 不適用于該場(chǎng)景,需要自己寫(xiě) threading 方法?
前沿探索
2020-08-21 08:06:39
有個(gè) scrapy 項(xiàng)目整體流程大概是: spider.start_requests 從 redis 的 tasks_keys 里獲取 url middleware.proxyMiddleware.process_request 從 redis 的 proxy_keys 里獲取代理 spider.parse 解析出 item,需深度抓取的 url,深度抓取 url 放入 redis 的 tasks_keys 里 pipelines.MyItem 把解析出的 item 存入 redis 的 item_keys 里面 。。。。 總結(jié)來(lái)說(shuō),有 4 個(gè)地方需要用到同一個(gè) redis 數(shù)據(jù)庫(kù),區(qū)別只在 key 目前的寫(xiě)法是, middleware.proxyMiddleware 里面__init__聲明了 redis.ConnectionPool 連接池,以及 redis.StrictRedis 連接 在 pipelines.MyItem 和 spider 繼承的類(lèi)__init__里面全部粘貼復(fù)制了一遍。。。 一模一樣的代碼寫(xiě)了三個(gè)地方 雖然程序可以正常跑,但是,這方法越看越覺(jué)得傻 有什么方法可以只聲明一個(gè) redis 鏈接,然后在 spider 、middleware 、pipeline 復(fù)用同一個(gè)鏈接嗎? 搜了一圈,各種出錯(cuò),沒(méi)有實(shí)際進(jìn)展
前沿探索
2020-08-21 08:06:33
hello,小伙伴們大家好,今天給大家推薦的開(kāi)源項(xiàng)目是 : CxSpider ,這個(gè)開(kāi)源整合了作者自己的采集過(guò)的所有產(chǎn)品,包括微博、Twitter 、玩加、知網(wǎng)、虎牙、斗魚(yú)、B 站、WeGame 、貓眼、豆瓣、安居客、居理新房感興趣的小伙伴可以下載看看,應(yīng)該可以給你提供一個(gè)可借鑒的思路。
Project
爬蟲(chóng)詳情
1. Twitter 用戶信息爬蟲(chóng)(twitter.user_info) @ author ChangXing @ version 4.1 @ create 2017.12.25 @ revise 2020.06.08
使用第三方模塊 twitter-scraper 采集 Twitter 用戶信息;因?yàn)樵撃K采集的粉絲數(shù)和關(guān)注數(shù)可能存在偏差,因此再通過(guò) Selenium 抓取 Twitter 用戶信息,以更正該模塊采集的數(shù)量。 采集信息:粉絲數(shù)和關(guān)注數(shù)為 twitter-scraper 采集并配合 Selenium 爬蟲(chóng)檢查,其他字段為 twitter-scraper 采集。 應(yīng)用配置:無(wú)需使用代理 IP,需要使用 Selenium
2. Twitter 用戶推文爬蟲(chóng)(twitter.user_tweet) @ author ChangXing @ version 4.0 @ create 2017.12.30 @ revise 2020.06.08
微博熱搜榜實(shí)時(shí)爬蟲(chóng)(weibo.hot_ranking) @ author ChangXing @ Version 1.1 @ create 2020.05.29 @ revise 2020.06.08
定時(shí)采集微博熱搜榜。 采集信息:每 5 分鐘采集 1 次,每次約 50 條記錄→每天約 14400 條記錄 數(shù)據(jù)清洗:熱搜榜置頂熱搜(固定第 1 條)和廣告熱搜(標(biāo)注推薦) 應(yīng)用配置:無(wú)需使用代理 IP 、無(wú)需使用 Selenium
環(huán)境變量
爬蟲(chóng)功能的正常使用需要配置如下環(huán)境變量,可以直接修改 environment.py 中的環(huán)境變量值,也可以修改配置 Json 文件。
環(huán)境配置
Python/Pip 環(huán)境 Python >= 3.8.0 requests >= 2.23.0 idna >= 2.9 urllib3 >= 1.25.9 certifi >= 2020.4.5.1 chardet >= 3.0.4 bs4 >= 0.0.1 beautifulsoup4 >= 4.9.0 soupsieve >= 2.0 apscheduler >= 3.6.3 pytz >= 2019.3 six >= 1.14.0 tzlocal >= 2.1 setuptools mysql-connector >= 2.2.9 lxml >= 4.5.0 selenium >= 3.141.0 (用于 Selenium 爬蟲(chóng)) urllib3 >= 1.25.9 twitter-scraper >= 0.4.1 (用于 Twitter 用戶信息爬蟲(chóng)) requests-html >= 0.10.0 MachanicalSoup >= 0.12.0
開(kāi)源地址: https://github.com/ChangxingJiang/CxSpider
今天的推薦不知道大家喜歡嗎?如果你們喜歡話,請(qǐng)?jiān)谖恼碌撞苛粞曰螯c(diǎn)贊,以表示對(duì)我的支持,你們的留言,點(diǎn)贊,轉(zhuǎn)發(fā)關(guān)注是我持續(xù)更新的動(dòng)力哦!
關(guān)注公眾號(hào)回復(fù):" 1024 ",免費(fèi)領(lǐng)取一大波學(xué)習(xí)資源,先到先得哦!
前沿探索
2020-08-21 08:06:25
v2 的跟帖似乎無(wú)法用 markdown 語(yǔ)法? 所以就重新開(kāi)個(gè)帖子請(qǐng)教這個(gè)問(wèn)題。。。 # coding=utf-8 import codecs import difflib import os.path import re import time import string import chardet import shutil import copy from concurrent.futures import ProcessPoolExecutor import datetime def PrintCount(PName): if PName == '甲': DelayTime = 0.9 if PName == '乙': DelayTime = 1.2 if PName == '丙': DelayTime = 1.7 if PName == '丁': DelayTime = 2 if PName == '戊': DelayTime = 2.5 countt = 0 while True: countt += 1 time.sleep(DelayTime) print(f'{PName}池:->',f'{countt}') if __name__ == '__main__': StartTime = time.clock() FutureDict = {} FutureRetDict = {} FutureTimeRecoderDict = {} PoolNameList = ["甲", "乙", "丙", "丁", "戊"] # 初始化進(jìn)程池 for i in range(len(PoolNameList)): # 進(jìn)程 FutureDict.update({PoolNameList[i]: ProcessPoolExecutor(max_workers=1)}) # 進(jìn)程 Ret FutureRetDict.update({PoolNameList[i]: futures.Future()}) # 進(jìn)程啟動(dòng)時(shí)間 FutureTimeRecoderDict.update({PoolNameList[i]: None}) # 模擬測(cè)試清空進(jìn)程池的信號(hào) closeflag = True # 開(kāi)始工作 while True: ProcessNum = 0 # 增加任務(wù) for ProcessName,FutureRet in FutureRetDict.items(): # 模擬 40 秒后終結(jié) [乙] 進(jìn)程池 if closeflag == True: if time.clock() - StartTime >= 40: # 在啟動(dòng) 40 秒后觸發(fā) print(f"開(kāi)始強(qiáng)制結(jié)束 [乙] 進(jìn)程池") for pid, process in FutureDict['乙']._processes.items(): process.terminate() FutureDict['乙'].shutdown() closeflag = False time.sleep(15) # 如果進(jìn)程池在運(yùn)行 if FutureRet.running() == True: pass else: # 增加任務(wù) FutureRetDict[ProcessName] = FutureDict[ProcessName].submit(PrintCount,ProcessName) print(f'{ProcessName} 進(jìn)程池提交了開(kāi)始.') time.sleep(2) break time.sleep(3)
40 秒之后,乙進(jìn)程池的確被停了,但是再向乙進(jìn)程池提交任務(wù)的時(shí)候,會(huì)提示: 甲池:-> 57 甲池:-> 58 丙池:-> 25 戊池:-> 13 甲池:-> 59 丁池:-> 19 甲池:-> 60 丙池:-> 26 Traceback (most recent call last): File "D:/TestForMu.py", line 80, in FutureRetDict[ProcessName] = FutureDict[ProcessName].submit(PrintCount,ProcessName) File "C:
前沿探索
2020-08-21 08:06:19
winpython 是綠色免安裝的,一直用的不錯(cuò),這次在內(nèi)網(wǎng)中把一臺(tái) WIN7 上的 winpython (可用)拷到另一臺(tái)電腦上,在 winpython command prompt 提示符中輸入 python,按回車(chē)后無(wú)法進(jìn)入 python 環(huán)境,還是命令行提示符,可能是什么問(wèn)題?謝謝
前沿探索
2020-08-21 08:06:11
python37 + tkinter一直在報(bào) show_me 函數(shù)未定義,但是如果單獨(dú)測(cè)試就是正常的。 import tkinter from tkinter import ttk , Menu from tkinter import messagebox work_jiemian = tkinter.Tk ()work_jiemian.title("醫(yī)藥銷(xiāo)售計(jì)算工具") work_jiemian.geometry('600x500+300+100') work_jiemian.iconbitmap("./img/bitbug_favicon.ico") # 制作菜單 def show_me(): messagebox.showwarning(title="注意",message="導(dǎo)入銷(xiāo)售數(shù)據(jù)自動(dòng)計(jì)算銷(xiāo)售總額") menu_bar = Menu(work_jiemian) about_menu = Menu(menu_bar) about_menu.add_command(label = "關(guān)于這個(gè)程序" , command = show_me) work_jiemian.mainloop()
前沿探索
2020-08-21 08:06:06
如我有這么一個(gè)表 行為 a,b,c,d,e 列為 A,B,C,D,E 內(nèi)容都是數(shù)字我想使行 a,b,c,d,e 任意(隨意,隨機(jī))組合做相加 滿足比如 A>1,B>2,C>3,D<4,E<5 的幾個(gè)條件 或者列出所有滿足條件的組合 可以使用 python 設(shè)計(jì)一個(gè)簡(jiǎn)單的程序嗎?有沒(méi)什么書(shū)籍或者視頻可以參考的?
前沿探索
2020-08-21 08:05:58
現(xiàn)有 a 變量,
a = """ """
因?yàn)椤癱oupoen_fee”重復(fù)了,通過(guò) xmltodict 轉(zhuǎn)的 dict 格式為 {'fee_type': 'CNY', 'coupon_fee': ['10', '100']}
期待的格式是 {'fee_type': 'CNY', 'coupon_fee': '10', 'coupon_fee': '100'}
目的是得到 coupon_fee=10&coupon_fee=100&fee_type=CNY
有啥好的辦法嗎?
前沿探索
2020-08-21 08:05:53
big sur 下面,python 無(wú)法運(yùn)行包含了 QT DESIGNER 寫(xiě)的 ui 文件。 可能是因?yàn)橄到y(tǒng)太新的問(wèn)題。
或許不是。誰(shuí)試過(guò)。
ps.:同一 py 文件,另一臺(tái)電腦可以運(yùn)行(比 big sur 的版本低一個(gè)版本)。
前沿探索
2020-08-21 08:05:46
https://github.com/microsoft/pylance-release
這是一個(gè)閉源的插件,功能等同于 Language Server,個(gè)人感覺(jué)體驗(yàn)好很多。類(lèi)型風(fēng)格非常的 TypeScript,響應(yīng)速度也很快。
前沿探索
2020-08-21 08:05:38