您好,登錄后才能下訂單哦!
Python中怎么實現表單交互,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1、表單交互
import requests
params={
‘key1’:’value1’,
‘key2’:’value2’,
‘key3’:’value3’
}
html=requests.post(url,data=params)
print(html.text)
由于現在大多數網站都有多種登錄方式,通過短信或者微信登錄等,相對通過直接調用表單進行交互已經比較麻煩,這里不做詳細介紹,主要表單交互可以通過登錄后來找到對應的網頁,見下文。
2、逆向工程如何構建表單
對于登錄后使用了異動加載的網頁,可以通過逆向工程構架你表單來找到不同的網頁信息,下面我們先看一下如何構建表單。
(1)登錄拉勾網,打開Chrome瀏覽器,選擇Netwoek
(2)搜索關鍵字python得到post的表單信息見下圖一和下圖二
圖一
圖二
3、Cookie模擬登錄
有時候表單字段可能通過加密或者其它形式的包裝進行構建,這樣就比較困難和麻煩,因此,這時候就有必要選擇通過提交Cookie信息進行模擬登錄會方便很多。
什么是Cookie?
Cookie是指某些網站為了辨別用戶身份、進行session跟蹤而存儲在用戶本地終端上的數據。一般互聯網和電商都是通過跟蹤Cookie來作為識別用戶的唯一標識的。
可見Cookie是帶有用戶信息的,因此才可以通過Cookie來模擬登陸網站。
繼續通過拉勾網如下圖可以看到cookie如下:
通過代碼:
import requestsurl='https://www.lagou.com'headers={ 'cookie': 'xxx‘}html=requests.get(url,headers=headers)print(html.text)
得到登陸后的網頁源碼內容:
4、案例實踐:爬取拉勾網招聘信息
拉勾網結合了異步加載技術和提交表單,讓我們來分析一下此網站。
分析思路:
(1)登陸打開拉勾網站,頁面如下,搜索關鍵字:大數據
(2)通過觀察,網頁元素不在網頁源代碼中,說明使用了異步加載技術。
(3)刷新頁面,查看newwork選項卡,選中XHR,可以看到異步加載(AJAX)和對應的Response中返回的json信息,證明可以從這里拿到數據。
(4)通過翻頁,可以找到表單數據,同時通過翻頁,pn會不斷變化,上述表單交互已經介紹,這里不再贅述。
(5)在netwoek->Preview中,可以看到每頁信息數,同時信息總數。
(6)由于通過單一的cookie會被限制,所以補充了一個動態的cookie進行抓取數據,實驗后可行,大家可以參考
def get_cookie(): # 原始網頁的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) # 請求首頁獲取cookies cookie = s.cookies # 為此次獲取的cookies return cookie
詳細代碼如下:
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():
# 原始網頁的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) # 請求首頁獲取cookies
cookie = s.cookies # 為此次獲取的cookies
return cookie
# 定義獲取頁數的函數
def get_page(url, params):
html = requests.post(url, data=params, headers=headers, cookies=get_cookie(), timeout=5)
# 將網頁的Html文件加載為json文件
json_data = json.loads(html.text)
# 解析json文件,后跟中括號為解析的路徑
total_Count = json_data['content']['positionResult']['totalCount']
page_number = int(total_Count/15) if int(total_Count/15) < 30 else 30
# 調用get_info函數,傳入url和頁數
get_info(url, page_number)
# 定義獲取招聘信息函數
def get_info(url, page):
for pn in range(1, page+1):
# post請求參數
params = {
"first": "true",
"pn": str(pn),
"kd": "大數據"
}
# 獲取信息 并捕獲異常
try:
html = requests.post(url, data=params, headers=headers, cookies=get_cookie(), timeout=5)
#print(url, html.status_code)
# 將網頁的Html文件加載為json文件
json_data = json.loads(html.text)
# 解析json文件,后跟中括號為解析的路徑
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('大數據.xls',header=True, index=False)
# 原始網頁的URL
#請求JSON數據的URL
url = "https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false"
params = {
"first": "true",
"pn": 1,
"kd": "大數據"
}
get_page(url,params)
關于Python中怎么實現表單交互問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。