在抓取使用Javascript(也许还有其他东西)的网页时

时间:2015-11-01 04:44:20

标签: javascript python html

我希望能够访问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())

然后查看它生成的文档。但是,在它生成的文档中,我没有看到搜索结果中的配方的任何链接。

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

2 个答案:

答案 0 :(得分:2)

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

items: [{
                    xtype: 'textfield',
                    flex: 1,
                    listeners: {
                        focus( a, event, eOpts ){
                            alert("onFocus");
                        }
                    },
                }, {
                    xtype: 'splitter'
                }, {
                    xtype: 'textfield',
                    flex: 1
                }, {
                    xtype: 'splitter'
                }, {
                    xtype: 'textfield',
                    flex: 1
                }]

Javascript不用于这些结果。这里有一些基本的Python3,可以使用Requests和BeautifulSoup获取所有食谱的链接:

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

输出:

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'])

答案 1 :(得分:0)

有一个名为wget的便捷命令行工具

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

这会将页面下载到文件(与View Page Source相同)。如果你把那个文件拿出来并把它管成一个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>

然后将其与原始网址一起使用,以制定指向食谱的链接:

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

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

底部链接为您提供食谱!现在只需手动自动化我们在这里做的事情