需要帮助web刮板表与beautifulsoup和硒webdriver

时间:2020-04-30 03:29:22

标签: python html selenium-webdriver web-scraping beautifulsoup

因此,我正在尝试对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},但是显然与两个标题文本共享会导致问题。

一旦我能够获得标题,我就想要获得内容。我是否可以走上正确的道路,是否想得太多,或者是否有更简单的方法来完成所有这些工作,我可以为您提供一些见解。我正在学习,这是我第一次尝试使用硒库进行点击。我只是想使其工作,所以我可以在另一张桌子上再试一次,并使其尽可能自动化或可重复使用(通过调整)。

1 个答案:

答案 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")

说明:

  • 打开site
  • 选择Employment Cost Index (ECI) Civilian (Unadjusted) - CIU1010000000000A
  • 现在,您必须打开浏览器Developer Tools并导航至Network Monitor部分。 etc 按下 Ctrl + Shift + E Command + Option < / kbd> + E (在Mac上)。
  • 现在您将发现一个POST请求已完成。

    enter image description here

  • 导航至Params标签。

    enter image description here

  • 现在您可以发出POST请求。并且由于Table出现在HTML源中,并且没有通过JavaScript加载,因此您可以在bs4中进行解析或使用{{3 }}

注意:只要未通过JavaScript加载该表,您就可以阅读该表。否则,您可以尝试跟踪XHR的请求(检查先前的pandas.read_html()),也可以使用seleniumrequests_html来渲染JS,因为requestsHTTP库,无法为您呈现。