我正试图抓住这个网站:
http://stats.uis.unesco.org/unesco/TableViewer/tableView.aspx?ReportId=210
使用Python和Selenium(参见下面的代码)。内容是动态生成的,显然未加载浏览器中不可见的数据。我尝试使浏览器窗口变大,并滚动到页面底部。扩大窗口可以获得我想要的所有水平方向数据,但仍有大量数据需要在垂直方向上进行刮擦。滚动看起来根本不起作用。
有没有人对如何做到这一点有任何好主意?
谢谢!
from selenium import webdriver
import time
url = "http://stats.uis.unesco.org/unesco/TableViewer/tableView.aspx?ReportId=210"
driver = webdriver.Firefox()
driver.get(url)
driver.set_window_position(0, 0)
driver.set_window_size(100000, 200000)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5) # wait to load
soup = BeautifulSoup(driver.page_source)
table = soup.find("table", {"id":"DataTable"})
### get data
thead = table.find('tbody')
loopRows = thead.findAll('tr')
rows = []
for row in loopRows:
rows.append([val.text.encode('ascii', 'ignore') for val in row.findAll(re.compile('td|th'))])
with open("body.csv", 'wb') as test_file:
file_writer = csv.writer(test_file)
for row in rows:
file_writer.writerow(row)
答案 0 :(得分:5)
这将使您将整个csv自动保存到磁盘,但我还没有找到一种可靠的方法来确定下载完成的时间:
import os
import contextlib
import selenium.webdriver as webdriver
import csv
import time
url = "http://stats.uis.unesco.org/unesco/TableViewer/tableView.aspx?ReportId=210"
download_dir = '/tmp'
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.dir", download_dir)
# 2 means "use the last folder specified for a download"
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-csv")
# driver = webdriver.Firefox(firefox_profile=fp)
with contextlib.closing(webdriver.Firefox(firefox_profile=fp)) as driver:
driver.get(url)
driver.execute_script("onDownload(2);")
csvfile = os.path.join(download_dir, 'download.csv')
# Wait for the download to complete
time.sleep(10)
with open(csvfile, 'rb') as f:
for line in csv.reader(f, delimiter=','):
print(line)
<强>解释强>
将浏览器指向url
。
您会看到Actions
菜单中包含Download report data...
选项和名为"Comma-delimited ASCII format (*.csv)"
的子选项。如果你检查这些单词的HTML,你会发现
"Comma-delimited ASCII format (*.csv)","","javascript:onDownload(2);"
因此,您可能会尝试让webdriver
执行JavaScript函数调用onDownload(2)
。我们可以用
driver.execute_script("onDownload(2);")
但通常会弹出另一个窗口询问您是否要保存文件。为了自动保存到磁盘,我使用了this FAQ中描述的方法。棘手的部分是找到要在此行指定的正确MIME类型:
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-csv")
由于我们没有csv文件的网址,因此常见问题解答中描述的curl
方法不起作用。但是,this page描述了另一种查找MIME类型的方法:使用Firefox浏览器打开保存对话框。选中“为此类文件自动执行此操作”复选框。然后检查~/.mozilla/firefox/*/mimeTypes.rdf
的最后几行,了解最近添加的说明:
<RDF:Description RDF:about="urn:mimetype:handler:application/x-csv"
NC:alwaysAsk="false"
NC:saveToDisk="true">
<NC:externalApplication RDF:resource="urn:mimetype:externalApplication:application/x-csv"/>
</RDF:Description>
这告诉我们mime类型是"application/x-csv"
。宾果,我们在做生意。
答案 1 :(得分:0)
您可以按
进行滚动self.driver.find_element_by_css_selector("html body.TVTableBody table#pageTable tbody tr td#cell4 table#MainTable tbody tr td#vScrollTD img[onmousedown='imgClick(this.sbar.visible,this,event);']").click()
似乎一旦你可以滚动抓取应该是非常标准的,除非我遗漏了什么