返回介绍

4.1 100 万个网页

发布于 2024-02-05 23:37:18 字数 2161 浏览 0 评论 0 收藏 0

想要测试并发下载的性能,最好要有一个大型的目标网站。为此,本章将使用Alexa提供的最受欢迎的100万个网站列表,该列表的排名根据安装了Alexa工具栏的用户得出。尽管只有少数用户使用了这个浏览器插件,其数据并不权威,但对于我们这个测试来说已经足够了。

我们可以通过浏览Alexa网站获取该数据,其网址为http://www. alexa.com/topsites 。此外,我们也可以通过http://s3.amazonaws. com/alexa-static/top-1m.csv.zip 直接下载这一列表的压缩文件,这样就不用再去抓取Alexa网站的数据了。

4.1.1 解析Alexa列表

Alexa网站列表是以电子表格的形式提供的,表格中包含两列内容,分别是排名和域名,如图4.1所示。

图4.1

抽取数据包含如下4个步骤。

1.下载.zip 文件。

2.从.zip 文件中提取出CSV文件。

3.解析CSV文件。

4.遍历CSV文件中的每一行,从中抽取出域名数据。

下面是实现上述功能的代码。

import csv
from zipfile import ZipFile
from StringIO import StringIO
from downloader import Downloader

D = Downloader()
zipped_data = D('http://s3.amazonaws.com/alexa-static/top-1m.csv.zip')
urls = [] # top 1 million URL's will be stored in this list
with ZipFile(StringIO(zipped_data)) as zf:
    csv_filename = zf.namelist()[0]
    for _, website in csv.reader(zf.open(csv_filename)):
        urls.append('http://' + website)

你可能已经注意到,下载得到的压缩数据是在使用StringIO 封装之后,才传给ZipFile 的。这是因为ZipFile 需要一个类似文件的接口,而不是字符串。接下来,我们从文件名列表中提取出CSV文件的名称。由于这个.zip 文件中只包含一个文件,所以我们直接选择第一个文件名即可。然后遍历该CSV文件,将第二列中的域名数据添加到URL列表中。为了使URL合法,我们还会在每个域名前添加http:// 协议。

要想在之前开发的爬虫中复用上述功能,还需要修改scrape_callback 接口。

class AlexaCallback:
    def __init__(self, max_urls=1000):
        self.max_urls = max_urls
        self.seed_url = 'http://s3.amazonaws.com/alexa-static/
            top-1m.csv.zip'

    def __call__(self, url, html):
        if url == self.seed_url:
            urls = []
            with ZipFile(StringIO(html)) as zf:
                csv_filename = zf.namelist()[0]
                for _, website in
                    csv.reader(zf.open(csv_filename)):
                    urls.append('http://' + website)
                    if len(urls) == self.max_urls:
                        break
            return urls

这里添加了一个新的输入参数max_urls ,用于设定从Alexa文件中提取的URL数量。默认情况下,该值被设置为1000个URL,这是因为下载100万个网页的耗时过长(正如本章开始时提到的,串行下载需要花费超过11天的时间)。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文