【问题标题】:BeautifulSoup Scraping: loading div instead of the contentBeautifulSoup Scraping:加载 div 而不是内容
【发布时间】:2016-02-21 10:37:21
【问题描述】:

这里是菜鸟。 我正在尝试从该网站抓取搜索结果:http://www.mastersportal.eu/search/?q=di-4|lv-master&order=relevance

我正在使用 python 的 BeautifulSoup

import csv
import requests
from BeautifulSoup import BeautifulSoup

for numb in ('0', '69'):
        url = ('http://www.mastersportal.eu/search/?q=ci-30,11,10,3,4,8,9,14,15,16,17,34,1,19|di-4|lv-master|rv-1&start=' + numb + '0&order=tuition_eea&direction=asc')
        response = requests.get(url)
        html = response.content

        soup = BeautifulSoup(html)
        table = soup.find('div', attrs={'id': 'StudySearchResults'})

        lista = []
        for i in table.findAll('h3'):
            lista.append(h3.string)
print(table.prettify())

我想获取包含 Master 基本信息的干净数据(现在只是名称)。 我在这里使用的 URL 用于对网站进行过滤研究,并且继续处理页面的循环应该没问题。

但是,结果是:

<div id="StudySearchResults">
  <div style="display:none" id="TrackingSearchValue" class="TrackingSearchValue" data-search=""></div>
  <div style="display:none" id="SearchViewEvent" class="TrackingEvent TrackingNoLocation" data-type="srch" data-action="view" data-id=""></div>
  <div id="StudySearchResultsStudies" class="TrackingLinkedList" data-start="" data-list-type="study" data-type="rslts">
    <!-- Wait pane, just here to make sure there is no white page -->
    <div id="WaitPane" class="WaitPane">
      <img src="http://www.mastersportal.eu/Modules/Results/Resources/Throbber.gif" />
      <span>Loading search results...</span>
    </div>
  </div>
</div>

为什么不显示内容而只显示加载 div?环顾四周,我觉得这与网站使用 JavaScript 处理数据的方式有关,Python 是否存在诸如 AJAX 请求之类的东西? (或任何其他方式告诉爬虫等待页面加载?)

【问题讨论】:

  • 尝试h3.get_text() 而不是h3.stringDocs
  • 该页面正在发出ajax请求以获取格式的数据json,您需要直接查询api端点(检查Chrome devtools中的网络选项卡)
  • 你想从页面中得到什么,什么是“master”?
  • @WalidSaad 谢谢,但我不知道如何从那开始,你对我可以读到的关于如何使用 Chrome devtools 刮擦的东西有什么建议吗?

标签: javascript python html web-scraping beautifulsoup


【解决方案1】:

如果你只想要文本,你应该这样做

lista.append(h3.get_text())

关于你的第二个问题,jsfan 的回答是对的。您应该尝试 Selenium 并使用其 wait 功能来等待您的搜索结果,该结果出现在 divs 中,类名为 Result master premium

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "div[@class*='Result master premium']))
)

【讨论】:

  • 对,我首先要了解Selenium的使用,然后我会使用这个方法。谢谢!
【解决方案2】:

您基本上已经回答了自己的问题。 Beautiful Soup 是一个纯粹的网络爬虫,它只会下载服务器为特定 URL 返回的任何内容。

如果您想呈现在浏览器中显示的页面,您需要使用Selenium Webdriver 之类的东西,它会启动一个实际的浏览器并对其进行远程控制。

虽然使用 Webdriver 非常强大,但它的学习曲线也比纯网络抓取要陡峭得多。

如果您想开始在 Python 中使用 Webdriver,official documentation 是一个不错的起点。

【讨论】:

  • 感谢您的资源。你说得对,以我的水平,这可能有点难以深入,但非常需要!
  • 一定要争取。我并不是要阻止你,而是要确保你知道自己在做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
相关资源
最近更新 更多