4.1 100 万个网页
想要测试并发下载的性能,最好要有一个大型的目标网站。为此,本章将使用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论