【问题标题】:How can a scraped HTML be different from the source code?抓取的 HTML 与源代码有何不同?
【发布时间】:2016-09-09 05:46:49
【问题描述】:

我正在从网站上抓取餐厅列表(经许可),但我遇到了问题。从网站上抓取的 html python 与源代码中的 html 不同。他们网站上不到一半的餐厅是在 python 中的 html 中找到的。这是我的代码的样子:

import requests
from bs4 import BeautifulSoup
from tempfile import TemporaryFile
import xlwt

url = 'https://www.example.com'

r = requests.get(url)
data = BeautifulSoup(r.text)
soup = data.find_all('span',{'class':'restaurant_name'})
print soup

现在我知道这很不方便,但我不能显示 html,因为公司不让我。我只是想知道你们是否普遍知道python下载的html与源代码中的html有何不同,以及我能做些什么。

提前致谢!

【问题讨论】:

  • 您将此方法与其他什么方法进行比较?你在看浏览器的 DOM 检查器吗?这显示了站点的当前状态,而不是初始来源。如果网站通过 AJAX 加载数据,那么这两件事可能会有很大的不同。
  • 您是否考虑过可以使用 Javascript 来动态添加餐厅?
  • 是的,我正在浏览器中查看检查器!我不知道这有什么不同!如何下载网站的当前状态?
  • 我不会用javascript

标签: python html web-scraping


【解决方案1】:

总之,javascript。您正在下载基本的 HTML 页面,但您不是浏览器,并且您没有下载和运行浏览器将运行的任何 javascript 代码。如今,许多网站都从一个非常小的 HTML 页面开始,并使用脚本来动态加载和显示来自服务器的附加数据。

【讨论】:

  • 如何下载网站的当前状态?
  • @titusflex 检查上面的答案,你必须使用硒
【解决方案2】:

您可以为此目的使用 Selenium。它会像浏览器一样在运行时呈现您的网页。您可以将 Selenium 与 firefox、chrome 或 phantomjs 一起使用。

我们基本上使用 selenium 来完全呈现我们的网页,因为大多数网站都是由现代 JavaScript 框架组成的。它主要用于开发 Crawlers/Scrappers 以从网站的不同页面收集数据,或者 Selenium 也用于 Web 自动化。

有关 Selenium 的更多信息,请在此处阅读 http://selenium-python.readthedocs.io/ 我还为初学者提供了有关 Slenium 的博客文章。也检查一下这个http://blog.hassanmehmood.com/creating-your-first-crawler-in-python/

示例

import urllib
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

profile_link = 'http://hassanmehmood.com'


class TitleScrapper(object):

    def __init__(self):

        fp = webdriver.FirefoxProfile()
        fp.set_preference("browser.startup.homepage_override.mstone", "ignore") #Avoid startup screen
        fp.set_preference("startup.homepage_welcome_url.additional",  "about:blank")

        self.driver = webdriver.Firefox(firefox_profile=fp)
        self.driver.set_window_size(1120, 550)

    def scrape_profile(self):
        self.driver.get(profile_link)
        print self.driver.title
        self.driver.close()

    def scrape(self):
        self.scrape_profile()


if __name__ == '__main__':
    scraper = TitleScrapper()
    scraper.scrape()

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多