Python中怎么實(shí)現(xiàn)表單交互,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),廣漢網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:廣漢等地區(qū)。廣漢做網(wǎng)站價(jià)格咨詢:028-86922220
1、表單交互
import requests
params={
‘key1’:’value1’,
‘key2’:’value2’,
‘key3’:’value3’
}
html=requests.post(url,data=params)
print(html.text)
由于現(xiàn)在大多數(shù)網(wǎng)站都有多種登錄方式,通過(guò)短信或者微信登錄等,相對(duì)通過(guò)直接調(diào)用表單進(jìn)行交互已經(jīng)比較麻煩,這里不做詳細(xì)介紹,主要表單交互可以通過(guò)登錄后來(lái)找到對(duì)應(yīng)的網(wǎng)頁(yè),見(jiàn)下文。
2、逆向工程如何構(gòu)建表單
對(duì)于登錄后使用了異動(dòng)加載的網(wǎng)頁(yè),可以通過(guò)逆向工程構(gòu)架你表單來(lái)找到不同的網(wǎng)頁(yè)信息,下面我們先看一下如何構(gòu)建表單。
(1)登錄拉勾網(wǎng),打開(kāi)Chrome瀏覽器,選擇Netwoek
(2)搜索關(guān)鍵字python得到post的表單信息見(jiàn)下圖一和下圖二
圖一
圖二
3、Cookie模擬登錄
有時(shí)候表單字段可能通過(guò)加密或者其它形式的包裝進(jìn)行構(gòu)建,這樣就比較困難和麻煩,因此,這時(shí)候就有必要選擇通過(guò)提交Cookie信息進(jìn)行模擬登錄會(huì)方便很多。
什么是Cookie?
Cookie是指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而存儲(chǔ)在用戶本地終端上的數(shù)據(jù)。一般互聯(lián)網(wǎng)和電商都是通過(guò)跟蹤C(jī)ookie來(lái)作為識(shí)別用戶的唯一標(biāo)識(shí)的。
可見(jiàn)Cookie是帶有用戶信息的,因此才可以通過(guò)Cookie來(lái)模擬登陸網(wǎng)站。
繼續(xù)通過(guò)拉勾網(wǎng)如下圖可以看到cookie如下:
通過(guò)代碼:
import requestsurl='https://www.lagou.com'headers={ 'cookie': 'xxx‘}html=requests.get(url,headers=headers)print(html.text)
得到登陸后的網(wǎng)頁(yè)源碼內(nèi)容:
4、案例實(shí)踐:爬取拉勾網(wǎng)招聘信息
拉勾網(wǎng)結(jié)合了異步加載技術(shù)和提交表單,讓我們來(lái)分析一下此網(wǎng)站。
分析思路:
(1)登陸打開(kāi)拉勾網(wǎng)站,頁(yè)面如下,搜索關(guān)鍵字:大數(shù)據(jù)
(2)通過(guò)觀察,網(wǎng)頁(yè)元素不在網(wǎng)頁(yè)源代碼中,說(shuō)明使用了異步加載技術(shù)。
(3)刷新頁(yè)面,查看newwork選項(xiàng)卡,選中XHR,可以看到異步加載(AJAX)和對(duì)應(yīng)的Response中返回的json信息,證明可以從這里拿到數(shù)據(jù)。
(4)通過(guò)翻頁(yè),可以找到表單數(shù)據(jù),同時(shí)通過(guò)翻頁(yè),pn會(huì)不斷變化,上述表單交互已經(jīng)介紹,這里不再贅述。
(5)在netwoek->Preview中,可以看到每頁(yè)信息數(shù),同時(shí)信息總數(shù)。
(6)由于通過(guò)單一的cookie會(huì)被限制,所以補(bǔ)充了一個(gè)動(dòng)態(tài)的cookie進(jìn)行抓取數(shù)據(jù),實(shí)驗(yàn)后可行,大家可以參考
def get_cookie(): # 原始網(wǎng)頁(yè)的URL,即url_start url = 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=' s = requests.Session() s.get(url, headers=headers, timeout=3) # 請(qǐng)求首頁(yè)獲取cookies cookie = s.cookies # 為此次獲取的cookies return cookie
詳細(xì)代碼如下:
import requests
import json
import time
import pandas as pd
#import csv
headers = {
'origin': 'https://www.lagou.com',
'accept': 'xxxx',
'user-agent': 'xxxx',
'referer': 'xxxx'
}
# 獲取cookies值
def get_cookie():
# 原始網(wǎng)頁(yè)的URL,即url_start
url = 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput='
s = requests.Session()
s.get(url, headers=headers, timeout=3) # 請(qǐng)求首頁(yè)獲取cookies
cookie = s.cookies # 為此次獲取的cookies
return cookie
# 定義獲取頁(yè)數(shù)的函數(shù)
def get_page(url, params):
html = requests.post(url, data=params, headers=headers, cookies=get_cookie(), timeout=5)
# 將網(wǎng)頁(yè)的Html文件加載為json文件
json_data = json.loads(html.text)
# 解析json文件,后跟中括號(hào)為解析的路徑
total_Count = json_data['content']['positionResult']['totalCount']
page_number = int(total_Count/15) if int(total_Count/15) < 30 else 30
# 調(diào)用get_info函數(shù),傳入url和頁(yè)數(shù)
get_info(url, page_number)
# 定義獲取招聘信息函數(shù)
def get_info(url, page):
for pn in range(1, page+1):
# post請(qǐng)求參數(shù)
params = {
"first": "true",
"pn": str(pn),
"kd": "大數(shù)據(jù)"
}
# 獲取信息 并捕獲異常
try:
html = requests.post(url, data=params, headers=headers, cookies=get_cookie(), timeout=5)
#print(url, html.status_code)
# 將網(wǎng)頁(yè)的Html文件加載為json文件
json_data = json.loads(html.text)
# 解析json文件,后跟中括號(hào)為解析的路徑
results = json_data['content']['positionResult']['result']
df = pd.DataFrame(results)
#print(df.iloc[:,0:6])
if pn == 1:
total_df = df
else:
total_df = pd.concat([total_df,df],axis=0)
# 睡眠2秒
time.sleep(2)
except requests.exceptions.ConnectionError:
print("requests.exceptions.ConnectionError")
pass
#total_df.to_csv('招聘信息.csv', sep = ',', header = True, index = False)
total_df.to_excel('大數(shù)據(jù).xls',header=True, index=False)
# 原始網(wǎng)頁(yè)的URL
#請(qǐng)求JSON數(shù)據(jù)的URL
url = "https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false"
params = {
"first": "true",
"pn": 1,
"kd": "大數(shù)據(jù)"
}
get_page(url,params)
關(guān)于Python中怎么實(shí)現(xiàn)表單交互問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。