2 回答
TA贡献1951条经验 获得超3个赞
好吧,我认为没有理由使用selenium
这种情况,因为它会减慢你的任务速度。
该网站加载了JavaScript
事件,一旦页面加载,该事件就会动态呈现其数据。
requests
库将无法JavaScript
动态渲染。所以你可以使用selenium
或requests_html
。事实上有很多模块可以做到这一点。
现在,我们确实有另一个选项,可以跟踪数据的呈现位置。我能够找到用于检索数据并将其呈现给用户端的XHR请求。back-end
API
您可以
XHR
通过打开开发人员工具获取请求并检查网络并检查XHR/JS
根据调用类型发出的请求,例如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条经验 获得超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 关注
- 151 浏览
添加回答
举报