python之最常用的模塊一籮筐
其實我挺羨慕火車的
爲什麼?
他們連擦肩而過都那麼久
文章目錄
request模塊:
requests 是一個功能強大、簡單易用的 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')
- 響應
r.url:返回請求網站的 URL
r.status_code:返回響應的狀態碼
r.encoding:返回響應的編碼方式
r.cookies:返回響應的 Cookie 信息
r.headers:返回響應頭
r.headers[‘host’]:返回響應頭某屬性
r.content:返回 bytes 類型的響應體
r.text:返回字符串,也就是頁面文本
r.content: 返回內容的二進制形式
r.json():返回josn字典
最常用也就get/post,常用參數
url
cookie
params get形式的參數
data post形式的參數
headers 修改請求頭,僞裝瀏覽器等等
timeout 超時時間
proxies 設置代理
舉個荔枝,請求百度
# 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的一個庫,最主要的功能是從網頁抓取數據,將 html 解析爲對象進行處理。
BeautifulSoup 不僅支持 HTML 解析器,還lxml,XML,html5lib 解析器,需要安裝相應的庫。如果不安裝,則 Python 會使用 Python 默認的解析器,其中 lxml 解析器推薦
一般BS4將HTML文檔對象會轉換成如下四種類型組合的文檔樹:
- Tag:標籤對象
- NavigableString:字符內容, soup.p.string
- BeautifulSoup:表示的是一個文檔的全部內容
- Comment:特殊類型的NavigableString, 如果標籤中有註釋,則是 comment 對象,可通過 if type(soup.p.string) != bs4.element.Comment:.判斷
主要還是Tag也就是標籤,如html頁面中的<title>,<p>,<h1>
等等都是tag,而Beautiful Soup可以輕鬆獲取 各種Tags
如:
soup.title
soup.head
soup.a
soup.p
soup.p.name #p標籤的名字
soup.p.string #p標籤的內容
soup.p.attrs #p標籤的屬性,返回的是一個字典
soup.p['class'] #p標籤的class屬性
需求總是多樣的,也可以利用find() 和 find_all()是這兩個函數,可以準確的通過標籤的不同屬性輕鬆地過濾 HTML 頁面,查找需要的標籤組或單個標籤。唯一的區別是 find_all() 方法的返回結果是值包含一個元素的列表,而 find() 方法直接返回結果.這個語句可以完美詮釋兩者關係:
soup.find_all('title', limit=1)==soup.find('title')
主要介紹find_all() 方法搜索當前tag的所有tag子節點,並判斷是否符合過濾器的條件。
find_all( name , attrs , recursive , text , **kwargs )
name :查找所有名字爲 name 的tag,字符串對象會被自動忽略掉;
attrs:根據屬性查詢,使用字典類型;
text :可以搜搜文檔中的字符串內容.與 name 參數的可選值一樣, text 參數接受字符串 , 正則表達式 , 列表, True ;
recursive:調用tag的 find_all() 方法時,Beautiful Soup會檢索當前tag的所有子孫節點,如果只想搜索tag的直接子節點,可以使用參數 recursive=False ;
limit:find_all() 方法返回全部的搜索結構,如果我們不需要全部結果,可以使用 limit 參數限制返回結果的數量.效果與SQL中的limit關鍵字類似,當搜索到的結果數量達到 limit 的限制時,就停止搜索返回結果;
class_ :通過 class_ 參數搜索有指定CSS類名的tag,class_ 參數同樣接受不同類型的 過濾器 ,字符串,正則表達式,方法或 True。
是不是想說什麼亂七八糟的,舉個栗子看看,看完還可以吃了
# encoding:utf-8
from bs4 import BeautifulSoup
import re
html = '''
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body>
<div>
<ul>
<li class="cls1" name='one'><a href="www.abc.com">1111111111111111111</a></li>
<li class="cls2" name='two'><a href="www.abc.com">222222222222</a></li>
<li class="cls3" name='three'><a href="www.abc.com">3333333333</a></li>
<li class="cls4" name='four'><a href="www.abc.com">4444444abc4444</a></li>
<li class="cls5" name='five'><a id='aaa' href="www.abc.com">5555555555555</a></li>
</ul>
</div>
</body>
</html>
'''
soup = BeautifulSoup(html, 'html.parser')
# 根據name查詢節點
print("name爲ul的節點:", soup.find_all(name='ul'))
# 根據attrs查詢節點
print('根據attr查詢節點:', soup.find_all(attrs={'name': 'one'}))
print('根據attr查詢節點:', soup.find_all(attrs={'class': 'cls5'}))
# 根據text查詢節點
print('根據text查詢節點:', soup.find_all(text='3333333333'))
print('根據text查詢節點1:', soup.find_all(text=re.compile("abc")))
# 根據class_查詢
print('根據class_查詢節點:', soup.find_all(class_='cls3'))
# 根據id查詢
print('根據id查詢節點:', soup.find_all(id='aaa'))
# 設置limit
print('不設置limit:', soup.ul.find_all(name='li'))
print('設置limit爲1:', soup.ul.find_all(name='li', limit=2))
如果取其中href,可以link.a['href'] or link.a.get('href')
也可以通過css類名查找
在查找的時候,如果是標籤名不加任何修飾,如果是類名前加點,如果id名前加#
利用 soup.select() , 返回類型是list
舉個例子:
<title>111</title><a class=b id=abc>111</a>
通過標籤名查找
print(soup.select('title')) ##打印出標籤是title的
通過類名查找
print(soup.select('.b')) ##打印出class類名是b的
通過id名查找
print(soup.select('#abc')) ##打印出id名是abc的
組合查找
print(soup.select('p #abc’ b')) ##打印出p標籤中,id=abc,class=b的
屬性查找(注意屬性和標籤屬於同一節點.)
print(soup.select("a[class='b']")) ##打印出a標籤中class屬性是b的
以上的select方法返回的結果都是列表形式,可以遍歷形式輸出,然後用get_text()方法來獲取他的內容
for i in soup.select('a'):
print(i.get_text()) ##打印出a標籤中的文本
urlparse模塊:
- urlparse.urlparse模塊主要就是將url解析爲6個組件,並以元組形式返回,返回的6個部分,分別是:scheme(協議)、netloc(網絡位置)、path(路徑)、params(路徑段參數)、query(查詢)、fragment(片段)。
舉個例子:
Import urlparse
a = urlparse.urlparse(‘https:www.cat.com:8080/cat.php?cat=1’)
輸出的結果爲
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個字符串項目的元組:協議、位置、路徑、查詢、片段
- urlparse.urljoin主要是拼接URL,它以base作爲其基地址,然後與url中的相對地址相結合組成一個絕對URL地址.最重要就是看/進行替換添加,如果最後路徑沒有/,即追溯到上一個/進行替換添加
舉個例子:
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模塊 提供方便的使用操作系統函數的方法,
SYS 模塊 提供可供訪問由解釋器使用或維護的變量和與解釋器進行交互的函數。
簡單來說os負責程序與操作系統的交互,提供程序訪問操作系統底層的接口;sys主要負責程序與python解析器的交換,提供一系列函數與變量,用於操控pyhton的運行環境。
- os 常用方法
os.name:返回當前使用平臺的代表字符,Windows用 nt 表示,Linux用 posix 表示
• os.listdir(path):列舉目錄下的所有文件。返回的是list類型。
• os.getcwd():查看當前所在路徑。
• os.system(command):函數用來運行shell命令。
• os.curdir:返回當前目錄('.')
• os.chdir(dirname):改變工作目錄到dirname
• os.path.isfile(path):檢驗給出的路徑是不是文件。
• os.path.isdir(path):檢驗給出的路徑是不是目錄。
• os.path.exists():用來檢驗給出的路徑是否真地存在
• os.path.dirname(path):返回文件路徑
• os.path.basename(path):返回文件名
• os.path.join(path, name):連接目錄與文件名或目錄,使用‘\’連接
• os.path.splitext():分離文件名與擴展名
• os.path.split(path):將path分割成目錄和文件名二元組返回。
• os.path.normpath(path):規範path字符串形式
• os.path.abspath(name):獲得絕對路徑
• os.path.getsize(name):獲得文件大小,如果name是目錄返回0L
• os.mkdir(path):創建path目錄(只能創建一級目錄)
• os.makedirs(path):創建多級目錄
• os.remove(path):函數用來刪除一個文件。
• os.rmdir(path):刪除path目錄(只能刪除一級目錄,如'/Users/XXX/SSS',只刪除SSS目錄)
• os.removedirs(path):刪除多級目錄(如'/Users/XXX/SSS',必須爲空目錄,刪除SSS、XXX目錄)
• os.path.getmtime(path):返回文件或目錄的最後修改時間,結果爲秒數
• os.path.getatime(path):返回文件或目錄的最後訪問時間,結果爲秒數
• os.path.getctime(path):返回文件或目錄得創建時間,結果爲秒數
• os.sep:返回當前操作系統特定的路徑分隔符
• os.linesep:返回當前平臺使用的行終止符
• os.extsep:返回文件名與擴展名的分隔符
- sys 常用方法
sys.argv 實現從程序外部向程序傳遞參數。簡單來說就是cmd中命令行參數,返回是一個List,第一個元素是程序名,第二個即輸入第二個參數,以此類推。
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() #返回所有已經導入的模塊列表
sys.exc_info() #獲取當前正在處理的異常類,exc_type、exc_value、exc_traceback當前處理的異常詳細信息
sys.exit(n) #程序,正常退出時exit(0)
sys.hexversion #獲取Python解釋程序的版本值,16進制格式如:0x020403F0
sys.version #獲取Python解釋程序的版本信息
sys.maxint #最大的Int值
sys.maxunicode #最大的Unicode值
sys.modules #返回系統導入的模塊字段,key是模塊名,value是模塊
sys.path #返回模塊的搜索路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform #返回操作系統平臺名稱
sys.stdout #標準輸出
sys.stdin #標準輸入
sys.stderr #錯誤輸出
sys.exc_clear() #用來清除當前線程所出現的當前的或最近的錯誤信息
sys.exec_prefix #返回平臺獨立的python文件安裝的位置
sys.byteorder #本地字節規則的指示器,big-endian平臺的值是'big',little-endian平臺的值是'little'
sys.copyright #記錄python版權相關的東西
sys.api_version #解釋器的C的API版本
sys.version_info #獲取Python解釋器的版本信息
sys.getwindowsversion #獲取Windows的版本
sys.getdefaultencoding #返回當前你所用的默認的字符編碼格式
sys.getfilesystemencoding #返回將Unicode文件名轉換成系統文件名的編碼的名字
sys.setdefaultencoding(name) #用來設置當前默認的字符編碼
sys.builtin_module_names #Python解釋器導入的模塊列表
sys.executable #Python解釋程序路徑
sys.stdin.readline #從標準輸入讀一行,sys.stdout.write("a") 屏幕輸出a
optparse模塊:
optparse可以說是sys.argv的升級版主要用來爲腳本傳遞cmd中命令參數,採用預先定義好的選項來解析命令行參數。
parser.add_option()是爲解析器添加選項,定義命令行參數常用的五種即
action:存儲方式,分爲三種store、store_false、store_true
type:類型
dest:存儲的變量
default:默認值
help:幫助信息
舉個橘子:
簡單來說就是創建optparse對象parser,使用add_option()來定義命令行參數,最後利用parse_args()來解析命令行。
# coding=utf-8
import optparse
parser=optparse.optionParser("python %prog -u host -p port") #創建一個對象實例,()中用於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") ##需要的命令行參數 默認-h查看
(options,args)=parser.parse_args() # 傳遞一個參數列表給parse_args(),只要知道命令行參數名即dest,如host,就可以訪問其對應的值:options.host。
print(options.Host)
print(options.Ports)
socket模塊:
Socket也就是套接字,使用的時候每一個socket,都被綁定特定的IP地址和端口,主要實現網絡上兩個程序上的數據交換。
簡單來說就是本地建立socket,被訪問的服務器也建立一個socket監聽,兩端用各種的socket及進行數據交換
- 服務端
首先要創建sockert對象
Sock_server = socket.socket(family,type)
Family參數代表地址家族,分爲AF_INET(IPV4網絡通信)和AF_UNIX(同一主機進程通信)和AF_INET6(IPV6通信)
Type參選爲套接字類型,分爲SOCK_STREAM(tcp流套接字)和SOCK_DGRAM(udp數據包套接字)和SOCK_RAW(可以監聽所有數據幀)和SOCKE_RDM(可靠udp形式,保證交付數據)
舉個蘋果吧,直接創建個socket服務端
# coding=utf-8
import socket
#服務端
sock_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #創建一個ipv4,tcp連接對象
sock_server.bind(("127.0.0.1",8888)) #綁定主機名和端口
sock_server.listen(2) #設置服務端,最多可以被多少客戶連接
connection,address =sock_server.accept()#服務端通過accept等待客戶請求連接,連接建立時,返回新的connection對象(通過這個新的對象與客戶端通訊),和address客戶端地址
connection.send('i am servce ') #服務器和客戶端通過“send”發送byte和“recv”接受方法通信:
mess = connection.recv(1024) #接受多大字節
print(mess)
connection.close() #先關閉新對象,在關閉最開始對象
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方法連接服務器
mess = sock_client.recv(1024)
print(mess)
sock_client.send('i am client')
sock_client.close()
threading模塊:
threading 模塊中最核心的內容是 Thread 這個類。
我們要創建 Thread 對象,然後讓它們運行,每個 Thread 對象代表一個線程,在每個線程中我們可以讓程序處理不同的任務,這就是多線程編程。
threading.Thread目前還沒有優先級和線程組的功能,而且創建的線程也不能被銷燬、停止、暫定、恢復或中斷。
守護線程:只有所有守護線程都結束,整個Python程序纔會退出,但並不是說Python程序會等待守護線程運行完畢,相反,當程序退出時,如果還有守護線程在運行,程序會去強制終結所有守護線程,當守所有護線程都終結後,程序纔會真正退出。可以通過修改daemon屬性或者初始化線程時指定daemon參數來指定某個線程爲守護線程。
非守護線程:一般創建的線程默認就是非守護線程,包括主線程也是,即在Python程序退出時,如果還有非守護線程在運行,程序會等待直到所有非守護線程都結束後纔會退出。
注:守護線程會在程序關閉時突然關閉(如果守護線程在程序關閉時還在運行),它們佔用的資源可能沒有被正確釋放,比如正在修改文檔內容等,需要謹慎使用。
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
如果這個類的初始化方法被重寫,請確保在重寫的初始化方法中做任何事之前先調用threading.Thread類的__init__方法。
group:應該設爲None,即不用設置,使用默認值就好,因爲這個參數是爲了以後實現ThreadGroup類而保留的。
target:在run方法中調用的可調用對象,即需要開啓線程的可調用對象,比如函數或方法。
name:線程名稱,默認爲“Thread-N”形式的名稱,N爲較小的十進制數。
args:在參數target中傳入的可調用對象的參數元組,默認爲空元組()。
kwargs:在參數target中傳入的可調用對象的關鍵字參數字典,默認爲空字典{}。
daemon:默認爲None,即繼承當前調用者線程(即開啓線程的線程,一般就是主線程)的守護模式屬性,如果不爲None,則無論該線程是否爲守護模式,都會被設置爲“守護模式”。
start():開啓線程活動。它將使得run()方法在一個獨立的控制線程中被調用,需要注意的是同一個線程對象的start()方法只能被調用一次,如果調用多次,則會報RuntimeError錯誤。
run():此方法代表線程活動。
join(timeout=None):讓當前調用者線程(即開啓線程的線程,一般就是主線程)等待,直到線程結束(無論它是什麼原因結束的),timeout參數是以秒爲單位的浮點數,用於設置操作超時的時間,返回值爲None。如果想要判斷線程是否超時,只能通過線程的is_alive方法來進行判斷。join方法可以被調用多次。如果對當前線程使用join方法(即線程在內部調用自己的join方法),或者在線程沒有開始前使用join方法,都會報RuntimeError錯誤。
name:線程的名稱字符串,並沒有什麼實際含義,多個線程可以賦予相同的名稱,初始值由初始化方法來設置。
ident:線程的標識符,如果線程還沒有啓動,則爲None。ident是一個非零整數,參見threading.get_ident()函數。當線程結束後,它的ident可能被其他新創建的線程複用,當然就算該線程結束了,它的ident依舊是可用的。
is_alive():線程是否存活,返回True或者False。在線程的run()運行之後直到run()結束,該方法返回True。
daemon:表示該線程是否是守護線程,True或者False。設置一個線程的daemon必須在線程的start()方法之前,否則會報RuntimeError錯誤。這個值默認繼承自創建它的線程,主線程默認是非守護線程的,所以在主線程中創建的線程默認都是非守護線程的,即daemon=False。
舉個例子
import requests
import threading
def post(user,pwd):
response = requests.get('http://oa.jst-hosp.com.cn/j_acegi_security_check', headers=headers)
uesr=123
pwd=123
th = []
for user in users:
for pwd in pwds:
post(user,pwd)
p = threading.Thread(target=post,args=(user,pwd))
th.append(p)
for t in th:
t.start()
xpach模塊
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。
選取節點
XPath 使用路徑表達式在 XML 文檔中選取節點。節點是通過沿着路徑或者 step 來選取的
舉例子
//+@ #通過//選擇節點,然後利用@確定屬性,來實現具體table位子
謂語
選取未知節點
XPath 通配符可用來選取未知的 XML 元素。
選取若干路徑
通過在路徑表達式中使用"|"運算符,您可以選取若干個路徑。
parsel模塊
主要用來將請求後的字符串格式解析成re,xpath,css進行內容的匹配
導入from parsel import Selector
response = requests.get(url)
sel = parsel.Selector(response.text) #注意這裏的S要大寫
# re正則
# print(sel.re('正則匹配格式'))
# xpath
# print(sel.xpath('xpath').getall()) #getall獲取所有
# print(sel.xpath('xpath'). extract_first() 返回第一個
# css選擇器
# print(sel.css('css選擇器 ::text').extract_first())#獲取第一個
爬蟲結合xptch以及threading綜合使用
import requests
from parsel import Selector
import threading
def get_page(num):
params = (
('p',f'{num}'),)
response = requests.get('https://so.gushiwen.org/mingju/default.aspx', headers=headers, params=params)
response.encoding = "utf8"
sel = Selector(response.text)
cont = sel.xpath('//div[@class="sons"]//div[@class="cont"]')
res = []
for s in cont:
l1 = s.xpath(".//a[1]/text()").extract_first()
l2 = s.xpath(".//a[2]/text()").extract_first()
#data = open("data.txt","a")
#data.write(l1+"---------"+l2+"\n")
print("num",num,l1+l2)
res.append((l1,l2))
#print(num,res,"\n")
return res
th = []
for p in range(1,30):
t = threading.Thread(target=get_page,args=(p,))
th.append(t)
for t in th:
t.start()
餘生很長,請多指教。