DataFrame 有點(diǎn)像 Excel 的表還有點(diǎn)像 SQL 中的表,但是其功能和二者差別又不小。如果要像不熟悉 Python 的人介紹 DataFrame, 該給它取個(gè)什么名字呢?最好比較形象生動(dòng)又能體現(xiàn) DataFrame 的主要特征。數(shù)據(jù)陣列式怎么樣?
如何讓 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é)得這樣是可行的嗎?
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í)資源,先到先得哦!
有一部分是我們自己的。有些是其他人同類(lèi)產(chǎn)品的。要求提取資料后整合成表格,以便分類(lèi)分析。 需要附帶產(chǎn)品鏈接。 通過(guò)關(guān)鍵詞提取。 要求:公司名稱,聯(lián)系人,地址,電話,郵件,產(chǎn)品鏈接,售價(jià)。
剛學(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)呢?
需求是將多個(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 好像也不行。
我是 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)有什么方法能縮小體積嗎?
或者有什么其他工具推薦?
謝謝各位
本地 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
最近剛剛開(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)教~
文章如下所示 我想提取文章中的代理機(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)) ’‘’
比如說(shuō)我一次創(chuàng)建 10 個(gè)線程,當(dāng)我想關(guān)閉(滿足條件的)其中一個(gè)線程時(shí),如何關(guān)閉,而不影響其他 9 個(gè)線程的運(yùn)行
抓取的網(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)題出在了哪里呢?
如題: str 對(duì)象,統(tǒng)一的 Unicode 字符串
有興趣的童鞋歡迎一起組隊(duì)研究,這樣更容易堅(jiān)持下去……
射擊訓(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
很簡(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'
老哥們,我用的是 pyinstaller 打包成 exe 單文件后程序調(diào)用的模塊好像沒(méi)有效果 用 freeze 打包后本機(jī)可以運(yùn)行所有功能,換電腦運(yùn)行提示無(wú)相關(guān)環(huán)境(提示環(huán)境還是相關(guān)原電腦的絕對(duì)路徑) 但是我已經(jīng)打包了所有依賴
今年剛畢業(yè)入職一家小公司,主要用 Python 開(kāi)發(fā) API 。之前我都是用 Django 和 DRF,工作之后公司的項(xiàng)目全是異步的...以后的項(xiàng)目也都用 fastapi 了,現(xiàn)在異步、asgi 在 Python 越來(lái)越火了嗎
本來(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
背景:從 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)教各位,我可以怎么做?
公司打算自己做一個(gè)圖像識(shí)別的東西 ,用顯卡計(jì)算
但是圖像比較大,希望能減少計(jì)算時(shí)間
有沒(méi)有做過(guò)的大佬推薦下,怎么搭配顯卡最好
功能很簡(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)題到底處在哪兒了
去年這個(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)用用。
查了一下 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)))
PyLongObject 頭部信息是一個(gè) PyVarObject,PyObject 能訪問(wèn)到引用次數(shù)和類(lèi)型信息,那 PyObject 能不能訪問(wèn)到 PyLongObject 所維護(hù)的真實(shí) int 值
‘’‘ 山東省煙臺(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ù)
我根據(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
分享一篇文章:
在 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 的迷人魅力。
分享一篇文章:
從接觸 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 的迷人魅力。
今天在做動(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]]
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í)資源,先到先得哦!
借用官網(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 方法?
有個(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)展
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í)資源,先到先得哦!
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:
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)題?謝謝
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()
如我有這么一個(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ū)籍或者視頻可以參考的?
現(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
有啥好的辦法嗎?
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è)版本)。
https://github.com/microsoft/pylance-release
這是一個(gè)閉源的插件,功能等同于 Language Server,個(gè)人感覺(jué)體驗(yàn)好很多。類(lèi)型風(fēng)格非常的 TypeScript,響應(yīng)速度也很快。