我有一个大学网址列表等www.harvard.edu, www.berkeley.edu
。我需要在各自的网站中找到 cse 部门网址我最初打算做的是通过给定的 url 中的链接并通过指定深度来爬行,比如 3 它会跟随链接并尝试在该页面上抓取的链接中查找 cse 或计算机或单词列表,匹配链接及其锚文本作为结果返回到 csv 文件中。如果没有包含 cse 的链接或这样的词,它应该返回 not found 或类似的想法是稍后将 csv 文件推送到数据库中。我怎样才能做到这一点?
问问题
1555 次
2 回答
0
为了解决您的问题,您可以使用scrapy框架。
从scrapy web中提取:
Scrapy 是一个快速的高级屏幕抓取和网络抓取框架,用于抓取网站并从其页面中提取结构化数据。它可用于广泛的用途,从数据挖掘到监控和自动化测试。
于 2012-11-07T11:00:28.150 回答
0
这是一项相当复杂的任务,我建议使用如下结构的数据库:
TABLE pages (
`absolute_url` VARCHAR(255) NOT NULL,
`visited` TINYINT(1) DEFAULT 0,
-- Additional fields
UNIQUE KEY (`absolute_url`)
)
小解释:
absolute_url
包含页面的完整 URL(以 开头http[s]://
)并在其上放置了唯一索引。这样你就可以确保你不会递归或处理多个链接两次visited
通知您网站是否已被访问(和处理)。该字段对于防止再次访问非常重要,并允许您在程序崩溃(即网络停机)时优雅地恢复
你可以通过 CSV 自己实现这些东西,或者关联数组,但数据库对我来说是最熟悉的解决方案。
该算法将如下所示:
database.insert( 'http://www.harvard.edu')
database.insert( 'http://www.berkeley.edu')
# In case of failure you'll start at this point:
while database.get_count( WHERE visited = 0) < 0:
for url in database.get_records( WHERE visited = 0):
content = http_client.load(url)
time.sleep(5) # You don't want to flood server
# Problematic URLs will be parsed later
if (not content) or (http_client.is_error):
continue;
for i in content.get_all_urls():
i = make_absolute(i, url)
# Also don't crawl remote sites, images, ...
if not is_valid_url(i):
continue
database.insert(i)
这是伪代码,我不会全部为你实现。
于 2012-11-07T11:10:18.330 回答