NaiboWang / EasySpider

A visual no-code/code-free web crawler/spider易采集:一个可视化浏览器自动化测试/数据采集/爬虫软件,可以无代码图形化的设计和执行爬虫任务。别名:ServiceWrapper面向Web应用的智能化服务封装系统。
https://www.easyspider.net
Other
34.71k stars 4.25k forks source link

关于爬取美国参议员股票持仓的问题 #407

Closed ylxwyj closed 4 months ago

ylxwyj commented 4 months ago

你好。

我试图从 https://efdsearch.senate.gov/ 爬取参议员的股票持仓数据;

用Chrome浏览器,在点击 Search 按钮后,可以看到搜索结果,如下图: 屏幕截图 2024-05-28 205608

但是,如果用 EasySpider,无论选择纯净浏览器,还是带用户信息的浏览器,都无法正常显示搜索结果,如下图: 屏幕截图 2024-05-28 205553

这是我的第一次尝试,软件使用不熟练。具体的任务设置如下图: 屏幕截图 2024-05-28 205818

请问,出现上述问题的原因是什么?该如何解决?

ylxwyj commented 4 months ago

btw,我用Python写过如下代码,在Pycharm中运行,是可以实现上述操作的。

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import csv import time

创建一个Chrome浏览器实例

driver = webdriver.Chrome()

导航到目标网页

driver.get("https://efdsearch.senate.gov/search/")

try:

等待复选框出现并点击

checkbox = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "agree_statement"))
)
checkbox.click()

# 等待 Senator 复选框可点击并点击
senator_checkbox = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "input.senator_filer"))
)
senator_checkbox.click()

# 等待 Periodic Transactions 复选框可点击并点击
ptr_checkbox = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//input[@id='reportTypes' and @value='11']"))
)
ptr_checkbox.click()

# 等待'Search Reports'按钮可点击并点击
search_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type='submit']"))
)
search_button.click()

# 等待搜索结果出现
results_table = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "searchResultsTable"))
)

# print(results_table)

# 解析搜索结果
soup = BeautifulSoup(driver.page_source, 'html.parser')
table = soup.find('table', {'id': 'searchResultsTable'})

data = []
rows = table.find_all('tr')
for row in rows[1:]:  # 跳过表头行
    cols = row.find_all('td')
    report = {
        'last_name': cols[0].text.strip(),
        'first_name': cols[1].text.strip(),
        'report_type': cols[2].text.strip(),
        'date_received': cols[3].text.strip(),
        'report_year': cols[4].text.strip(),
        'detail_link': cols[5].find('a')['href']
    }
    data.append(report)

# 将数据写入CSV文件
with open('senate_financial_reports.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames=data[0].keys())
    writer.writeheader()
    writer.writerows(data)

print(f"Successfully scraped {len(data)} reports.")

except Exception as e: print(f"An error occurred: {str(e)}")

finally: driver.quit()

NaiboWang commented 4 months ago

政府网站不予答疑,问题关闭。