因此,我正在尝试对https://data.bls.gov/cgi-bin/surveymost?bls进行网络抓取,并且能够弄清楚如何通过点击来对表格进行网络抓取。
我正在实践的选择是在“补偿”下选中与“就业成本指数(ECI)平民(未调整)-CIU1010000000000A”相关联的复选框,然后选择“检索数据”。
一旦处理了这两个表,就会显示出来。这是我要刮擦的桌子。
下面是我目前拥有的代码。
请注意,您必须为我放置<浏览器驱动程序>的浏览器驱动程序放置自己的路径。
from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd
import numpy as np
import requests
import lxml.html as lh
from selenium import webdriver
url = "https://data.bls.gov/cgi-bin/surveymost?bls"
ChromeSource = r"<browser driver>"
# Open up a Chrome browser and navigate to web page.
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless') # will run without opening browser.
driver = webdriver.Chrome(ChromeSource, chrome_options=options)
driver.get(url)
driver.find_element_by_xpath("//input[@type='checkbox' and @value = 'CIU1010000000000A']").click()
driver.find_element_by_xpath("//input[@type='Submit' and @value = 'Retrieve data']").click()
i = 2
def myTEST(i):
xpath = '//*[@id="col' + str(i) + '"]'
TEST = driver.find_elements_by_xpath(xpath)
num_page_items = len(TEST)
for i in range(num_page_items):
print(TEST[i].text)
myTEST(i)
# Clean up (close browser once completed task).
driver.close()
现在,仅查看标头。我也想获得表的内容。
如果我使i = 0,它将产生“年份”。 i = 1,则产生“句点”。但是,如果我选择i = 2,则会得到两个变量,它们的“估计值”和“标准误差”具有相同的col2 id。
我试图想出一种方法来解决此问题,但似乎无法获得我研究的任何成果。
从本质上讲,最好先单击完成并在感兴趣的表上开始,然后查看标题的xpath并为所有子目录拉入文本。 / p>
<tr> == $0
<th id="col0"> Year </th>
<th id="col1"> Period </th>
<th id="col2">Estimated Value</th>
<th id="col2">Standard Error</th>
<tr>
我不确定该怎么做。我也尝试遍历{i},但是显然与两个标题文本共享会导致问题。
一旦我能够获得标题,我就想要获得内容。我是否可以走上正确的道路,是否想得太多,或者是否有更简单的方法来完成所有这些工作,我可以为您提供一些见解。我正在学习,这是我第一次尝试使用硒库进行点击。我只是想使其工作,所以我可以在另一张桌子上再试一次,并使其尽可能自动化或可重复使用(通过调整)。
答案 0 :(得分:3)
实际上,您不需要selenium
,只需跟踪POST
Form data
,然后在POST
请求中应用它们即可。
然后,您可以使用Pandas
轻松加载表格。
import requests
import pandas as pd
data = {
"series_id": "CIU1010000000000A",
"survey": "bls"
}
def main(url):
r = requests.post(url, data=data)
df = pd.read_html(r.content)[1]
print(df)
main("https://data.bls.gov/cgi-bin/surveymost")
说明:
Employment Cost Index (ECI) Civilian (Unadjusted) - CIU1010000000000A
Network Monitor
部分。 etc 按下 Ctrl + Shift + E ( Command + Option < / kbd> + E (在Mac上)。现在您将发现一个POST
请求已完成。
导航至Params
标签。
现在您可以发出POST
请求。并且由于Table
出现在HTML
源中,并且没有通过JavaScript
加载,因此您可以在bs4
中进行解析或使用{{3 }}
注意:只要未通过JavaScript
加载该表,您就可以阅读该表。否则,您可以尝试跟踪XHR
的请求(检查先前的pandas.read_html()),也可以使用selenium
或requests_html
来渲染JS
,因为requests
是HTTP
库,无法为您呈现。