จริงๆ แล้วคุณจำเป็นต้องรวมพารามิเตอร์โพสต์แบบเต็ม Payload
เราต้องทำสิ่งนั้นภายใน Session
เดียวกันโดยใช้ requests.Session()
เนื่องจากการแบ่งหน้าเว็บไซต์ใช้การหมุน function
ตาม __dnnVariable
ซึ่งเซิร์ฟเวอร์ได้รับภายใต้คำขอ JS
ซึ่งแปลเป็น Loop
ความหมายจริงๆ อยู่ที่ไหน Next
ดังนั้นฉันจึงได้ส่งคำขอ GET
ก่อนและดึงข้อมูลที่จำเป็น params
(บางส่วนเป็นแบบไดนามิกและบางส่วนเป็นแบบคงที่)
จากนั้นฉันก็ขอโพสต์ภายใต้ session
เดียวกัน
import requests
import re
from bs4 import BeautifulSoup
from urllib.parse import unquote
data = {
'__EVENTTARGET': "dnn$ctr410$MemberSearch$btnSearch",
'__EVENTARGUMENT': '',
'__VIEWSTATEENCRYPTED': '',
'dnn$ctlHeader$dnnSearch$Search': 'SiteRadioButton',
'dnn$ctlHeader$dnnSearch$txtSearch': '',
'dnn$ctr410$MemberSearch$txtFirstName': '',
'dnn$ctr410$MemberSearch$txtLastName': '',
'dnn$ctr410$MemberSearch$ddlMemberType': 0,
'dnn$ctr410$MemberSearch$txtMembershipNumber': '',
'dnn$ctr410$MemberSearch$txtCpNumber': '',
'dnn$ctr410$MemberSearch$txtCity': '',
'dnn$ctr410$MemberSearch$txtOrganisation': '',
'dnn$ctr410$MemberSearch$txtAddress2': '',
'dnn$ctr410$MemberSearch$txtAddress3': '',
'dnn$ctr410$MemberSearch$txtEmail': '',
'dnn_ctr410_MemberSearch_grdMembers_ClientState': '',
'ScrollTop': 432,
'__dnnVariable': '{"__scdoff":"1","__dnn_pageload":"__dnn_setScrollTop();"}'
}
def main(url):
with requests.Session() as req:
r = req.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
data['StylesheetManager_TSSM'] = re.search(
r"hf.value \+= '(.*?)\'", r.text).group(1)
data['ScriptManager_TSM'] = unquote(soup.findAll('script', src=True)
[2]['src']).split("=", 3)[-1]
data['__VIEWSTATE'] = soup.find("input", id="__VIEWSTATE").get("value")
data['__VIEWSTATEGENERATOR'] = soup.find(
"input", id="__VIEWSTATEGENERATOR").get("value")
data['__EVENTVALIDATION'] = soup.find(
"input", id="__EVENTVALIDATION").get("value")
for _ in range(10):
r = req.post(url, data=data)
soup = BeautifulSoup(r.content, 'html.parser')
names = [name.text for name in soup.select("div.name_head")]
page = soup.select_one(
"a.rgCurrentPage").next_sibling['href'].split("'")[1]
data['__EVENTTARGET'] = page
data['__EVENTVALIDATION'] = soup.find(
"input", id="__EVENTVALIDATION").get("value")
data['__VIEWSTATE'] = soup.find(
"input", id="__VIEWSTATE").get("value")
print(names)
main("https://www.icsi.in/student/Members/MemberSearch.aspx")
หมายเหตุ: ในแต่ละคำขอ คุณจะได้รับข้อมูลไม่เรียงลำดับเนื่องจากฟังก์ชัน search
ใช้ random
บนเซิร์ฟเวอร์ส่วนหลัง
เอาท์พุท:
['SH. DILIP RAGHUNATH KOTWAL', 'SH. ARUNODAY ROY MUKHERJEE', 'SH. J SUBRAMANI', 'SH. R KRISHNAMANI', 'SH. R NARAYANASWAMI', 'SH. M V GOPALAKRISHNAN', 'SH. RAJAM KRISHNAMURTHY', 'SH. V SIVASUBRAMANIAN', 'SH. V RAGHAVENDRAN', 'SH. G V AIMAN']
['SH. K J MATHEW', 'SH. K K GHOSH', 'SH. SUBHASH CHANDER DHAWAN', 'SH. BABU RAM MAHESWARI', 'SH. S SWAMINATHAN', 'SH. T S A AIYER', 'SH. KOVILOOR VIJAYARAGHAVACHARI SAMPATHKUMAR', 'SH. M KRISHNAN', 'SH. R N BANSAL', 'SH. N V RAMAN']
['SH. R VENKATARAMANI', 'SH. UTPALENDU ROY CHOUDHURY', 'SH. LAKSHMI NARAYANAN V', 'SH. PARIJAT KUMAR HORE', 'SH. B R VENKATESAN', 'SH. KISHAN GOPAL SOMANI', 'SH. O P GANERIWALA', 'SH. P T KUPPUSWAMY', 'SH. U P MATHUR', 'SH. N N UPADHYAY']
['SH. N K BHANDARI', 'SH. S R C SETTY', 'SH. S V BALASUBRAMANIAN', 'SH. HOSHIE HIRJI MALGHAM', 'SH. KAIKOBAD SORABJI ITALIA', 'SH. K SIVADAS', 'SH. K K SIVARAMAKRISHNAN', 'SH. A CHANDRASEKARAN', 'SH. R PONNAMBALAM', 'SH. T K B VENKATARAMAN']
['SH. NARINDER PAL', 'SH. PARKASH ATAM', 'SH. K A PARTHASARATHY', 'SH. SURESH CHANDRA OSWAL', 'SH. MAHENDRA KANTILAL SHAH', 'SH. V. SANTHANAKRISHNA', 'SH. VASANT NARAYAN GOGATE', 'SH. MANEKLAL
PATEL', 'SH. B N VISHWANATH', 'SH. B S L NARAYAN']
['SH. P L N VIJAYANAGAR', 'SH. SHREEPAD MARTAND KORDE', 'SH. SHIV BHAGWAN KOTHARI', 'SH. R B POPLAI', 'SH. RAMESH KHANNA', 'SH. RAVINDER NATH JOSHI', 'SH. VIDYA SAGAR AGGARWAL', 'SH. ARVIND JAYKUMAR CHAKOTE', 'SH. V RAMASESHAN', 'SH. BADRINARAYAN BALDAWA']
['SH. C GOVINDANKUTTY', 'SH. A G MADHAVAN', 'SH. DHIRAJ NATH BHATTACHARYYA', 'SH. RAMESHWAR LAL INANI', 'SH. RAMESHWARDAS C DAGA', 'SH. R SUBRAMANIAN', 'SH. S M REGE', 'SH. NARENDRA KUMAR KAPOOR', 'SH. K RAMAMURTHI', 'SH. ROOPENDRA NARAYAN ROY']
['SH. KALYAN KUMAR MITRA', 'SH. KALYANASUNDARAM ', 'SH. N A SESHADRI', 'SH. RAJENDRA KUMAR JAIN', 'SH. BISWAJIT SEN', 'SH. RAMKRISHNA NATHOOMAL AGRAWAL', 'SH. P C SHETH', 'SH. K S NATARAJAN',
'SH. S N DAMLE', 'SH. A M FADIA']
['DR. K N M RAO', 'SH. IYER M. RAMASWAMY', 'SH. DILIP KANTI MAZUMDAR', 'SH. RAM CHANDRA NIGAM', 'SH. SUBRAHMANIAM VISWANATHAN', 'SH. SURESH KUMAR JERATH', 'SH. A Y SRINIVASAN', 'DR. S C GARG',
'SH. CHANDRA PRAKASH SHARDA', 'SH. M P JAIN']
['SH. E S DWARKANATH', 'SH. MYSORE SHAMANNA RAMACHANDRA', 'SH. SUBHASH CHANDER SINGHAL', 'SH. T T SINHA', 'SH. G R BHANDARI', 'SH. M P GOEL', 'SH. CHOKKANATHAPURAM SUBRAMANIAN NATESAN', 'SH.
V M PATEL', 'SH. BIJOY KUMAR AGARWALLA', 'SH. BAHADUR CHAND JAIN']
person
αԋɱҽԃ αмєяιcαη
schedule
11.05.2020
__EVENTTARGET
- และคุณอาจต้องส่งทั้งหมด - เช่นเดียวกับคำขอPOST
FIRTS: ใช้ DevTools ใน Firefox/Chrome เพื่อดูคำขอทั้งหมดที่ส่งจากเบราว์เซอร์เมื่อคุณไปที่หน้าถัดไป - และดูว่าคำขอส่งค่าใดบ้าง และเป็นคำขอGET
หรือPOST
รหัสของคุณต้องส่งเหมือนกัน - person furas   schedule 11.05.2020"{:02}".format(7)
เพื่อรับ07
แทน7
จากนั้นคุณไม่จำเป็นต้องตรวจสอบif len(str(page))==1:
(BTW: แทนif len(str(page))==1:
คุณสามารถตรวจสอบif page < 10:
ได้เลย) - person furas   schedule 11.05.2020payload.keys()
และเปรียบเทียบกับคีย์ที่ส่งในเว็บเบราว์เซอร์ ฉันจะเห็นคีย์ที่เบราว์เซอร์ไม่ส่ง - กล่าวคือ ปุ่มสำหรับปุ่มที่มีลูกศร (เพื่อเลื่อนไปยังหน้าแรก/หน้าสุดท้าย/ก่อนหน้า/หน้าถัดไป) และอาจทำให้เกิดปัญหาได้ เช่น.dnn$ctr410$MemberSearch$grdMembers$ctl00$ctl02$ctl01$ctl02
สำหรับปุ่มที่ย้ายไปหน้าแรก - person furas   schedule 11.05.2020payload.pop('dnn$ctr410$MemberSearch$grdMembers$ctl00$ctl02$ctl01$ctl02')
ที่ด้านล่างของลูป while เพื่อเตะคีย์ออกจากเพย์โหลด แต่ดูเหมือนว่าจะไม่สามารถแก้ไขปัญหาได้ ขอบคุณ. - person MITHU   schedule 11.05.2020...ctl28
สำหรับลูกศรไปยังหน้าถัดไป (แต่ฉันไม่แน่ใจว่าจะไม่ใช้ชื่ออื่นหรือไม่หากมีหน้าให้แสดงน้อย) ฉันไม่แน่ใจ แต่หน้าเว็บยังสามารถใช้ JavaScript เพื่อคำนวณ__EVENTVALIDATION
และเซิร์ฟเวอร์สามารถตรวจสอบได้ - แต่requests
/bs4
ไม่สามารถเรียกใช้ JavaScript ได้ - person furas   schedule 11.05.2020