post請(qǐng)求
Request請(qǐng)求對(duì)象的里有data參數(shù),它就是用在POST里的,我們要傳送的數(shù)據(jù)就是這個(gè)參數(shù)data,data是一個(gè)字典,里面要匹配鍵值對(duì)。
發(fā)起post請(qǐng)求
代碼:
from urllib.parse import urlencode
from urllib import request
#目標(biāo)url(https://httpbin.org/post這個(gè)接口是一個(gè)測(cè)試接口,可以從響應(yīng)結(jié)果里中看到你發(fā)送給對(duì)方服務(wù)器的參數(shù))
req_url = 'https://httpbin.org/post'
#構(gòu)造一個(gè)表單數(shù)據(jù)
formdata = {
'name':'小明',
'age':'29',
'class':'1805',
'gender':'男',
}
#1.需要將表單數(shù)據(jù)轉(zhuǎn)換為url編碼格式(urlencoding)
#2.將轉(zhuǎn)換后的字符串在轉(zhuǎn)換為一個(gè)二進(jìn)制數(shù)據(jù)(encode)
data_tranform = urlencode(formdata).encode('utf-8')
print(data_tranform)
#如果不需要構(gòu)建請(qǐng)求頭
response = request.urlopen(url=req_url,data=data_tranform)
#狀態(tài)碼
print(response.status)
#獲取響應(yīng)體
print(response.read().decode())
json
json簡(jiǎn)單說(shuō)就是javascript中的對(duì)象和數(shù)組,所以這兩種結(jié)構(gòu)就是對(duì)象和數(shù)組兩種結(jié)構(gòu),通過(guò)這兩種結(jié)構(gòu)可以表示各種復(fù)雜的結(jié)構(gòu)
- 1.對(duì)象:對(duì)象在js中表示為{ }括起來(lái)的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 { key:value, key:value, ... }的鍵值對(duì)的結(jié)構(gòu),在面向?qū)ο蟮恼Z(yǔ)言中,key為對(duì)象的屬性,value為對(duì)應(yīng)的屬性值,所以很容易理解,取值方法為 對(duì)象.key 獲取屬性值,這個(gè)屬性值的類(lèi)型可以是數(shù)字、字符串、數(shù)組、對(duì)象這幾種。
- 2.數(shù)組:數(shù)組在js中是中括號(hào)[ ]括起來(lái)的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 ["Python", "javascript", "C++", ...],取值方式和所有語(yǔ)言中一樣,使用索引獲取,字段值的類(lèi)型可以是 數(shù)字、字符串、數(shù)組、對(duì)象幾種。
json模塊提供了四個(gè)功能:dumps、dump、loads、load,用于字符串 和 python數(shù)據(jù)類(lèi)型間進(jìn)行轉(zhuǎn)換。
導(dǎo)入json : import json
1.json.dump():將python數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為json字符串,并且可以將json字符串寫(xiě)入本地
2.json.dumps():將python數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為json字符串
3.json.loads():將json數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為python數(shù)據(jù)類(lèi)型
4.json.load():將json數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為python數(shù)據(jù)類(lèi)型,轉(zhuǎn)換的是本地存儲(chǔ)的json串
#一個(gè)嚴(yán)格意義上的json串,必須是由數(shù)組(list)和字典(dict)兩種數(shù)據(jù)組成
# json串中的非數(shù)字?jǐn)?shù)據(jù),都必須使用雙引號(hào)包裹起來(lái)
import json
# json.dump():將python數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為json字符串,并且可以將json字符串寫(xiě)入本地
# json.dumps():將python數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為json字符串
data = {
'classname':'1805',
'classinfo':'網(wǎng)絡(luò)爬蟲(chóng)',
'classnum':'26',
'peoplelist':['小明','大明','小小明'],
}
json_str = json.dumps(data,ensure_ascii=False)
print(json_str,type(json_str))
# json.loads():將json數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為python數(shù)據(jù)類(lèi)型
loads_data = json.loads(json_str)
print(loads_data)
print(type(loads_data))
# json.load():將json數(shù)據(jù)類(lèi)型,轉(zhuǎn)換為python數(shù)據(jù)類(lèi)型,轉(zhuǎn)換的是本地存儲(chǔ)的json串
正則
為什么要學(xué)正則表達(dá)式:
實(shí)際上爬蟲(chóng)一共就四個(gè)主要步驟:
- 明確目標(biāo) (要知道你準(zhǔn)備在哪個(gè)范圍或者網(wǎng)站去搜索)
- 爬 (將所有的網(wǎng)站的內(nèi)容全部爬下來(lái))
- 取 (去掉對(duì)我們沒(méi)用處的數(shù)據(jù))
- 處理數(shù)據(jù)(按照我們想要的方式存儲(chǔ)和使用)
之前我們down下了的數(shù)據(jù)是全部的網(wǎng)頁(yè),這些數(shù)據(jù)很龐大并且很混亂,大部分的東西使我們不關(guān)心的,因此我們需要將之按我們的需要過(guò)濾和匹配出來(lái)。
# \d 數(shù)字0-9
# \D 非數(shù)字 -> [^\d]
# \w 單詞字符,數(shù)字,字母,下劃線
# \W 非單詞字符 -> [^\w]
# \s 匹配空白字符
# \S 匹配非空白字符 -> [^\s]
# ^ 以..開(kāi)頭
# $ 以..結(jié)尾
# r '正則':原始字符串
# [0-9a-z]
# [^0-9]
# ():分組
# |:或
# #多字符匹配貪婪模式
# . 除換行之外的任意字符
# * 匹配*前面的字符任意次數(shù)
# + 匹配+號(hào)前面的字符至少1次
# ? 匹配?號(hào)前面的字符0次或1次
# {n}:匹配前面的字符n次
# {2,10}:表示匹配前面的字符可以出現(xiàn) 2~10 次
# #非貪婪模式
# .?
# *?
# +?
# ??
#如何在python中使用正則
import re
#將我們的正則表達(dá)式,構(gòu)建為一個(gè)pattern對(duì)象
re.compile()
#從起始位置查找,匹配到結(jié)果立即返回,反之,返回None,單次匹配
re.match()
#從頭匹配,在這個(gè)字符串中查找,匹配到結(jié)果立即返回,反之,返回None,單次匹配
re.search()
#在整個(gè)字符串中匹配,會(huì)將所有滿足條件的結(jié)果返回,返回的是一個(gè)list.
re.findall()
#替換
re.sub()
#分割
re.split()
# 很findall方法類(lèi)似,不過(guò)返回的是一個(gè)可迭代的對(duì)象,
# 遍歷之后,每一個(gè)值是一個(gè)match對(duì)象
re.finditer()