【问题标题】:How do I scrape websites which don't return the source code using Python? [duplicate]如何使用 Python 抓取不返回源代码的网站? [复制]
【发布时间】:2018-04-21 21:03:58
【问题描述】:

我正在尝试从以下网站获取澳大利亚证券交易所公司发布的公告的“ASX 代码”:http://www.asx.com.au/asx/statistics/todayAnns.do

到目前为止,我已经尝试通过以下代码使用 BeautifulSoup:

import requests
from bs4 import BeautifulSoup
response = requests.get('http://www.asx.com.au/asx/statistics/todayAnns.do')
parser = BeautifulSoup(response.content, 'html.parser')
print(parser)

但是,当我打印它时,它的打印结果与我手动进入页面并查看页面源时的打印效果不同。我做了一些谷歌搜索并查看了 stackoverflow,并认为这是由于页面上运行的 Javascript 隐藏了 html 代码。

但是我不确定如何解决这个问题。任何帮助将不胜感激。

提前致谢。

【问题讨论】:

  • 你标记了 Selenium,你试过了吗?
  • 我完全不确定从哪里开始使用 Selenium。我找到了一个单击按钮并在此处提供源代码的示例:stackoverflow.com/questions/8960288/… 但我不需要单击按钮 - 我只需要源代码。不过我会继续寻找。感谢@cricket_007 的链接。
  • 网站是动态生成的,除了使用和查找他们的 API 来请求您需要的数据或浏览器模拟器我想不出解决方案。
  • @ElvirMuslic 浏览器模拟器是一个可行的选择吗?硒会起作用吗?我写了一个硒代码的sn-p:from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get('http://www.asx.com.au/asx/statistics/todayAnns.do') tickers = driver.find_elements_by_class_name("row") print(tickers)。但是我很确定 Selenium 只适用于 Python 2,而我只有 Python 3
  • 绝对支持python 3。pypi.python.org/pypi/selenium

标签: python selenium web-scraping beautifulsoup dryscrape


【解决方案1】:

试试这个。您需要做的就是让爬虫等待一段时间,直到页面加载完毕,因为您可能已经注意到内容正在动态加载。但是,执行后,您将从该网页获取表格的左侧标题。

import time
from bs4 import BeautifulSoup
from selenium  import webdriver

driver = webdriver.Chrome()
driver.get('http://www.asx.com.au/asx/statistics/todayAnns.do')
time.sleep(8)

soup = BeautifulSoup(driver.page_source,"lxml")
for item in soup.select('.row'):
    print(item.text)
driver.quit()

部分结果:

RLC
RNE
PFM
PDF
HXG
NCZ
NCZ

顺便说一句,我已经使用 python 3.5 编写并执行了这段代码。因此,在绑定 selenium 方面,最新版本的 python 没有任何问题。

【讨论】:

  • 非常感谢。这很漂亮。我实际上最后写了一个和这个非常相似的代码,只是我使用了re而不是bs4。对此,我真的非常感激。如果我想大规模地做这件事,你知道我将如何休眠硒的过程吗?再次感谢!
  • 加速进程*而不是睡眠
  • 有一个等待功能。例如,您可以通过 XPath 或其他方式找到该元素,from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0 ff = webdriver.Firefox() ff.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement"))) finally: ff.quit()
  • @ElvirMuslic 谢谢。这非常有帮助。
  • @JamesWard 很高兴您发现这很包容。这是关于显式等待的官方文档,selenium-python.readthedocs.io/waits.html#explicit-waits 您也可以使用隐式(意味着它与 sleep(5) 相同)。在那里你可以找到各种各样的例子,这些例子是为了让你可以理解图书馆并立即使用它们。
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 2020-03-05
  • 2013-11-20
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多