2 回答

TA貢獻1951條經(jīng)驗 獲得超3個贊
好吧,我認為沒有理由使用selenium
這種情況,因為它會減慢你的任務速度。
該網(wǎng)站加載了JavaScript
事件,一旦頁面加載,該事件就會動態(tài)呈現(xiàn)其數(shù)據(jù)。
requests
庫將無法JavaScript
動態(tài)渲染。所以你可以使用selenium
或requests_html
。事實上有很多模塊可以做到這一點。
現(xiàn)在,我們確實有另一個選項,可以跟蹤數(shù)據(jù)的呈現(xiàn)位置。我能夠找到用于檢索數(shù)據(jù)并將其呈現(xiàn)給用戶端的XHR請求。back-end
?API
您可以
XHR
通過打開開發(fā)人員工具獲取請求并檢查網(wǎng)絡(luò)并檢查XHR/JS
根據(jù)調(diào)用類型發(fā)出的請求,例如fetch
import requests
import json
data = {
? ? 'from': '2020-1-01',
? ? 'to': '2020-3-01'
}
def main(url):
? ? r = requests.post(url, data=data).json()
? ? print(json.dumps(r, indent=4)) # to see it in nice format.
? ? print(r.keys())
main("http://www.ibex.bg/ajax/tenders_ajax.php")
因為我只是一個懶惰的編碼員:我會這樣做:
import requests
import re
import pandas as pd
import ast
from datetime import datetime
data = {
? ? 'from': '2020-1-01',
? ? 'to': '2020-3-01'
}
def main(url):
? ? r = requests.post(url, data=data).json()
? ? matches = set(re.findall(r"tender_date': '([^']*)'", str(r)))
? ? sort = (sorted(matches, key=lambda k: datetime.strptime(k, '%d.%m.%Y')))
? ? print(f"Available Dates: {sort}")
? ? opa = re.findall(r"({\'id.*?})", str(r))
? ? convert = [ast.literal_eval(x) for x in opa]
? ? df = pd.DataFrame(convert)
? ? print(df)
? ? df.to_csv("data.csv", index=False)
main("http://www.ibex.bg/ajax/tenders_ajax.php")
輸出:在線查看

TA貢獻1784條經(jīng)驗 獲得超7個贊
請嘗試以下解決方案
driver.maximize_window()
wait = WebDriverWait(driver, 20)
elemnt=wait.until(EC.presence_of_element_located((By.XPATH, "//body/div[@id='wrapper']/div[@id='content']/div[@class='tenders']/div[@class='form-group']/div[1]/div[1]//i")))
elemnt.click()
elemnt1=wait.until(EC.presence_of_element_located((By.XPATH, "//div[@class='form-group']//div[1]//div[3]//table[1]//tbody[1]//tr[6]//td[1]")))
elemnt1.click()
lists=wait.until(EC.presence_of_all_elements_located((By.XPATH, "//table[@class='tenders-table cloned']")))
for element in lists:
print element.text
- 2 回答
- 0 關(guān)注
- 229 瀏覽
添加回答
舉報