Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 韩国特级毛片,18视频在线观看,亚洲国产日韩精品

          整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線(xiàn):

          Python 函數(shù)合集:足足 68 個(gè)內(nèi)置函數(shù)請(qǐng)收好

          Python 函數(shù)合集:足足 68 個(gè)內(nèi)置函數(shù)請(qǐng)收好

          源:pypypypy

          www.cnblogs.com/pypypy/p/12011506.html

          內(nèi)置函數(shù)就是python給你提供的, 拿來(lái)直接用的函數(shù),比如print.,input等。截止到python版本3.6.2 python一共提供了68個(gè)內(nèi)置函數(shù)。

          #68個(gè)內(nèi)置函數(shù)# abs dict help min setattr# all dir hex next slice # any divmod id object sorted # ascii enumerate input oct staticmethod # bin eval int open str # bool exec isinstance ord sum # bytearray ?lter issubclass pow super # bytes ?oat iter print tuple # callable format len property type # chr frozenset list range vars # classmethod getattr locals repr zip # compile globals map reversed __import__ # complex hasattr max round # delattr hash memoryview set

          和數(shù)字相關(guān)

          1. 數(shù)據(jù)類(lèi)型

          • bool : 布爾型(True,False)

          • int : 整型(整數(shù))

          • float : 浮點(diǎn)型(小數(shù))

          • complex : 復(fù)數(shù)

          2. 進(jìn)制轉(zhuǎn)換

          • bin 將給的參數(shù)轉(zhuǎn)換成二進(jìn)制

          • otc 將給的參數(shù)轉(zhuǎn)換成八進(jìn)制

          • hex 將給的參數(shù)轉(zhuǎn)換成十六進(jìn)制

          print(bin(10)) # 二進(jìn)制:0b1010print(hex(10)) # 十六進(jìn)制:0xaprint(oct(10)) # 八進(jìn)制:0o12

          3. 數(shù)學(xué)運(yùn)算

          • abs 返回絕對(duì)值

          • divmode 返回商和余數(shù)

          • round 四舍五入

          • pow(a, b) 求a的b次冪, 如果有三個(gè)參數(shù). 則求完次冪后對(duì)第三個(gè)數(shù)取余

          • sum 求和

          • min 求最小值

          • max 求最大值

          print(abs(-2)) # 絕對(duì)值:2print(divmod(20,3)) # 求商和余數(shù):(6,2)print(round(4.50)) # 五舍六入:4print(round(4.51)) #5print(pow(10,2,3)) # 如果給了第三個(gè)參數(shù). 表示最后取余:1print(sum([1,2,3,4,5,6,7,8,9,10])) # 求和:55print(min(5,3,9,12,7,2)) #求最小值:2print(max(7,3,15,9,4,13)) #求最大值:15

          和數(shù)據(jù)結(jié)構(gòu)相關(guān)

          1. 序列

          (1)列表和元組

          • list 將一個(gè)可迭代對(duì)象轉(zhuǎn)換成列表

          • tuple 將一個(gè)可迭代對(duì)象轉(zhuǎn)換成元組

          print(list((1,2,3,4,5,6))) #[1, 2, 3, 4, 5, 6]print(tuple([1,2,3,4,5,6])) #(1, 2, 3, 4, 5, 6)

          (2)相關(guān)內(nèi)置函數(shù)

          • reversed 將一個(gè)序列翻轉(zhuǎn), 返回翻轉(zhuǎn)序列的迭代器

          • slice 列表的切片

          lst="你好啊"it=reversed(lst) # 不會(huì)改變?cè)斜? 返回一個(gè)迭代器, 設(shè)計(jì)上的一個(gè)規(guī)則print(list(it)) #['啊', '好', '你']lst=[1, 2, 3, 4, 5, 6, 7]print(lst[1:3:1]) #[2,3]s=slice(1, 3, 1) # 切片用的print(lst[s]) #[2,3]

          (3)字符串

          • str 將數(shù)據(jù)轉(zhuǎn)化成字符串

          print(str(123)+'456') #123456 format 與具體數(shù)據(jù)相關(guān), 用于計(jì)算各種小數(shù), 精算等.
          s="hello world!"print(format(s, "^20")) #劇中print(format(s, "<20")) #左對(duì)齊print(format(s, ">20")) #右對(duì)齊# hello world! # hello world! # hello world!print(format(3, 'b' )) # 二進(jìn)制:11print(format(97, 'c' )) # 轉(zhuǎn)換成unicode字符:aprint(format(11, 'd' )) # ?進(jìn)制:11print(format(11, 'o' )) # 八進(jìn)制:13 print(format(11, 'x' )) # 十六進(jìn)制(?寫(xiě)字母):bprint(format(11, 'X' )) # 十六進(jìn)制(大寫(xiě)字母):Bprint(format(11, 'n' )) # 和d?樣:11print(format(11)) # 和d?樣:11print(format(123456789, 'e' )) # 科學(xué)計(jì)數(shù)法. 默認(rèn)保留6位小數(shù):1.234568e+08print(format(123456789, '0.2e' )) # 科學(xué)計(jì)數(shù)法. 保留2位小數(shù)(小寫(xiě)):1.23e+08print(format(123456789, '0.2E' )) # 科學(xué)計(jì)數(shù)法. 保留2位小數(shù)(大寫(xiě)):1.23E+08print(format(1.23456789, 'f' )) # 小數(shù)點(diǎn)計(jì)數(shù)法. 保留6位小數(shù):1.234568print(format(1.23456789, '0.2f' )) # 小數(shù)點(diǎn)計(jì)數(shù)法. 保留2位小數(shù):1.23print(format(1.23456789, '0.10f')) # 小數(shù)點(diǎn)計(jì)數(shù)法. 保留10位小數(shù):1.2345678900print(format(1.23456789e+3, 'F')) # 小數(shù)點(diǎn)計(jì)數(shù)法. 很大的時(shí)候輸出INF:1234.567890
          • bytes 把字符串轉(zhuǎn)化成bytes類(lèi)型

          bs=bytes("今天吃飯了嗎", encoding="utf-8")print(bs) #b'\xe4\xbb\x8a\xe5\xa4\xa9\xe5\x90\x83\xe9\xa5\xad\xe4\xba\x86\xe5\x90\x97' bytearray 返回一個(gè)新字節(jié)數(shù)組. 這個(gè)數(shù)字的元素是可變的, 并且每個(gè)元素的值得范圍是[0,256)ret=bytearray("alex" ,encoding='utf-8')print(ret[0]) #97print(ret) #bytearray(b'alex')ret[0]=65 #把65的位置A賦值給ret[0]print(str(ret)) #bytearray(b'Alex')
          • ord 輸入字符找?guī)ё址幋a的位置

          • chr 輸入位置數(shù)字找出對(duì)應(yīng)的字符

          • ascii 是ascii碼中的返回該值 不是就返回u

          print(ord('a')) # 字母a在編碼表中的碼位:97print(ord('中')) # '中'字在編碼表中的位置:20013print(chr(65)) # 已知碼位,求字符是什么:Aprint(chr(19999)) #丟for i in range(65536): #打印出0到65535的字符 print(chr(i), end=" ")print(ascii("@")) #'@'
          • repr 返回一個(gè)對(duì)象的string形式

          s="今天\n吃了%s頓\t飯" % 3print(s)#今天# 吃了3頓 飯print(repr(s)) # 原樣輸出,過(guò)濾掉轉(zhuǎn)義字符 \n \t \r 不管百分號(hào)%#'今天\n吃了3頓\t飯'

          2. 數(shù)據(jù)集合

          • 字典:dict 創(chuàng)建一個(gè)字典

          • 集合:set 創(chuàng)建一個(gè)集合

          frozenset 創(chuàng)建一個(gè)凍結(jié)的集合,凍結(jié)的集合不能進(jìn)行添加和刪除操作。

          3. 相關(guān)內(nèi)置函數(shù)

          • len 返回一個(gè)對(duì)象中的元素的個(gè)數(shù)

          • sorted 對(duì)可迭代對(duì)象進(jìn)行排序操作 (lamda)

          語(yǔ)法:sorted(Iterable, key=函數(shù)(排序規(guī)則), reverse=False)

          • Iterable: 可迭代對(duì)象

          • key: 排序規(guī)則(排序函數(shù)), 在sorted內(nèi)部會(huì)將可迭代對(duì)象中的每一個(gè)元素傳遞給這個(gè)函數(shù)的參數(shù). 根據(jù)函數(shù)運(yùn)算的結(jié)果進(jìn)行排序

          • reverse: 是否是倒敘. True: 倒敘, False: 正序

          lst=[5,7,6,12,1,13,9,18,5]lst.sort # sort是list里面的一個(gè)方法print(lst) #[1, 5, 5, 6, 7, 9, 12, 13, 18]ll=sorted(lst) # 內(nèi)置函數(shù). 返回給你一個(gè)新列表 新列表是被排序的print(ll) #[1, 5, 5, 6, 7, 9, 12, 13, 18]l2=sorted(lst,reverse=True) #倒序print(l2) #[18, 13, 12, 9, 7, 6, 5, 5, 1]
          #根據(jù)字符串長(zhǎng)度給列表排序lst=['one', 'two', 'three', 'four', 'five', 'six']def f(s): return len(s)l1=sorted(lst, key=f, )print(l1) #['one', 'two', 'six', 'four', 'five', 'three']
          • enumerate 獲取集合的枚舉對(duì)象

          lst=['one','two','three','four','five']for index, el in enumerate(lst,1): # 把索引和元素一起獲取,索引默認(rèn)從0開(kāi)始. 可以更改 print(index) print(el)# 1# one# 2# two# 3# three# 4# four# 5# five
          • all 可迭代對(duì)象中全部是True, 結(jié)果才是True

          • any 可迭代對(duì)象中有一個(gè)是True, 結(jié)果就是True

          print(all([1,'hello',True,9])) #Trueprint(any([0,0,0,False,1,'good'])) #True
          • zip 函數(shù)用于將可迭代的對(duì)象作為參數(shù), 將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)元組, 然后返回由這些元組組成的列表. 如果各個(gè)迭代器的元素個(gè)數(shù)不一致, 則返回列表長(zhǎng)度與最短的對(duì)象相同

          lst1=[1, 2, 3, 4, 5, 6]lst2=['醉鄉(xiāng)民謠', '驢得水', '放牛班的春天', '美麗人生', '辯護(hù)人', '被嫌棄的松子的一生']lst3=['美國(guó)', '中國(guó)', '法國(guó)', '意大利', '韓國(guó)', '日本']print(zip(lst1, lst1, lst3)) #<zip object at 0x00000256CA6C7A88>for el in zip(lst1, lst2, lst3): print(el)# (1, '醉鄉(xiāng)民謠', '美國(guó)')# (2, '驢得水', '中國(guó)')# (3, '放牛班的春天', '法國(guó)')# (4, '美麗人生', '意大利')# (5, '辯護(hù)人', '韓國(guó)')# (6, '被嫌棄的松子的一生', '日本')
          • fiter 過(guò)濾 (lamda)

          語(yǔ)法:fiter(function. Iterable)

          function: 用來(lái)篩選的函數(shù). 在?lter中會(huì)自動(dòng)的把iterable中的元素傳遞給function. 然后根據(jù)function返回的True或者False來(lái)判斷是否保留留此項(xiàng)數(shù)據(jù) , Iterable: 可迭代對(duì)象

          def func(i): # 判斷奇數(shù) return i % 2==1 lst=[1,2,3,4,5,6,7,8,9]l1=filter(func, lst) #l1是迭代器print(l1) #<filter object at 0x000001CE3CA98AC8>print(list(l1)) #[1, 3, 5, 7, 9]
          • map 會(huì)根據(jù)提供的函數(shù)對(duì)指定序列列做映射(lamda)

          語(yǔ)法 : map(function, iterable)

          可以對(duì)可迭代對(duì)象中的每一個(gè)元素進(jìn)行映射. 分別去執(zhí)行 function

          def f(i): return ilst=[1,2,3,4,5,6,7,]it=map(f, lst) # 把可迭代對(duì)象中的每一個(gè)元素傳遞給前面的函數(shù)進(jìn)行處理. 處理的結(jié)果會(huì)返回成迭代器print(list(it)) #[1, 2, 3, 4, 5, 6, 7]

          和作用域相關(guān)

          • locals 返回當(dāng)前作用域中的名字

          • globals 返回全局作用域中的名字

          def func: a=10 print(locals) # 當(dāng)前作用域中的內(nèi)容 print(globals) # 全局作用域中的內(nèi)容 print("今天內(nèi)容很多")func# {'a': 10}# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': # <_frozen_importlib_external.SourceFileLoader object at 0x0000026F8D566080>, # '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' # (built-in)>, '__file__': 'D:/pycharm/練習(xí)/week03/new14.py', '__cached__': None,# 'func': <function func at 0x0000026F8D6B97B8>}# 今天內(nèi)容很多

          和迭代器/生成器相關(guān)

          • range 生成數(shù)據(jù)

          • next 迭代器向下執(zhí)行一次, 內(nèi)部實(shí)際使?用了__ next__?方法返回迭代器的下一個(gè)項(xiàng)目

          • iter 獲取迭代器, 內(nèi)部實(shí)際使用的是__ iter__?方法來(lái)獲取迭代器

          for i in range(15,-1,-5): print(i)# 15# 10# 5# 0lst=[1,2,3,4,5]it=iter(lst) # __iter__獲得迭代器print(it.__next__) #1print(next(it)) #2 __next__ print(next(it)) #3print(next(it)) #4

          字符串類(lèi)型代碼的執(zhí)行

          • eval 執(zhí)行字符串類(lèi)型的代碼. 并返回最終結(jié)果

          • exec 執(zhí)行字符串類(lèi)型的代碼

          • compile 將字符串類(lèi)型的代碼編碼. 代碼對(duì)象能夠通過(guò)exec語(yǔ)句來(lái)執(zhí)行或者eval進(jìn)行求值

          s1=input("請(qǐng)輸入a+b:") #輸入:8+9print(eval(s1)) # 17 可以動(dòng)態(tài)的執(zhí)行代碼. 代碼必須有返回值s2="for i in range(5): print(i)"a=exec(s2) # exec 執(zhí)行代碼不返回任何內(nèi)容# 0# 1# 2# 3# 4print(a) #None# 動(dòng)態(tài)執(zhí)行代碼exec("""def func: print(" 我是周杰倫")""" )func #我是周杰倫
          code1="for i in range(3): print(i)"com=compile(code1, "", mode="exec") # compile并不會(huì)執(zhí)行你的代碼.只是編譯exec(com) # 執(zhí)行編譯的結(jié)果# 0# 1# 2code2="5+6+7"com2=compile(code2, "", mode="eval")print(eval(com2)) # 18code3="name=input('請(qǐng)輸入你的名字:')" #輸入:hellocom3=compile(code3, "", mode="single")exec(com3)print(name) #hello

          輸入輸出

          • print : 打印輸出

          • input : 獲取用戶(hù)輸出的內(nèi)容

          print("hello", "world", sep="*", end="@") # sep:打印出的內(nèi)容用什么連接,end:以什么為結(jié)尾#hello*world@

          內(nèi)存相關(guān)

          hash : 獲取到對(duì)象的哈希值(int, str, bool, tuple). hash算法:(1) 目的是唯一性 (2) dict 查找效率非常高, hash表.用空間換的時(shí)間 比較耗費(fèi)內(nèi)存

          s='alex'print(hash(s)) #-168324845050430382lst=[1, 2, 3, 4, 5]print(hash(lst)) #報(bào)錯(cuò),列表是不可哈希的 id : 獲取到對(duì)象的內(nèi)存地址s='alex'print(id(s)) #2278345368944

          文件操作相關(guān)

          • open : 用于打開(kāi)一個(gè)文件, 創(chuàng)建一個(gè)文件句柄

          f=open('file',mode='r',encoding='utf-8')f.readf.close

          模塊相關(guān)

          • __ import__ : 用于動(dòng)態(tài)加載類(lèi)和函數(shù)

          # 讓用戶(hù)輸入一個(gè)要導(dǎo)入的模塊import osname=input("請(qǐng)輸入你要導(dǎo)入的模塊:")__import__(name) # 可以動(dòng)態(tài)導(dǎo)入模塊

          幫 助

          • help : 函數(shù)用于查看函數(shù)或模塊用途的詳細(xì)說(shuō)明

          print(help(str)) #查看字符串的用途

          調(diào)用相關(guān)

          • callable : 用于檢查一個(gè)對(duì)象是否是可調(diào)用的. 如果返回True, object有可能調(diào)用失敗, 但如果返回False. 那調(diào)用絕對(duì)不會(huì)成功

          a=10print(callable(a)) #False 變量a不能被調(diào)用#def f: print("hello") print(callable(f)) # True 函數(shù)是可以被調(diào)用的

          查看內(nèi)置屬性

          • dir : 查看對(duì)象的內(nèi)置屬性, 訪問(wèn)的是對(duì)象中的__dir__方法

          print(dir(tuple)) #查看元組的方法

          質(zhì)文章,第一時(shí)間送達(dá)!

          作者 | Erik-Jan van Baaren

          策劃 | 萬(wàn)佳

          出處 | 架構(gòu)頭條

          全球各地的程序員都是怎樣使用 Python?

          我們從最常用的 Python 包入手,去解答上述這個(gè)問(wèn)題。最初,我列出過(guò)去一年在 PyPI 上下載次數(shù)最多的 Python 包。接下來(lái),深入研究其用途、它們之間的關(guān)系和它們備受歡迎的原因。

          1 Urllib3

          下載次數(shù):8.93 億

          Urllib3是一個(gè) Python 的 HTTP 客戶(hù)端,它擁有 Python 標(biāo)準(zhǔn)庫(kù)中缺少的許多功能:

          • 線(xiàn)程安全
          • 連接池
          • 客戶(hù)端 SSL/TLS 驗(yàn)證
          • 使用分段編碼上傳文件
          • 用來(lái)重試請(qǐng)求和處理 HTTP 重定向的助手
          • 支持 gzip 和 deflate 編碼
          • HTTP 和 SOCKS 的代理支持

          不要被名字所誤導(dǎo),Urllib3并不是urllib2的后繼者,而后者是 Python 核心的一部分。如果你想使用盡可能多的 Python 核心功能,或者你能安裝什么東西是受限,那么請(qǐng)查看 urlllib.request。

          https://docs.python.org/3/library/urllib.request.html#module-urllib.request

          對(duì)最終用戶(hù)來(lái)說(shuō),我強(qiáng)烈建議使用 requests 包(參閱列表中的 #6)。這個(gè)包之所以會(huì)排名第一,是因?yàn)橛胁畈欢?1200 個(gè)包依賴(lài) urllib3,其中許多包在這個(gè)列表中的排名也很高。

          https://libraries.io/pypi/urllib3/dependents

          2 Six

          下載次數(shù):7.32 億

          six 是一個(gè)是 Python 2 和 3 的兼容性庫(kù)。這個(gè)項(xiàng)目旨在支持可同時(shí)運(yùn)行在 Python 2 和 3 上的代碼庫(kù)。

          它提供了許多可簡(jiǎn)化 Python 2 和 3 之間語(yǔ)法差異的函數(shù)。一個(gè)容易理解的例子是six.print_。在 Python 3 中,打印是通過(guò)print函數(shù)完成的,而在 Python 2 中,print后面沒(méi)有括號(hào)。因此,有了six.print_后,你就可以使用一個(gè)語(yǔ)句來(lái)同時(shí)支持兩種語(yǔ)言。

          一些事實(shí):

          • 它的名字叫six,是因?yàn)槎艘匀扔诹?/li>
          • 同類(lèi)庫(kù)還可以看看future包。
          • 如果你要將代碼轉(zhuǎn)換為 Python3(并停止支持 2),請(qǐng)查看 2to3。

          雖然我理解它為什么這么受歡迎,但我希望人們能完全放棄 Python 2,因?yàn)橐缽?2020 年 1 月 1 日起 Python 2 的官方支持就已停止。

          PyPI 頁(yè)面

          https://pypi.org/project/six/

          文檔

          https://six.readthedocs.io/

          3 botocore、boto3、s3transfer、awscli

          這里,我把相關(guān)的幾個(gè)項(xiàng)目列在一起:

          botocore(#3,6.6 億次下載)

          s3transfer(#7,5.84 億次下載)

          awscli(#17,3.94 億次下載)

          boto3(#22,3.29 億次下載)

          Botocore是 AWS 的底層接口。Botocore是 Boto3 庫(kù)(#22)的基礎(chǔ),后者讓你可以使用 Amazon S3 和 Amazon EC2 一類(lèi)的服務(wù)。Botocore 還是 AWS-CLI 的基礎(chǔ),后者為 AWS 提供統(tǒng)一的命令行界面。

          S3transfer(#7)是用于管理 Amazon S3 傳輸?shù)?Python 庫(kù)。它正在積極開(kāi)發(fā)中,其介紹頁(yè)面不推薦人們現(xiàn)在使用,或者至少等版本固定下來(lái)再用,因?yàn)槠?API 可能發(fā)生變化,在次要版本之間都可能更改。Boto3、AWS-CLI和其他許多項(xiàng)目都依賴(lài)s3transfer。

          令人驚訝的是,這些針對(duì) AWS 庫(kù)的排名竟如此之高——這充分說(shuō)明了 AWS 有多厲害。

          4 Pip

          下載次數(shù):6.27 億

          我想,你們大多數(shù)人都知道并且很喜歡 pip,它是 Python 的包安裝器。你可以用 pip 輕松地從 Python 包索引和其他索引(例如本地鏡像或帶有私有軟件的自定義索引)來(lái)安裝軟件包。

          有關(guān) pip 的一些有趣事實(shí):

          • pip是“Pip Installs Packages”的首字母遞歸縮寫(xiě)。
          • pip很容易使用。要安裝一個(gè)包只需pip install <package name>即可,而刪除包只需pip uninstall <package name>即可。
          • 最大優(yōu)點(diǎn)之一是它可以獲取包列表,通常以requirements.txt文件的形式獲取。該文件能選擇包含所需版本的詳細(xì)規(guī)范。大多數(shù) Python 項(xiàng)目都包含這樣的文件。
          • 如果結(jié)合使用pip與virtualenv(列表中的 #57),就可以創(chuàng)建可預(yù)測(cè)的隔離環(huán)境,同時(shí)不會(huì)干擾底層系統(tǒng),反之亦然。要了解更多細(xì)節(jié),請(qǐng)查看這篇文章:

          https://medium.com/better-programming/stop-installing-python-packages-globally-use-virtual-environments-a31dee9fb2de

          5 Python-dateutil

          下載次數(shù):6.17 億

          python-dateutil模塊提供了對(duì)標(biāo)準(zhǔn)datetime模塊的強(qiáng)大擴(kuò)展。我的經(jīng)驗(yàn)是,常規(guī)的Python datetime缺少哪些功能,python-dateutil就能補(bǔ)足那一塊。

          你可以用這個(gè)庫(kù)做很多很棒的事情。其中,我發(fā)現(xiàn)的一個(gè)特別有用的功能就是:模糊解析日志文件中的日期,例如:

          from dateutil.parser import parse
          logline='INFO 2020-01-01T00:00:01 Happy new year, human.'timestamp=parse(log_line, fuzzy=True)print(timestamp)# 2020-01-01 00:00:01
          

          6 Requests

          下載次數(shù):6.11 億

          Requests建立在我們的 #1 庫(kù)——urllib3基礎(chǔ)上。它讓 Web 請(qǐng)求變得非常簡(jiǎn)單。相比urllib3來(lái)說(shuō),很多人更喜歡這個(gè)包。而且使用它的最終用戶(hù)可能也比urllib3更多。后者更偏底層,并且考慮到它對(duì)內(nèi)部的控制級(jí)別,它一般是作為其他項(xiàng)目的依賴(lài)項(xiàng)。

          下面這個(gè)例子說(shuō)明 requests 用起來(lái)有多簡(jiǎn)單:

          import requests
          r=requests.get('https://api.github.com/user', auth=('user', 'pass'))r.status_code# 200r.headers['content-type']# 'application/json; charset=utf8'r.encoding# 'utf-8'r.text# u'{"type":"User"...'r.json# {u'disk_usage': 368627, u'private_gists': 484, ...}
          

          PyPI 頁(yè)面

          https://pypi.org/project/requests

          文檔

          https://2.python-requests.org/en/master/

          7 S3transfer

          這里把 #3、#7、#17 和 #22 放在一起介紹,因?yàn)樗鼈兊年P(guān)系非常密切。

          8 Certifi

          下載次數(shù):5.52 億

          近年來(lái),幾乎所有網(wǎng)站都轉(zhuǎn)向 SSL,你可以通過(guò)地址欄中的小鎖符號(hào)來(lái)識(shí)別它。加了小鎖意味著與該站點(diǎn)的通信是安全和加密的,能防止竊聽(tīng)行為。

          小鎖告訴我們此網(wǎng)站已使用 SSL 保護(hù)

          加密過(guò)程是基于 SSL 證書(shū)的,并且這些 SSL 證書(shū)由受信任的公司或非營(yíng)利組織(如 LetsEncrypt)創(chuàng)建。這些組織使用他們的(中間)證書(shū)對(duì)這些證書(shū)進(jìn)行數(shù)字簽名。

          你的瀏覽器使用這些證書(shū)的公開(kāi)可用部分來(lái)驗(yàn)證這些簽名,這樣就能確保你正查看的是真實(shí)內(nèi)容,并且沒(méi)有人能窺探到通信數(shù)據(jù)。Python 軟件也能做同樣事情。這就是 certifi 的用途所在。它與 Chrome、Firefox 和 Edge 等網(wǎng)絡(luò)瀏覽器隨附的根證書(shū)集合沒(méi)有太大區(qū)別。

          Certifi是根證書(shū)的一個(gè)精選集合,有了它,你的 Python 代碼就能驗(yàn)證 SSL 證書(shū)的可信度。

          如此處所示,許多項(xiàng)目信任并依賴(lài) certifi。這也是該項(xiàng)目排名如此之高的原因所在。

          https://libraries.io/pypi/certifi/dependents

          certifi PyPI 頁(yè)面

          https://pypi.org/project/certifi/

          文檔

          https://certifiio.readthedocs.io/en/latest/

          9 Idna

          下載次數(shù):5.27 億

          根據(jù)其 PyPI 頁(yè)面,idna提供了“對(duì) RFC5891 中指定的應(yīng)用程序中國(guó)際化域名(IDNA)協(xié)議的支持。”

          可能你像我一樣也是一頭霧水,不知道Idna是什么,有什么用!據(jù)悉,應(yīng)用程序中的國(guó)際化域名(IDNA)是一種用來(lái)處理包含非 ASCII 字符的域名機(jī)制。但是,原始域名系統(tǒng)已經(jīng)提供對(duì)基于非 ASCII 字符的域名支持。所以,哪有問(wèn)題?

          問(wèn)題在于應(yīng)用程序(例如電子郵件客戶(hù)端和 Web 瀏覽器)不支持非 ASCII 字符。更具體地說(shuō),電子郵件和 HTTP 用的協(xié)議不支持這些字符。對(duì)許多國(guó)家來(lái)說(shuō),這沒(méi)什么問(wèn)題,但是像中國(guó)、俄羅斯、德國(guó)、希臘和印度尼西亞等國(guó)家,這是個(gè)問(wèn)題。最后,來(lái)自這些地方的一群聰明人想到 IDNA。

          IDNA的核心是兩個(gè)函數(shù):ToASCII和ToUnicode。ToASCII會(huì)將國(guó)際 Unicode 域轉(zhuǎn)換為 ASCII 字符串。ToUnicode則逆轉(zhuǎn)該過(guò)程。在IDNA包中,這些函數(shù)稱(chēng)為idna.encode和idna.decode,如以下代碼片段所示:

          import idnaidna.encode('ドメイン.テスト')# b'xn--eckwd4c7c.xn--zckzah'print(idna.decode('xn--eckwd4c7c.xn--zckzah'))# ドメイン.テスト
          

          如果你是受虐狂,則可以閱讀 RFC-3490 了解這一編碼的詳細(xì)信息。

          PyPI 頁(yè)面

          https://pypi.org/project/idna/

          GitHub 頁(yè)面

          https://github.com/kjd/idna

          10 PyYAML

          下載次數(shù):5.25 億

          YAML是一種數(shù)據(jù)序列化格式。它的設(shè)計(jì)宗旨是讓人類(lèi)和計(jì)算機(jī)都能很容易地閱讀代碼——人類(lèi)很容易讀寫(xiě)它的內(nèi)容,計(jì)算機(jī)也可以解析它。

          PyYAML是 Python 的YAML解析器和發(fā)射器,這意味著它可以讀寫(xiě)YAML。它會(huì)把任何 Python 對(duì)象寫(xiě)成YAML:列表、字典,甚至是類(lèi)實(shí)例都包括在內(nèi)。

          Python 提供了自己的配置解析器,但是與 Python 的ConfigParser的基本.ini文件結(jié)構(gòu)相比,YAML 提供更多功能。

          https://docs.python.org/3/library/configparser.html

          例如,YAML可以存儲(chǔ)任何數(shù)據(jù)類(lèi)型:布爾值、列表、浮點(diǎn)數(shù)等等。ConfigParser會(huì)將所有內(nèi)容存儲(chǔ)為內(nèi)部字符串。如果要使用ConfigParser加載整數(shù),則你需要指定自己要顯式獲取一個(gè)int:

          config.getint(“section”, “my_int”)
          

          pyyaml能自動(dòng)識(shí)別類(lèi)型,所以這將使用PyYAML返回你的int:

          config[“section”][“my_int”]
          

          YAML還允許任意的 deep trees,雖然不是每個(gè)項(xiàng)目都需要這種東西,但是需要時(shí),它就可以派上用場(chǎng)。你可能有自己的偏好,但是許多項(xiàng)目都使用YAML作為配置文件,所以這個(gè)項(xiàng)目是很受歡迎的。

          PyPI 頁(yè)面

          https://pypi.org/project/PyYAML/

          文檔

          https://pyyaml.org/

          11 Pyasn1

          下載次數(shù):5.12 億

          像上面的IDNA一樣,這個(gè)項(xiàng)目也非常有用:

          ASN.1 類(lèi)型和 DER/BER/CER 編碼(X.208)的純 Python 實(shí)現(xiàn)

          所幸這個(gè)已有數(shù)十年歷史的標(biāo)準(zhǔn)有很多信息可用。ASN.1是 Abstract Syntax Notation One 的縮寫(xiě),它就像是數(shù)據(jù)序列化的教父。它來(lái)自電信行業(yè)。也許你知道協(xié)議緩沖區(qū)或 Apache Thrift?這就是它們的 1984 年版本。

          ASN.1 描述了系統(tǒng)之間的跨平臺(tái)接口,以及可以通過(guò)該接口發(fā)送的數(shù)據(jù)結(jié)構(gòu)。

          還記得 Certifi(請(qǐng)參閱 #8)嗎?ASN.1 用于定義 HTTPS 協(xié)議和其他許多加密系統(tǒng)中使用的證書(shū)格式。它也用在了 SNMP、LDAP、Kerberos、UMTS、LTE 和 VOIP 協(xié)議中。

          這是一個(gè)非常復(fù)雜的規(guī)范,并且某些實(shí)現(xiàn)已被證明滿(mǎn)是漏洞。你可能還會(huì)喜歡關(guān)于 ASN.1 的這個(gè)有趣的 Reddit 帖子。

          https://www.reddit.com/r/programming/comments/1hf7ds/useful_old_technologies_asn1/

          一個(gè)建議,除非你真的需要,否則還是敬而遠(yuǎn)之吧。但由于它用在很多地方,因此許多包都依賴(lài)這個(gè)包。

          12 Docutils

          下載次數(shù):5.08 億

          Docutils是一個(gè)模塊化系統(tǒng),用來(lái)將純文本文檔處理為很多有用的格式,例如 HTML、XML 和 LaTeX 等。Docutils能讀取reStructuredText格式的純文本文檔,這種格式是類(lèi)似于 MarkDown 的易讀標(biāo)記語(yǔ)法。

          你可能聽(tīng)說(shuō)過(guò),甚至讀過(guò) PEP 文檔。

          https://www.python.org/dev/peps/pep-0012/

          那么什么是 PEP 文檔?最早的 PEP 文檔,PEP-1 為我們提供很好的解釋?zhuān)?/p>

          PEP 的意思是 Python 增強(qiáng)提案。一個(gè) PEP 就是一個(gè)設(shè)計(jì)文檔,用來(lái)向 Python 社區(qū)提供信息,或描述 Python 或其過(guò)程或環(huán)境的新功能。PEP 應(yīng)該提供該功能的簡(jiǎn)明技術(shù)規(guī)范以及功能的原理。

          PEP 文檔使用固定的reStructuredText模板編寫(xiě),并使用docutils轉(zhuǎn)換為格式正確的文檔。

          Docutils 也是Sphinx的核心。Sphinx用于創(chuàng)建文檔項(xiàng)目。如果Docutils是一臺(tái)機(jī)器,則Sphinx就是工廠。它最初是為了構(gòu)建 Python 文檔而創(chuàng)建的,但其他許多項(xiàng)目也使用它為代碼提供文檔。你可能已經(jīng)讀過(guò) readthedocs.org 上的文檔,那里的大多數(shù)文檔都是由Sphinx和docutils創(chuàng)建的。

          13Chardet

          下載次數(shù):5.01 億

          你可以用chardet模塊來(lái)檢測(cè)文件或數(shù)據(jù)流的字符集。比如說(shuō),需要分析大量隨機(jī)文本時(shí),這會(huì)很有用。但你也可以在處理遠(yuǎn)程下載的數(shù)據(jù),但不知道用的是什么字符集時(shí)使用它。

          安裝chardet后,你還有一個(gè)名為chardetect的命令行工具,用法如下:

          chardetect somefile.txtsomefile.txt: ascii with confidence 1.0
          

          你還能通過(guò)編程方式使用這個(gè)庫(kù),具體參閱文檔。Chardet是requests等許多包的需求。我覺(jué)得沒(méi)有多少人會(huì)單獨(dú)使用chardet,所以它這么流行肯定是因?yàn)檫@些依賴(lài)項(xiàng)。

          https://chardet.readthedocs.io/en/latest/usage.html

          14 RSA

          下載次數(shù):4.92 億

          rsa包是一個(gè)純 Python 的 RSA 實(shí)現(xiàn)。它支持:

          • 加密和解密
          • 簽名和驗(yàn)證簽名
          • 根據(jù) PKCS#1 1.5 版生成密鑰

          它既可以用作 Python 庫(kù),也能在命令行中使用。

          一些事實(shí):

          • RSA 是 RonRivest、Adi Shamir 和 Leonard Adleman 三人姓的首字母。他們?cè)?1977 年發(fā)明該算法。
          • RSA 是最早的公鑰密碼系統(tǒng)之一,被廣泛用于安全數(shù)據(jù)傳輸。在這樣的密碼系統(tǒng)中,有兩個(gè)密鑰:公共部分和私有部分。你用公鑰加密數(shù)據(jù),只能用私鑰解密數(shù)據(jù)。
          • RSA 是一種 slow algorithm。它很少用于直接加密用戶(hù)數(shù)據(jù)。通常,RSA 用于安全傳遞對(duì)稱(chēng)密鑰加密的共享密鑰,這樣加密和解密大量數(shù)據(jù)時(shí)會(huì)快得多。

          以下代碼段展示了如何在一個(gè)非常簡(jiǎn)單的用例中使用 RSA:

          import rsa
          # Bob creates a key pair:(bob_pub, bob_priv)=rsa.newkeys(512)
          # Alice ecnrypts a message for Bob# with his public keycrypto=rsa.encrypt('hello Bob!', bob_pub)
          # When Bob gets the message, he# decrypts it with his private key:message=rsa.decrypt(crypto, bob_priv)print(message.decode('utf8'))# hello Bob!
          

          假設(shè) Bob 保留自己的私鑰 private,那么 Alice 可以確定他是唯一可以閱讀該消息的人。但是,Bob 不能確定是 Alice 發(fā)送了該消息,因?yàn)槿魏稳硕伎梢垣@取并使用他的公鑰。為證明是她,Alice 可以用她的私鑰在郵件上簽名。Bob 可以用她的公鑰驗(yàn)證此簽名,確保消息的確是她發(fā)送的。

          諸如google-auth(#37)、oauthlib(#54)、awscli(#17)之類(lèi)的包都依賴(lài)rsa包。很少有人會(huì)將這個(gè)工具獨(dú)立使用,因?yàn)橛懈臁⒏奶娲椒ā?/p>

          15 Jmespath

          下載次數(shù):4.73 億

          在 Python 中用 JSON 非常容易,因?yàn)樗?Python 字典上的映射非常好。對(duì)我來(lái)說(shuō),這是它最好的特性之一。

          實(shí)話(huà)實(shí)說(shuō)——盡管我已經(jīng)用 JSON 做過(guò)很多工作,但我從未聽(tīng)說(shuō)過(guò)這個(gè)包。我只是用 json.loads 并從字典中手動(dòng)獲取數(shù)據(jù),也許再搞個(gè)循環(huán)什么的。

          JMESPath,發(fā)音為“James path”,使 Python 中的 JSON 更容易使用。它允許你聲明性地指定如何從 JSON 文檔中提取元素。以下是一些基本示例:

          import jmespath
          # Get a specific elementd={"foo": {"bar": "baz"}}print(jmespath.search('foo.bar', d))# baz
          # Using a wildcard to get all namesd={"foo": {"bar": [{"name": "one"}, {"name": "two"}]}}print(jmespath.search('foo.bar[*].name', d))# [“one”, “two”]
          

          PyPI 頁(yè)面

          https://pypi.org/project/jmespath/

          文檔

          http://jmespath.org/

          16 Setuptools

          下載次數(shù):4.01 億

          它是用于創(chuàng)建 Python 包的工具。不過(guò),其文檔很糟糕。它沒(méi)有清晰描述它的用途,并且文檔中包含無(wú)效鏈接。最好的信息源是這個(gè)站點(diǎn),特別是這個(gè)創(chuàng)建 Python 包的指南。

          https://packaging.python.org/

          https://packaging.python.org/tutorials/packaging-projects/

          17 Awscli

          這里把 #3、#7、#17 和 #22 放在一起介紹,因?yàn)樗鼈兊年P(guān)系非常密切。

          18 Pytz

          下載次數(shù):3.94 億次

          像dateutils(#5)一樣,這個(gè)庫(kù)可幫助你處理日期和時(shí)間。有時(shí)候,時(shí)區(qū)處理起來(lái)可能很麻煩。幸好有這樣的包,可以讓事情變得簡(jiǎn)單些。

          我自己關(guān)于計(jì)算機(jī)上處理時(shí)間的經(jīng)驗(yàn)總結(jié)來(lái)說(shuō)是:始終在內(nèi)部使用 UTC。僅當(dāng)生成供人類(lèi)讀取的輸出時(shí),才轉(zhuǎn)換為本地時(shí)間。

          這是pytz用法的示例:

          from datetime import datetimefrom pytz import timezone
          amsterdam=timezone('Europe/Amsterdam')
          ams_time=amsterdam.localize(datetime(2002, 10, 27, 6, 0, 0))print(ams_time)# 2002-10-27 06:00:00+01:00
          # It will also know when it's Summer Time# in Amsterdam (similar to Daylight Savings Time):ams_time=amsterdam.localize(datetime(2002, 6, 27, 6, 0, 0))print(ams_time)# 2002-06-27 06:00:00+02:00
          

          19 Futures

          下載次數(shù):3.89 億

          從 Python 3.2 開(kāi)始,python 提供current.futures模塊,可幫助你實(shí)現(xiàn)異步執(zhí)行。futures 包是該庫(kù)適用于 Python 2 的 backport。它不適用于 Python3 用戶(hù),因?yàn)?Python 3 原生提供了該模塊。

          正如我之前提到的,從 2020 年 1 月 1 日起,Python 2 的官方支持停止。希望我明年重新再來(lái)看的時(shí)候,這個(gè)包不會(huì)再出現(xiàn)在前 22 名中吧。

          下面是 futures 的基本示例:

          from concurrent.futures import ThreadPoolExecutorfrom time import sleep
          def return_after_5_secs(message): sleep(5) return message
          pool=ThreadPoolExecutor(3)
          future=pool.submit(return_after_5_secs, ("Hello world"))
          print(future.done)# Falsesleep(5)print(future.done)# Trueprint(future.result)# Hello World
          

          如你所見(jiàn),你可以創(chuàng)建一個(gè)線(xiàn)程池并提交一個(gè)要由這些線(xiàn)程之一執(zhí)行的函數(shù)。同時(shí),你的程序?qū)⒗^續(xù)在主線(xiàn)程中運(yùn)行。這是并行執(zhí)行程序的簡(jiǎn)便方法。

          20 Colorama

          下載次數(shù):3.7 億

          使用 Colorama,你可以為終端添加一些顏色:

          https://pypi.org/project/colorama/

          這樣做起來(lái)非常容易,具體請(qǐng)查看以下示例代碼:

          from colorama import Fore, Back, Style
          print(Fore.RED + 'some red text')print(Back.GREEN + 'and with a green background')print(Style.DIM + 'and in dim text')print(Style.RESET_ALL)print('back to normal now')
          

          21 Simplejson

          下載次數(shù):3.41 億

          原生的json模塊有什么問(wèn)題,才需要這種高級(jí)替代方案呢?并沒(méi)有!實(shí)際上,Python 的json就是simplejson。但是simplejson也有一些優(yōu)點(diǎn):

          • 它適用于更多的 Python 版本。
          • 它比 Python 更新的頻率更頻繁。
          • 它有用 C 編寫(xiě)的(可選)部分,因此速度非常快。

          你經(jīng)常會(huì)在支持 JSON 的腳本中看到以下內(nèi)容:

          try: import simplejson as jsonexcept ImportError: import json
          

          除非你需要標(biāo)準(zhǔn)庫(kù)中所沒(méi)有的內(nèi)容,否則我只會(huì)使用json。Simplejson可以比json快很多,因?yàn)樗幸恍┯?C 實(shí)現(xiàn)的部分。除非你正在處理成千上萬(wàn)個(gè) JSON 文件,否則這種優(yōu)勢(shì)對(duì)你來(lái)說(shuō)不是什么大事。還可以看看 UltraJSON,它應(yīng)該更快一些,因?yàn)樗鼛缀跛械拇a都是用 C 編寫(xiě)的。

          22 Boto3

          這里把 #3、#7、#17 和 #22 放在一起介紹,因?yàn)樗鼈兊年P(guān)系非常密切。

          23 小結(jié)

          僅僅介紹這 22 個(gè)包恐怕不夠,因?yàn)榕旁诤竺娴脑S多包都是像我們這樣最終用戶(hù)感興趣的。

          通過(guò)制作這份列表,我了解到一些新東西:

          1. 許多排名靠前的 package(包)都提供某種核心功能,例如處理時(shí)間、配置文件、加密和標(biāo)準(zhǔn)化等。它們往往是其他項(xiàng)目的依賴(lài)項(xiàng)。
          2. 一個(gè)常見(jiàn)的主題是連接性。這些包大多允許你連接到服務(wù)器和服務(wù),或支持其他包這樣做。
          3. 剩下的那些是對(duì) Python 的擴(kuò)展。創(chuàng)建 Python 包的工具、幫助創(chuàng)建文檔的工具、創(chuàng)建版本之間兼容性的庫(kù)等。

          延展閱讀:

          https://medium.com/better-programming/the-22-most-used-python-packages-in-the-world-7020a904b2e

          下是爬取京東商品詳情的Python3代碼,以excel存放鏈接的方式批量爬取。excel如下

          代碼如下

          私信小編01即可獲取大量Python學(xué)習(xí)資源

          from selenium import webdriver
          from lxml import etree
          from selenium.webdriver.common.by import By
          from selenium.webdriver.common.keys import Keys
          import datetime
          import calendar
          import logging
          from logging import handlers
          import requests
          import os
          import time
          import pymssql
          import openpyxl
          import xlrd
          import codecs
          
          
          
          class EgongYePing:
          
               options=webdriver.FirefoxOptions()
               fp=webdriver.FirefoxProfile()
               fp.set_preference("browser.download.folderList",2)  
               fp.set_preference("browser.download.manager.showWhenStarting",False)
               fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/zip,application/octet-stream")
               global driver 
               driver=webdriver.Firefox(firefox_profile=fp,options=options)
               def Init(self,url,code):
                                 print(url.strip())
                                 driver.get(url.strip())
                                 #driver.refresh()
                                 # 操作瀏覽器屬于異步,在網(wǎng)絡(luò)出現(xiàn)問(wèn)題的時(shí)候。可能代碼先執(zhí)行。但是請(qǐng)求頁(yè)面沒(méi)有應(yīng)答。所以硬等
                                 time.sleep(int(3))
                                 html=etree.HTML(driver.page_source) 
                                 if driver.title!=None:
                                   listImg=html.xpath('//*[contains(@class,"spec-list")]//ul//li//img')
                                   if len(listImg)==0:
                                        pass
                                   if len(listImg)>0:
                                                      imgSrc=''
                                                      for item in range(len(listImg)):    
                                                           imgSrc='https://img14.360buyimg.com/n0/'+listImg[item].attrib["data-url"]
                                                           print('頭圖下載:'+imgSrc)
                                                           try:
                                                            Headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                            r=requests.get(imgSrc, headers=Headers, stream=True)
                                                            if r.status_code==200:
                                                               imgUrl=''
                                                               if item==0:
                                                                    imgUrl+=code + "_主圖_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                               else:
                                                                    imgUrl+=code + "_附圖_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                               open(os.getcwd()+'/img/'+  imgUrl , 'wb').write(r.content) # 將內(nèi)容寫(xiě)入圖片
                                                            del r
                                                           except Exception as e:
                                                              print("圖片禁止訪問(wèn):"+imgSrc) 
                                   listImg=html.xpath('//*[contains(@class,"ssd-module")]') 
                                   if len(listImg)==0:
                                        listImg=html.xpath('//*[contains(@id,"J-detail-content")]//div//div//p//img')
                                   if len(listImg)==0:
                                        listImg=html.xpath('//*[contains(@id,"J-detail-content")]//img')
                                   if len(listImg)>0:
                                         for index in range(len(listImg)):  
                                              detailsHTML=listImg[index].attrib
                                              if 'data-id' in detailsHTML:
                                                    try:
                                                     details=driver.find_element_by_class_name("animate-"+listImg[index].attrib['data-id']).value_of_css_property('background-image')
                                                     details=details.replace('url(' , ' ')
                                                     details=details.replace(')' , ' ')
                                                     newDetails=details.replace('"', ' ')
                                                     details=newDetails.strip()
                                                     print("詳情圖下載:"+details)
                                                     try:
                                                            Headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                            r=requests.get(details, headers=Headers, stream=True)
                                                            if r.status_code==200:
                                                               imgUrl=''
                                                               imgUrl+=code + "_詳情圖_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                               open(os.getcwd()+'/img/'+   imgUrl, 'wb').write(r.content) # 將內(nèi)容寫(xiě)入圖片
                                                            del r
                                                     except Exception as e:
                                                              print("圖片禁止訪問(wèn):"+details) 
                                                    except Exception as e:      
                                                         print('其他格式的圖片不收錄');       
                                              if  'src' in detailsHTML:
                                                   try:
                                                     details=listImg[index].attrib['src']
                                                     if 'http' in details:
                                                               pass
                                                     else:
                                                               details='https:'+details
                                                     print("詳情圖下載:"+details)
                                                     try:
                                                            Headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                            r=requests.get(details, headers=Headers, stream=True)
                                                            if r.status_code==200:
                                                               imgUrl=''
                                                               imgUrl+=code + "_詳情圖_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                               open(os.getcwd()+'/img/'+   imgUrl, 'wb').write(r.content) # 將內(nèi)容寫(xiě)入圖片
                                                            del r
                                                     except Exception as e:
                                                              print("圖片禁止訪問(wèn):"+details) 
                                                   except Exception as e:      
                                                         print('其他格式的圖片不收錄'); 
          
                                 print('結(jié)束執(zhí)行')
          
                   
          
               @staticmethod
               def readxlsx(inputText):
                  filename=inputText
                  inwb=openpyxl.load_workbook(filename)  # 讀文件
                  sheetnames=inwb.get_sheet_names()  # 獲取讀文件中所有的sheet,通過(guò)名字的方式
                  ws=inwb.get_sheet_by_name(sheetnames[0])  # 獲取第一個(gè)sheet內(nèi)容
                  # 獲取sheet的最大行數(shù)和列數(shù)
                  rows=ws.max_row
                  cols=ws.max_column
                  for r in range(1,rows+1):
                      for c in range(1,cols):
                          if ws.cell(r,c).value!=None and r!=1 :
                           if 'item.jd.com' in str(ws.cell(r,c+1).value) and str(ws.cell(r,c+1).value).find('i-item.jd.com')==-1:
                               print('支持:'+str(ws.cell(r,c).value)+'|'+str(ws.cell(r,c+1).value))
                               EgongYePing().Init(str(ws.cell(r,c+1).value),str(ws.cell(r,c).value))
                           else:
                               print('當(dāng)前格式不支持:'+(str(ws.cell(r,c).value)+'|'+str(ws.cell(r,c+1).value)))
                               pass
                  pass
          
          if __name__=="__main__":
                           start=EgongYePing()
                           start.readxlsx(r'C:\Users\newYear\Desktop\爬圖.xlsx')
          

          基本上除了過(guò)期的商品無(wú)法訪問(wèn)以外。對(duì)于京東的三種頁(yè)面結(jié)構(gòu)都做了處理。能訪問(wèn)到的商品頁(yè)面。還做了模擬瀏覽器請(qǐng)求訪問(wèn)和下載。基本不會(huì)被反爬蟲(chóng)屏蔽下載。

          上面這一段是以火狐模擬器運(yùn)行

          上面這一段是模擬瀏覽器下載。如果不加上這一段。經(jīng)常會(huì)下載幾十張圖片后,很長(zhǎng)一段時(shí)間無(wú)法正常下載圖片。因?yàn)闆](méi)有請(qǐng)求頭被認(rèn)為是爬蟲(chóng)。

          上面這段是京東的商品詳情頁(yè)面,經(jīng)常會(huì)三種?(可能以后會(huì)更多的頁(yè)面結(jié)構(gòu))

          所以做了三段解析。只要沒(méi)有抓到圖片就換一種解析方式。這楊就全了。

          京東的圖片基本只存/1.jpg。然后域名是 https://img14.360buyimg.com/n0/。所以目前要拼一下。

          京東還有個(gè)很蛋疼的地方是圖片以data-id拼進(jìn)div的背景元素里。所以取出來(lái)的時(shí)候要繞一下。還好也解決了。

          以下是爬取京東商品詳情的Python3代碼,以excel存放鏈接的方式批量爬取。excel如下

          因?yàn)檫@次是淘寶和京東一起爬取。所以在一個(gè)excel里。代碼里區(qū)分淘寶和京東的鏈接。以下是代碼

          from selenium import webdriver
          from lxml import etree
          from selenium.webdriver.common.by import By
          from selenium.webdriver.common.keys import Keys
          import datetime
          import calendar
          import logging
          from logging import handlers
          import requests
          import os
          import time
          import pymssql
          import openpyxl
          import xlrd
          import codecs
          
          
          
          class EgongYePing:
          
               options=webdriver.FirefoxOptions()
               fp=webdriver.FirefoxProfile()
               fp.set_preference("browser.download.folderList",2)  
               fp.set_preference("browser.download.manager.showWhenStarting",False)
               fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/zip,application/octet-stream")
               global driver 
               driver=webdriver.Firefox(firefox_profile=fp,options=options)
               def Init(self,url,code):
                                 #driver=webdriver.Chrome('D:\python3\Scripts\chromedriver.exe')
                                 #driver.get(url)
                                 print(url.strip())
                                 driver.get(url.strip())
                                 #driver.refresh()
                                 # 操作瀏覽器屬于異步,在網(wǎng)絡(luò)出現(xiàn)問(wèn)題的時(shí)候。可能代碼先執(zhí)行。但是請(qǐng)求頁(yè)面沒(méi)有應(yīng)答。所以硬等
                                 time.sleep(int(3))
                                 html=etree.HTML(driver.page_source) 
                                 if driver.title!=None:
                                   listImg=html.xpath('//*[contains(@id,"J_UlThumb")]//img')
                                   if len(listImg)==0:
                                        pass
                                   if len(listImg)>0:
                                                      imgSrc=''
                                                      for item in range(len(listImg)):    
                                                           search=listImg[item].attrib
                                                           if 'data-src' in search:
                                                              imgSrc=listImg[item].attrib["data-src"].replace('.jpg_50x50','')
                                                           else:
                                                              imgSrc=listImg[item].attrib["src"]
                                                           if 'http' in imgSrc:
                                                               pass
                                                           else:
                                                               imgSrc='https:'+imgSrc
                                                           print('頭圖下載:'+imgSrc)
                                                           try:
                                                            Headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                            r=requests.get(imgSrc, headers=Headers, stream=True)
                                                            if r.status_code==200:
                                                               imgUrl=''
                                                               if item==0:
                                                                    imgUrl+=code + "_主圖_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                               else:
                                                                    imgUrl+=code + "_附圖_" + str(item)  + '.' + imgSrc.split('//')[1].split('/')[len(imgSrc.split('//')[1].split('/'))-1].split('.')[1]
                                                               open(os.getcwd()+'/img/'+  imgUrl , 'wb').write(r.content) # 將內(nèi)容寫(xiě)入圖片
                                                            del r
                                                           except Exception as e:
                                                              print("圖片禁止訪問(wèn):"+imgSrc) 
                                   listImg=html.xpath('//*[contains(@id,"J_DivItemDesc")]//img')
                                   if len(listImg)>0:
                                         for index in range(len(listImg)):  
                                              detailsHTML=listImg[index].attrib
                                              if 'data-ks-lazyload' in detailsHTML:
                                                  details=listImg[index].attrib["data-ks-lazyload"]
                                                  print("詳情圖下載:"+details)
                                              else:
                                                  details=listImg[index].attrib["src"]
                                                  print("詳情圖下載:"+details)
                                              try:
                                                            Headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
                                                            r=requests.get(details, headers=Headers, stream=True)
                                                            if r.status_code==200:
                                                               imgUrl=''
                                                               details=details.split('?')[0]
                                                               imgUrl+=code + "_詳情圖_" + str(index)  + '.' + details.split('//')[1].split('/')[len(details.split('//')[1].split('/'))-1].split('.')[1]
                                                               open(os.getcwd()+'/img/'+   imgUrl, 'wb').write(r.content) # 將內(nèi)容寫(xiě)入圖片
                                                            del r
                                              except Exception as e:
                                                              print("圖片禁止訪問(wèn):"+details)  
                                 print('結(jié)束執(zhí)行')
          
                   
          
               @staticmethod
               def readxlsx(inputText):
                  filename=inputText
                  inwb=openpyxl.load_workbook(filename)  # 讀文件
                  sheetnames=inwb.get_sheet_names()  # 獲取讀文件中所有的sheet,通過(guò)名字的方式
                  ws=inwb.get_sheet_by_name(sheetnames[0])  # 獲取第一個(gè)sheet內(nèi)容
                  # 獲取sheet的最大行數(shù)和列數(shù)
                  rows=ws.max_row
                  cols=ws.max_column
                  for r in range(1,rows+1):
                      for c in range(1,cols):
                          if ws.cell(r,c).value!=None and r!=1 :
                           if 'item.taobao.com' in str(ws.cell(r,c+1).value):
                               print('支持:'+str(ws.cell(r,c).value)+'|'+str(ws.cell(r,c+1).value))
                               EgongYePing().Init(str(ws.cell(r,c+1).value),str(ws.cell(r,c).value))
                           else:
                               print('當(dāng)前格式不支持:'+(str(ws.cell(r,c).value)+'|'+str(ws.cell(r,c+1).value)))
                               pass
                  pass
          
          if __name__=="__main__":
                           start=EgongYePing()
                           start.readxlsx(r'C:\Users\newYear\Desktop\爬圖.xlsx')
          

          淘寶有兩個(gè)問(wèn)題,一個(gè)是需要綁定賬號(hào)登錄訪問(wèn)。這里是代碼斷點(diǎn)。然后手動(dòng)走過(guò)授權(quán)。

          第二個(gè)是被休息和懶惰加載。被休息。其實(shí)沒(méi)影響的。一個(gè)頁(yè)面結(jié)構(gòu)已經(jīng)加載出來(lái)了。然后也不會(huì)影響訪問(wèn)其他的頁(yè)面。

          至于懶惰加載嘛。對(duì)我們也沒(méi)啥影響。如果不是直接寫(xiě)在src里那就在判斷一次取 data-ks-lazyload就出來(lái)了。

          最后就是爬取的片段截圖

          建議還是直接將爬取的數(shù)據(jù)存服務(wù)器,數(shù)據(jù)庫(kù),或者圖片服務(wù)器。因?yàn)槌绦蛲孔V的。一萬(wàn)條數(shù)據(jù)。爬了26個(gè)G的文件。最后上傳的時(shí)候差點(diǎn)累死了

          是真的大。最后還要拆包。十幾個(gè)2g壓縮包一個(gè)一個(gè)上傳。才成功。


          主站蜘蛛池模板: 亚洲啪啪综合AV一区| 中文字幕一区二区三区精华液| 亚洲国产精品自在线一区二区| 人妻内射一区二区在线视频| 手机福利视频一区二区| 四虎一区二区成人免费影院网址| 深夜福利一区二区| 久久99国产精品一区二区| 国产精品成人免费一区二区| 亚洲综合激情五月色一区| 国产伦精品一区三区视频| 国产精品 视频一区 二区三区| 亚洲AV无码一区二区三区电影| 国产精品无码AV一区二区三区 | 亚洲国产成人久久综合一区| 日本激情一区二区三区| 国产激情一区二区三区成人91| 在线精品亚洲一区二区| 伊人久久一区二区三区无码| 日本强伦姧人妻一区二区| 亚洲av综合av一区| 国产午夜精品一区二区三区漫画| AV天堂午夜精品一区二区三区| 日韩一区二区久久久久久| 91一区二区视频| 午夜无码一区二区三区在线观看 | 亚洲国产激情在线一区| 欧洲精品码一区二区三区免费看| 国产精品视频分类一区| 一区二区三区内射美女毛片| 久久91精品国产一区二区| 国产伦一区二区三区免费| 国产高清一区二区三区| 日韩人妻无码一区二区三区综合部 | 丝袜无码一区二区三区| 日产精品久久久一区二区| 波多野结衣一区二区三区aV高清| 国产精品一区二区毛卡片| 国产在线观看一区二区三区精品 | 3d动漫精品啪啪一区二区中文 | 精品视频一区二区三三区四区|