一,request的簡單應用
#1請求地址
URL='https://example.com/login'
#2參數表單
form_data = {'username': 'admin','password': 'secret'
}
#3返回的響應對象response
response = requests.post(URL,data=form_data,timeout=5
)
#4處理返回結果,這里直接打印返回網頁的正文。通常需要json轉化,和encode編碼下
print(reponse.content)
1,請求頭需要設置,有些網站會限制訪問
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36','Referer': 'https://www.99csw.com/','Accept-Language': 'zh-CN,zh;q=0.9'}try:# 發送HTTP請求response = requests.get(url, headers=headers, timeout=15)
2,response的屬性
發送request請求后,返回的reponse對象里有我們要的信息,需要處理。常用的3個標粗了。
屬性/方法 | 類型/返回類型 | 說明 |
---|---|---|
status_code | int | HTTP 狀態碼(如 200、404、500) |
headers | CaseInsensitiveDict | 響應頭字典(不區分大小寫) |
text | str | 解碼后的文本內容(自動根據?encoding ?解碼) |
content | bytes | 原始字節內容(未解碼的二進制數據) |
json() | dict /list | 解析 JSON 響應內容(非 JSON 內容會拋異常) |
url | str | 最終請求的 URL(含重定向后的地址) |
encoding | str | 響應內容的編碼格式(可手動修改) |
apparent_encoding | str | 通過內容分析出的編碼格式(自動檢測) |
raw | HTTPResponse | 原始響應流對象(需配合?stream=True ?使用) |
cookies | RequestsCookieJar | 服務器返回的 Cookies |
elapsed | datetime.timedelta | 請求耗時(從發送到響應完成的時間) |
history | list[Response] | 重定向歷史記錄列表 |
reason | str | 狀態碼的文本描述(如 200 → "OK",404 → "Not Found") |
request | PreparedRequest | 關聯的請求對象(含請求頭、方法、URL 等信息) |
rep = reponse.content.decode('utf8'),content獲取的正文是二進制,注意編碼。
正文處理通常需要 json格式化 和 re正則模塊 的匹配。
#對返回content正文中,span標簽的獲取,標題內容獲取
pattern1 = re.compile(r'<span class="title">([^&]*?)</span>')
titles = pattern1.findall(resp.text)
3,session會話保持,處理cookie,保持會話。
Session 對象存儲特定用戶會話所需的屬性及配置信息。可以帶上cookie含帳號密碼。
成功登陸之后,直接獲取返回響應的cookie
def login():login_url = 'http://www.xxx.com/login'headers = {"Accept": "application/json, text/javascript, */*; q=0.01"}body = {"usercode": "liuzz05@****.com","password": "123456"}try:res = requests.post(url=login_url, headers=headers, data=body)cookies = res.cookiescookie = requests.utils.dict_from_cookiejar(cookies)return cookieexcept Exception as err:print('獲取cookie失敗:\n{0}'.format(err))
如果沒有,先登錄,從瀏覽器工具欄取cookie,找信息。
F12檢查請求。cookie里有大串字母,password,token等字樣說明這個可能是帶密碼賬號的cookie,要具體情況定。
直接使用cookie,或者把cookie放在header參數中,依據具體網站請求頭格式而定
把cookie轉化為字典格式,手動扣cookie的鍵值對。本地文件寫入分析,拼接
def get_data():cookie = login()res = requests.get(url=get_data_url, cookies=cookie)print(res.text)
def get_data():cookie = login()headers = {"cookie": cookie}res = requests.get(url=get_data_url, headers=headers)print(res.text)
一個完整的登錄案例。
def auto_login():s = requests.Session()r = s.get(login_url)bs = BeautifulSoup(r.text,'html.parser')image = bs.find("img", {"id": "vcJpeg"})['src']lt_data = bs.find("input", {"name": "lt"})['value']csr_data = bs.find("input", {"name": "csrftoken"})['value']sec_data = bs.find("input", {"name": "sec"})['value']#print(lt_data,",",csr_data,",",sec_data)rootdir="http://172.16.5.12:10086"ir = s.get(rootdir+image)if ir.status_code == 200:with open('valid.jpg', 'wb') as f:f.write(ir.content);f.close();validateCode = get_code(Image.open('valid.jpg')) # 通過本地圖片解析驗證碼print(validateCode)postdata={'csrftoken': csr_data,'username': uosp_username,'password': base64.b64encode(uosp_passwd.encode('utf-8')),'institute': '00010000','validateCode': validateCode,'lt': lt_data,'sec': sec_data,'dn': '','ip': '144.4.44.44','_eventId':'submit',}print(postdata)form_data={"action":"GetINCInfoByID","id":"INC000287932",}s.post(login_url,data = postdata)s.post(incident_url,data = form_data)s.post(servicelogin_url)cookies_dict = requests.utils.dict_from_cookiejar(s.cookies) # 登錄后頁面的cookie轉化為dict#print("cookies is that ",cookies_dict)if ('.ASPXUSERDEMO' in cookies_dict): # 如果登錄成功,cookie中會有.ASPXUSERDEMO字段值cookies = open('login_cookies', 'w')cookies.write(str(cookies_dict)) # 將cookie信息寫入本地文件,其他模塊直接訪問文件可以繞過登錄cookies.close()return selse:return None