【问题标题】:When scraping a webpage that uses Javascript (and perhaps other things)抓取使用 Javascript(可能还有其他东西)的网页时
【发布时间】:2015-11-01 04:44:19
【问题描述】:

我希望能够访问this search result within a site 之类的网页,并能够收集各种结果的链接。我正在使用 Python 的 urllib.request 和 bs4 进行抓取。但是,尽我所能理解我正在查看的内容,链接位于某种嵌入式 Javascript 对象中。

我尝试直接下载该页面的HTML源代码以尝试查看并理解它,但是它下载为一个包含图片和各种HTML文件的整个文件夹,我不知道单个网页如何可以是一个文件。但我所做的却是:

import urllib.request as ul
url = 'http://www.epicurious.com/tools/searchresults?search=banana'
source = ul.urlopen(url)
with open('pagesource.html', 'w') as f:
    f.write(source.read())

然后查看它生成的文档。但是,在它生成的文档中,我在搜索结果中看不到任何指向食谱的链接。

谁能告诉我页面上发生了什么,以及如何收集搜索结果中的链接?

【问题讨论】:

    标签: javascript python html


    【解决方案1】:

    在浏览器开发者工具中打开 HTML 并检查链接食谱的锚点。你会发现:

    <a href="/recipes/food/views/easter-bread-395055" class="recipeLnk">Easter Bread</a>
    

    这些结果不使用 JavaScript。下面是一些基本的 Python3,用于使用 Requests 和 BeautifulSoup 获取所有食谱的链接:

    import requests
    from bs4 import BeautifulSoup
    
    URL_EPICURIOUS_SEARCH="http://www.epicurious.com/tools/searchresults?search="
    SEARCH_TEXT="banana"
    
    # Run the search and get the HTML result
    response = requests.get(URL_EPICURIOUS_SEARCH + SEARCH_TEXT)
    if response.status_code != 200:
        print("HTTP Status:" + response.status_code)
        exit()
    
    soup = BeautifulSoup(response.text, 'html.parser')
    # Search for all links with class "recipeLink"
    recipes = soup.find_all("a", class_="recipeLnk")
    
    # Loop through the set and print all hrefs.
    for recipe in recipes:
        if recipe.has_attr('href'):
            print(recipe['href'])
    

    输出:

    $ python3 recipe-search.py
    /recipes/food/views/banana-pudding-356830
    /recipes/food/views/banana-bread-51200430
    /recipes/food/views/banana-bread-51200020
    ...
    

    【讨论】:

    • 非常感谢。我尝试使用开发人员工具,但在其中的任何地方都找不到链接。这些工具似乎被组织为文件夹,我再次不明白页面是如何成为文件夹的——我了解页面是如何引用文件夹中其他对象的 HTML 文件,但这似乎比我的任何东西都复杂一点'已经学会了。无论如何,您编写的代码对我有用,所以我会尝试理解这一点,也许玩够它会让我明白一切。
    • 嗯,不,玩它并没有回答我的问题(也尝试阅读requests 上的文档)。据我所知,requests 从网页中获得的信息比我的代码在urllib 中获得的信息多。 urllib 似乎只下载页面的一部分是否有原因?这是否与网页作为文件夹有关——也许requests 能够处理并从文件夹中提取所有代码,而urllib 仅从主框架 HTML 文件中提取代码?
    • requestsurllib 应该从服务器检索相同的数据。我使用requests,因为它更容易/更快。您可以使用 urllib 实现相同的功能。
    【解决方案2】:

    有一个方便的命令行工具叫做 wget

    wget http://www.epicurious.com/tools/searchresults?search=banana
    

    这会将页面下载到文件中(与查看页面源代码相同)。如果你找出那个文件并将其通过管道输入到一个 grep 中,比如...'Banana Pudding'

    searchresults?search=banana <-- file generated from wget command above
    
    cat searchresults?search=banana | grep 'Banana Pudding'
    

    其中一个匹配是一行

    <a href="/recipes/food/views/banana-pudding-356830" class="recipeLnk">Banana Pudding</a>
    

    然后将其与您的原始 URL 一起使用来制定食谱的链接:

    http://www.epicurious.com +
                             /recipes/food/views/banana-pudding-356830
    
    http://www.epicurious.com/recipes/food/views/banana-pudding-356830
    

    底部链接为您提供食谱!现在只需自动化我们在此处手动执行的操作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 2010-11-02
      • 2017-05-22
      相关资源
      最近更新 更多