通过Python脚本刮取动态网站:如何获取值?

时间:2017-01-31 22:23:07

标签: python selenium web-scraping phantomjs mechanize

我正试图从网站上抓取信息。到目前为止,我已经能够访问该网页,使用用户名和密码登录,然后根据需要将该登录页面的页面源打印到单独的.html / .txt文件中。

以下是出现问题的地方:在“登陆页面”上,有一张表我想从中抓取数据。如果我手动右键单击该表上的任何整数,并选择“检查”,我会找到没有问题的整数。但是,当从整个页面源看时,我没有看到整数 - 只是变量/参数名称。这让我相信它是一个充满活力的网站。

我如何抓取数据?

我去过地狱,并试图抓住这个网站,到目前为止,这里有可用的技术对我有用:

  • Firefox,IE和Opera不会渲染表格。我猜这是网站上的问题。如果我手动登录,则只有Chrome可以正常工作。
  • Selenium的Chromium软件包一直在我身上失败(在我的Windows 7笔记本电脑上),我甚至发布了question about the matter here。现在我认为这只是一个失败的原因,但我愿意慷慨地接受任何人的仁慈帮助。
  • Spynner的描述看起来很有希望,但这种设置让我感到很沮丧很长一段时间 - 而且缺乏明确的介绍只会使其繁琐的本性变成像我这样的新手。
  • 我更喜欢用Python编写代码,因为它是我最熟悉的语言。我有一个公司要求让公司在我的计算机上安装Visual Studio(尝试在C#中执行此操作),但我没有屏住呼吸......

如果我的代码有任何用处,到目前为止,这是我使用mechanize的方式:

# Headless Browsing Using PhantomJS and Selenium
#
# PhantomJS is installed in current directory
#
from selenium import webdriver
import time

browser = webdriver.PhantomJS()
browser.set_window_size(1120, 550) # need a fake browser size to fetch elements

def login_entry(username, password):
    login_email = browser.find_element_by_id('UserName')
    login_email.send_keys(username)
    login_password = browser.find_element_by_id('Password')
    login_password.send_keys(password)
    submit_elem = browser.find_element_by_xpath("//button[contains(text(), 'Log in')]")
    submit_elem.click()

browser.get("https://www.example.com")
login_entry('usr_name', 'pwd')

time.sleep(10)

test_output = open('phantomjs_test_source_output.html', 'w')
test_output.write(repr(browser.page_source))
test_output.close()

browser.quit()

.-如果有人认为我应该为这个问题标记javascript,请告诉我。我个人不知道javascript,但我感觉它可能是问题/解决方案的一部分。

1 个答案:

答案 0 :(得分:0)

尝试这样的事情。有时,对于动态页面,您需要等待数据加载。

  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  WebDriverWait(my_driver, my_time).until(EC.presence_of_all_elements_located(my_expected_element))

http://selenium-python.readthedocs.io/waits.html https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html