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
源: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)制:0b1010
print(hex(10)) # 十六進(jìn)制:0xa
print(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ì)值:2
print(divmod(20,3)) # 求商和余數(shù):(6,2)
print(round(4.50)) # 五舍六入:4
print(round(4.51)) #5
print(pow(10,2,3)) # 如果給了第三個(gè)參數(shù). 表示最后取余:1
print(sum([1,2,3,4,5,6,7,8,9,10])) # 求和:55
print(min(5,3,9,12,7,2)) #求最小值:2
print(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)制:11
print(format(97, 'c' )) # 轉(zhuǎn)換成unicode字符:a
print(format(11, 'd' )) # ?進(jìn)制:11
print(format(11, 'o' )) # 八進(jìn)制:13
print(format(11, 'x' )) # 十六進(jìn)制(?寫(xiě)字母):b
print(format(11, 'X' )) # 十六進(jìn)制(大寫(xiě)字母):B
print(format(11, 'n' )) # 和d?樣:11
print(format(11)) # 和d?樣:11
print(format(123456789, 'e' )) # 科學(xué)計(jì)數(shù)法. 默認(rèn)保留6位小數(shù):1.234568e+08
print(format(123456789, '0.2e' )) # 科學(xué)計(jì)數(shù)法. 保留2位小數(shù)(小寫(xiě)):1.23e+08
print(format(123456789, '0.2E' )) # 科學(xué)計(jì)數(shù)法. 保留2位小數(shù)(大寫(xiě)):1.23E+08
print(format(1.23456789, 'f' )) # 小數(shù)點(diǎn)計(jì)數(shù)法. 保留6位小數(shù):1.234568
print(format(1.23456789, '0.2f' )) # 小數(shù)點(diǎn)計(jì)數(shù)法. 保留2位小數(shù):1.23
print(format(1.23456789, '0.10f')) # 小數(shù)點(diǎn)計(jì)數(shù)法. 保留10位小數(shù):1.2345678900
print(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]) #97
print(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在編碼表中的碼位:97
print(ord('中')) # '中'字在編碼表中的位置:20013
print(chr(65)) # 已知碼位,求字符是什么:A
print(chr(19999)) #丟
for i in range(65536): #打印出0到65535的字符
print(chr(i), end=" ")
print(ascii("@")) #'@'
repr 返回一個(gè)對(duì)象的string形式
s="今天\n吃了%s頓\t飯" % 3
print(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])) #True
print(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 i
lst=[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
# 0
lst=[1,2,3,4,5]
it=iter(lst) # __iter__獲得迭代器
print(it.__next__) #1
print(next(it)) #2 __next__
print(next(it)) #3
print(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+9
print(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
# 4
print(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
# 2
code2="5+6+7"
com2=compile(code2, "", mode="eval")
print(eval(com2)) # 18
code3="name=input('請(qǐng)輸入你的名字:')" #輸入:hello
com3=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)) #-168324845050430382
lst=[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.read
f.close
模塊相關(guān)
__ import__ : 用于動(dòng)態(tài)加載類(lèi)和函數(shù)
# 讓用戶(hù)輸入一個(gè)要導(dǎo)入的模塊
import os
name=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=10
print(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ù)中缺少的許多功能:
不要被名字所誤導(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í):
雖然我理解它為什么這么受歡迎,但我希望人們能完全放棄 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í):
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)。它支持:
它既可以用作 Python 庫(kù),也能在命令行中使用。
一些事實(shí):
以下代碼段展示了如何在一個(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):
你經(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ò)制作這份列表,我了解到一些新東西:
延展閱讀:
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è)上傳。才成功。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。