python之最常用的模塊一籮筐
其實(shí)我挺羨慕火車的
為什么?
他們連擦肩而過都那么久
request模塊:
requests 是一個功能強(qiáng)大、簡單易用的 HTTP 請求庫
- 請求
requests.get('http://httpbin.org/get')
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
- 響應(yīng)
r.url:返回請求網(wǎng)站的 URL
r.status_code:返回響應(yīng)的狀態(tài)碼
r.encoding:返回響應(yīng)的編碼方式
r.cookies:返回響應(yīng)的 Cookie 信息
r.headers:返回響應(yīng)頭
r.headers[‘host’]:返回響應(yīng)頭某屬性
r.content:返回 bytes 類型的響應(yīng)體
r.text:返回字符串,也就是頁面文本
r.content: 返回內(nèi)容的二進(jìn)制形式
r.json():返回josn字典
最常用也就get/post,常用參數(shù)
url
cookie
params get形式的參數(shù)
data post形式的參數(shù)
headers 修改請求頭,偽裝瀏覽器等等
timeout 超時時間
proxies 設(shè)置代理
舉個荔枝,請求百度
# encoding:utf-8
import requests
head = {
'User-Agent': '',
'Referer': '11111'
}
values = {
'name': 'cat',
'id': '1'
}
proxy = {"http": "http://127.0.0.1:8080"}
cookie = {'name': 'gggg'}
site = "http://www.baidu.com/"
# 請求方式主要為get傳值用params,post傳值用data
#response = requests.get(url=site,headers=head,params=values,proxies=proxy,cookies=cookie, timeout=3)
response = requests.post(url=site, headers=head, data=values, proxies=proxy, cookies=cookie)
print(response)
print(response.url)
print(response.cookies)
print(response.status_code)
print(response.encoding)
print(response.content)
print(response.headers)
print(response.url)
print(response.text)
print(response.json())
print(response.history)
BeautifulSoup模塊:
簡單來說,Beautiful Soup是python的一個庫,最主要的功能是從網(wǎng)頁抓取數(shù)據(jù),將 html 解析為對象進(jìn)行處理。
BeautifulSoup 不僅支持 HTML 解析器,還lxml,XML,html5lib 解析器,需要安裝相應(yīng)的庫。如果不安裝,則 Python 會使用 Python 默認(rèn)的解析器,其中 lxml 解析器推薦
一般BS4將HTML文檔對象會轉(zhuǎn)換成如下四種類型組合的文檔樹:
- Tag:標(biāo)簽對象
- NavigableString:字符內(nèi)容, soup.p.string
- BeautifulSoup:表示的是一個文檔的全部內(nèi)容
- Comment:特殊類型的NavigableString, 如果標(biāo)簽中有注釋,則是 comment 對象,可通過 if type(soup.p.string) != bs4.element.Comment:.判斷
主要還是Tag也就是標(biāo)簽,如html頁面中的
,
等等都是tag,而Beautiful Soup可以輕松獲取 各種Tags
如:
soup.title
soup.head
soup.a
soup.p
soup.p.name #p標(biāo)簽的名字
soup.p.string #p標(biāo)簽的內(nèi)容
soup.p.attrs #p標(biāo)簽的屬性,返回的是一個字典
soup.p['class'] #p標(biāo)簽的class屬性
需求總是多樣的,也可以利用find() 和 find_all()是這兩個函數(shù),可以準(zhǔn)確的通過標(biāo)簽的不同屬性輕松地過濾 HTML 頁面,查找需要的標(biāo)簽組或單個標(biāo)簽。唯一的區(qū)別是 find_all() 方法的返回結(jié)果是值包含一個元素的列表,而 find() 方法直接返回結(jié)果.這個語句可以完美詮釋兩者關(guān)系:
soup.find_all('title', limit=1)==soup.find('title')
主要介紹find_all() 方法搜索當(dāng)前tag的所有tag子節(jié)點(diǎn),并判斷是否符合過濾器的條件。
find_all( name , attrs , recursive , text , **kwargs )
name :查找所有名字為 name 的tag,字符串對象會被自動忽略掉;
attrs:根據(jù)屬性查詢,使用字典類型;
text :可以搜搜文檔中的字符串內(nèi)容.與 name 參數(shù)的可選值一樣, text 參數(shù)接受字符串 , 正則表達(dá)式 , 列表, True ;
recursive:調(diào)用tag的 find_all() 方法時,Beautiful Soup會檢索當(dāng)前tag的所有子孫節(jié)點(diǎn),如果只想搜索tag的直接子節(jié)點(diǎn),可以使用參數(shù) recursive=False ;
limit:find_all() 方法返回全部的搜索結(jié)構(gòu),如果我們不需要全部結(jié)果,可以使用 limit 參數(shù)限制返回結(jié)果的數(shù)量.效果與SQL中的limit關(guān)鍵字類似,當(dāng)搜索到的結(jié)果數(shù)量達(dá)到 limit 的限制時,就停止搜索返回結(jié)果;
class_ :通過 class_ 參數(shù)搜索有指定CSS類名的tag,class_ 參數(shù)同樣接受不同類型的 過濾器 ,字符串,正則表達(dá)式,方法或 True。
是不是想說什么亂七八糟的,舉個栗子看看,看完還可以吃了
# encoding:utf-8
from bs4 import BeautifulSoup
import re
html = '''
'''
soup = BeautifulSoup(html, 'html.parser')
# 根據(jù)name查詢節(jié)點(diǎn)
print("name為ul的節(jié)點(diǎn):", soup.find_all(name='ul'))
# 根據(jù)attrs查詢節(jié)點(diǎn)
print('根據(jù)attr查詢節(jié)點(diǎn):', soup.find_all(attrs={'name': 'one'}))
print('根據(jù)attr查詢節(jié)點(diǎn):', soup.find_all(attrs={'class': 'cls5'}))
# 根據(jù)text查詢節(jié)點(diǎn)
print('根據(jù)text查詢節(jié)點(diǎn):', soup.find_all(text='3333333333'))
print('根據(jù)text查詢節(jié)點(diǎn)1:', soup.find_all(text=re.compile("abc")))
# 根據(jù)class_查詢
print('根據(jù)class_查詢節(jié)點(diǎn):', soup.find_all(class_='cls3'))
# 根據(jù)id查詢
print('根據(jù)id查詢節(jié)點(diǎn):', soup.find_all(id='aaa'))
# 設(shè)置limit
print('不設(shè)置limit:', soup.ul.find_all(name='li'))
print('設(shè)置limit為1:', soup.ul.find_all(name='li', limit=2))
如果取其中href,可以
link.a['href'] or link.a.get('href')
也可以通過css類名查找
在查找的時候,如果是標(biāo)簽名不加任何修飾,如果是類名前加點(diǎn),如果id名前加#
利用 soup.select() , 返回類型是list
舉個例子:
111
通過標(biāo)簽名查找
print(soup.select('title')) ##打印出標(biāo)簽是title的
通過類名查找
print(soup.select('.b')) ##打印出class類名是b的
通過id名查找
print(soup.select('#abc')) ##打印出id名是abc的
組合查找
print(soup.select('p #abc’ b')) ##打印出p標(biāo)簽中,id=abc,class=b的
屬性查找(注意屬性和標(biāo)簽屬于同一節(jié)點(diǎn).)
print(soup.select("a[class='b']")) ##打印出a標(biāo)簽中class屬性是b的
以上的select方法返回的結(jié)果都是列表形式,可以遍歷形式輸出,然后用get_text()方法來獲取他的內(nèi)容
for i in soup.select('a'):
print(i.get_text()) ##打印出a標(biāo)簽中的文本
urlparse模塊:
-
urlparse.urlparse模塊主要就是將url解析為6個組件,并以元組形式返回,返回的6個部分,分別是:scheme(協(xié)議)、netloc(網(wǎng)絡(luò)位置)、path(路徑)、params(路徑段參數(shù))、query(查詢)、fragment(片段)。
舉個例子:
Import urlparse
a = urlparse.urlparse(‘https:www.cat.com:8080/cat.php?cat=1’)
輸出的結(jié)果為
ParseResult(scheme='https', netloc='www.cat.com:8080', path='/cat.php', params='', query='cat=1, fragment='')
Print a.netloc 為 www.cat.com
Print a.hostname 為 www.cat.com
Print a.port 為 8080
- urlparse.urlsplit和urlparse差不多,將url分為5部分,返回一個包含5個字符串項(xiàng)目的元組:協(xié)議、位置、路徑、查詢、片段
-
urlparse.urljoin主要是拼接URL,它以base作為其基地址,然后與url中的相對地址相結(jié)合組成一個絕對URL地址.最重要就是看/進(jìn)行替換添加,如果最后路徑?jīng)]有/,即追溯到上一個/進(jìn)行替換添加
舉個例子:
Import urlparse
A = urlparse.urljoin('http://www.cat.com/cat.php,'dog.php')
輸出為
http://www.cat.com/dog.php
A = urlparse.urljoin('http://www.cat.com/cat.php/,'dog.php')
輸出為
http://www.cat.com/cat.php/dog.php
os、sys模塊:
OS模塊 提供方便的使用操作系統(tǒng)函數(shù)的方法,
SYS 模塊 提供可供訪問由解釋器使用或維護(hù)的變量和與解釋器進(jìn)行交互的函數(shù)。
簡單來說os負(fù)責(zé)程序與操作系統(tǒng)的交互,提供程序訪問操作系統(tǒng)底層的接口;sys主要負(fù)責(zé)程序與python解析器的交換,提供一系列函數(shù)與變量,用于操控pyhton的運(yùn)行環(huán)境。
- os 常用方法
os.name:返回當(dāng)前使用平臺的代表字符,Windows用 nt 表示,Linux用 posix 表示
? os.listdir(path):列舉目錄下的所有文件。返回的是list類型。
? os.getcwd():查看當(dāng)前所在路徑。
? os.system(command):函數(shù)用來運(yùn)行shell命令。
? os.curdir:返回當(dāng)前目錄('.')
? os.chdir(dirname):改變工作目錄到dirname
? os.path.isfile(path):檢驗(yàn)給出的路徑是不是文件。
? os.path.isdir(path):檢驗(yàn)給出的路徑是不是目錄。
? os.path.exists():用來檢驗(yàn)給出的路徑是否真地存在
? os.path.dirname(path):返回文件路徑
? os.path.basename(path):返回文件名
? os.path.join(path, name):連接目錄與文件名或目錄,使用‘\’連接
? os.path.splitext():分離文件名與擴(kuò)展名
? os.path.split(path):將path分割成目錄和文件名二元組返回。
? os.path.normpath(path):規(guī)范path字符串形式
? os.path.abspath(name):獲得絕對路徑
? os.path.getsize(name):獲得文件大小,如果name是目錄返回0L
? os.mkdir(path):創(chuàng)建path目錄(只能創(chuàng)建一級目錄)
? os.makedirs(path):創(chuàng)建多級目錄
? os.remove(path):函數(shù)用來刪除一個文件。
? os.rmdir(path):刪除path目錄(只能刪除一級目錄,如'/Users/XXX/SSS',只刪除SSS目錄)
? os.removedirs(path):刪除多級目錄(如'/Users/XXX/SSS',必須為空目錄,刪除SSS、XXX目錄)
? os.path.getmtime(path):返回文件或目錄的最后修改時間,結(jié)果為秒數(shù)
? os.path.getatime(path):返回文件或目錄的最后訪問時間,結(jié)果為秒數(shù)
? os.path.getctime(path):返回文件或目錄得創(chuàng)建時間,結(jié)果為秒數(shù)
? os.sep:返回當(dāng)前操作系統(tǒng)特定的路徑分隔符
? os.linesep:返回當(dāng)前平臺使用的行終止符
? os.extsep:返回文件名與擴(kuò)展名的分隔符
-
sys 常用方法
sys.argv 實(shí)現(xiàn)從程序外部向程序傳遞參數(shù)。簡單來說就是cmd中命令行參數(shù),返回是一個List,第一個元素是程序名,第二個即輸入第二個參數(shù),以此類推。
Python 1.py www.cat.com 10
Sys.argv[0]=1.py
Sys.argv[1]=www.cat.com
Sys.argv[2]=10
sys.modules.keys() #返回所有已經(jīng)導(dǎo)入的模塊列表
sys.exc_info() #獲取當(dāng)前正在處理的異常類,exc_type、exc_value、exc_traceback當(dāng)前處理的異常詳細(xì)信息
sys.exit(n) #程序,正常退出時exit(0)
sys.hexversion #獲取Python解釋程序的版本值,16進(jìn)制格式如:0x020403F0
sys.version #獲取Python解釋程序的版本信息
sys.maxint #最大的Int值
sys.maxunicode #最大的Unicode值
sys.modules #返回系統(tǒng)導(dǎo)入的模塊字段,key是模塊名,value是模塊
sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環(huán)境變量的值
sys.platform #返回操作系統(tǒng)平臺名稱
sys.stdout #標(biāo)準(zhǔn)輸出
sys.stdin #標(biāo)準(zhǔn)輸入
sys.stderr #錯誤輸出
sys.exc_clear() #用來清除當(dāng)前線程所出現(xiàn)的當(dāng)前的或最近的錯誤信息
sys.exec_prefix #返回平臺獨(dú)立的python文件安裝的位置
sys.byteorder #本地字節(jié)規(guī)則的指示器,big-endian平臺的值是'big',little-endian平臺的值是'little'
sys.copyright #記錄python版權(quán)相關(guān)的東西
sys.api_version #解釋器的C的API版本
sys.version_info #獲取Python解釋器的版本信息
sys.getwindowsversion #獲取Windows的版本
sys.getdefaultencoding #返回當(dāng)前你所用的默認(rèn)的字符編碼格式
sys.getfilesystemencoding #返回將Unicode文件名轉(zhuǎn)換成系統(tǒng)文件名的編碼的名字
sys.setdefaultencoding(name) #用來設(shè)置當(dāng)前默認(rèn)的字符編碼
sys.builtin_module_names #Python解釋器導(dǎo)入的模塊列表
sys.executable #Python解釋程序路徑
sys.stdin.readline #從標(biāo)準(zhǔn)輸入讀一行,sys.stdout.write("a") 屏幕輸出a
optparse模塊:
optparse可以說是sys.argv的升級版主要用來為腳本傳遞cmd中命令參數(shù),采用預(yù)先定義好的選項(xiàng)來解析命令行參數(shù)。
parser.add_option()是為解析器添加選項(xiàng),定義命令行參數(shù)常用的五種即
action:存儲方式,分為三種store、store_false、store_true
type:類型
dest:存儲的變量
default:默認(rèn)值
help:幫助信息
舉個橘子:
簡單來說就是創(chuàng)建optparse對象parser,使用add_option()來定義命令行參數(shù),最后利用parse_args()來解析命令行。
# coding=utf-8
import optparse
parser=optparse.optionParser("python %prog -u host -p port") #創(chuàng)建一個對象實(shí)例,()中用于cmd提示,可以省略 %prog=程序名。
parser.add_option('-u',dest='Host',type='string',help='test host')
parser.add_option('-p',dest='Ports',type='string',help='test ports',default="80,8080") ##需要的命令行參數(shù) 默認(rèn)-h查看
(options,args)=parser.parse_args() # 傳遞一個參數(shù)列表給parse_args(),只要知道命令行參數(shù)名即dest,如host,就可以訪問其對應(yīng)的值:options.host。
print(options.Host)
print(options.Ports)
socket模塊:
Socket也就是套接字,使用的時候每一個socket,都被綁定特定的IP地址和端口,主要實(shí)現(xiàn)網(wǎng)絡(luò)上兩個程序上的數(shù)據(jù)交換。
簡單來說就是本地建立socket,被訪問的服務(wù)器也建立一個socket監(jiān)聽,兩端用各種的socket及進(jìn)行數(shù)據(jù)交換
-
服務(wù)端
首先要創(chuàng)建sockert對象
Sock_server = socket.socket(family,type)
Family參數(shù)代表地址家族,分為AF_INET(IPV4網(wǎng)絡(luò)通信)和AF_UNIX(同一主機(jī)進(jìn)程通信)和AF_INET6(IPV6通信)
Type參選為套接字類型,分為SOCK_STREAM(tcp流套接字)和SOCK_DGRAM(udp數(shù)據(jù)包套接字)和SOCK_RAW(可以監(jiān)聽所有數(shù)據(jù)幀)和SOCKE_RDM(可靠udp形式,保證交付數(shù)據(jù))
舉個蘋果吧,直接創(chuàng)建個socket服務(wù)端
# coding=utf-8
import socket
#服務(wù)端
sock_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #創(chuàng)建一個ipv4,tcp連接對象
sock_server.bind(("127.0.0.1",8888)) #綁定主機(jī)名和端口
sock_server.listen(2) #設(shè)置服務(wù)端,最多可以被多少客戶連接
connection,address =sock_server.accept()#服務(wù)端通過accept等待客戶請求連接,連接建立時,返回新的connection對象(通過這個新的對象與客戶端通訊),和address客戶端地址
connection.send('i am servce ') #服務(wù)器和客戶端通過“send”發(fā)送byte和“recv”接受方法通信:
mess = connection.recv(1024) #接受多大字節(jié)
print(mess)
connection.close() #先關(guān)閉新對象,在關(guān)閉最開始對象
sock_server.close()
- 客戶端
# coding=utf-8
import socket
sock_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock_client.connect(("127.0.0.1",8888)) #使用connect方法連接服務(wù)器
mess = sock_client.recv(1024)
print(mess)
sock_client.send('i am client')
sock_client.close()
thread和threading模塊:
**余生很長,請多指教。**
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
