如何从具有动态 HTML (Python) 的网页抓取数据?
How to webscrape data from a webpage with dynamic HTML (Python)?
我正在尝试弄清楚如何从以下 url 中抓取数据:https://www.aap.org/en-us/advocacy-and-policy/aap-health-initiatives/nicuverification/Pages/NICUSearch.aspx
这是数据类型:
似乎所有内容都是从数据库中填充并通过 javascript 加载到网页中的。
我过去曾使用 selenium
和 PhantomJS
做过类似的事情,但我不知道如何在 Python.[=19= 中获取这些数据字段]
不出所料,我无法使用 pd.read_html
解决此类问题。
是否可以解析以下结果:
from selenium import webdriver
url="https://www.aap.org/en-us/advocacy-and-policy/aap-health-initiatives/nicuverification/Pages/NICUSearch.aspx"
browser = webdriver.PhantomJS()
browser.get(url)
content = browser.page_source
或者访问实际的底层数据?
如果没有,除了复制和粘贴几个小时之外还有哪些其他方法?
编辑:
基于下面的答案,来自@thenullptr 我已经能够访问 material 但只能在第 1 页上访问。我如何调整它以跨越所有页面 [建议正确解析]?我的最终目标是将其放入 pandas dataframe
import requests
from bs4 import BeautifulSoup
r = requests.post(
url = 'https://search.aap.org/nicu/',
data = {'SearchCriteria.Level':'1', 'X-Requested-With':'XMLHttpRequest'},
) #key:value
html = r.text
# Parsing the HTML
soup = BeautifulSoup(html.split("</script>")[-1].strip(), "html")
div = soup.find("div", {"id": "main"})
div = soup.findAll("div", {"class":"blue-border panel list-group"})
def f(x):
ignore_fields = ['Collapse all','Expand all']
output = list(filter(bool, map(str.strip, x.text.split("\n"))))
output = list(filter(lambda x: x not in ignore_fields, output))
return output
results = pd.Series(list(map(f, div))[0])
继我上一条评论之后,下面的内容应该会给你一个很好的起点。在查看 XHR 调用时,您只想查看从每个调用中发送和接收的数据,以查明您需要的那个。下面是在进行搜索时发送到 API 的原始 POST 数据,看起来您至少需要使用一个并包括最后一个。
{
"SearchCriteria.Name": "smith",
"SearchCriteria.City": "",
"SearchCriteria.State": "",
"SearchCriteria.Zip": "",
"SearchCriteria.Level": "",
"SearchCriteria.LevelAssigner": "",
"SearchCriteria.BedNumberRange": "",
"X-Requested-With": "XMLHttpRequest"
}
这是一个简单的例子,说明如何使用请求库发送 post 请求,网页将回复原始数据,因此您可以使用 BS 或类似工具解析它以获取信息你需要。
import requests
r = requests.post('https://search.aap.org/nicu/',
data = {'SearchCriteria.Name':'smith', 'X-Requested-With':'XMLHttpRequest'}) #key:value
print(r.text)
打印 <strong class="col-md-8 white-text">JOHN PETER SMITH HOSPITAL</strong>...
我正在尝试弄清楚如何从以下 url 中抓取数据:https://www.aap.org/en-us/advocacy-and-policy/aap-health-initiatives/nicuverification/Pages/NICUSearch.aspx
这是数据类型:
似乎所有内容都是从数据库中填充并通过 javascript 加载到网页中的。
我过去曾使用 selenium
和 PhantomJS
做过类似的事情,但我不知道如何在 Python.[=19= 中获取这些数据字段]
不出所料,我无法使用 pd.read_html
解决此类问题。
是否可以解析以下结果:
from selenium import webdriver
url="https://www.aap.org/en-us/advocacy-and-policy/aap-health-initiatives/nicuverification/Pages/NICUSearch.aspx"
browser = webdriver.PhantomJS()
browser.get(url)
content = browser.page_source
或者访问实际的底层数据?
如果没有,除了复制和粘贴几个小时之外还有哪些其他方法?
编辑:
基于下面的答案,来自@thenullptr 我已经能够访问 material 但只能在第 1 页上访问。我如何调整它以跨越所有页面 [建议正确解析]?我的最终目标是将其放入 pandas dataframe
import requests
from bs4 import BeautifulSoup
r = requests.post(
url = 'https://search.aap.org/nicu/',
data = {'SearchCriteria.Level':'1', 'X-Requested-With':'XMLHttpRequest'},
) #key:value
html = r.text
# Parsing the HTML
soup = BeautifulSoup(html.split("</script>")[-1].strip(), "html")
div = soup.find("div", {"id": "main"})
div = soup.findAll("div", {"class":"blue-border panel list-group"})
def f(x):
ignore_fields = ['Collapse all','Expand all']
output = list(filter(bool, map(str.strip, x.text.split("\n"))))
output = list(filter(lambda x: x not in ignore_fields, output))
return output
results = pd.Series(list(map(f, div))[0])
继我上一条评论之后,下面的内容应该会给你一个很好的起点。在查看 XHR 调用时,您只想查看从每个调用中发送和接收的数据,以查明您需要的那个。下面是在进行搜索时发送到 API 的原始 POST 数据,看起来您至少需要使用一个并包括最后一个。
{
"SearchCriteria.Name": "smith",
"SearchCriteria.City": "",
"SearchCriteria.State": "",
"SearchCriteria.Zip": "",
"SearchCriteria.Level": "",
"SearchCriteria.LevelAssigner": "",
"SearchCriteria.BedNumberRange": "",
"X-Requested-With": "XMLHttpRequest"
}
这是一个简单的例子,说明如何使用请求库发送 post 请求,网页将回复原始数据,因此您可以使用 BS 或类似工具解析它以获取信息你需要。
import requests
r = requests.post('https://search.aap.org/nicu/',
data = {'SearchCriteria.Name':'smith', 'X-Requested-With':'XMLHttpRequest'}) #key:value
print(r.text)
打印 <strong class="col-md-8 white-text">JOHN PETER SMITH HOSPITAL</strong>...