首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写爬虫?

如何编写爬虫?
EN

Stack Overflow用户
提问于 2008-09-19 15:09:24
回答 10查看 59.3K关注 0票数 64

我曾经想过尝试写一个简单的爬虫,它可以爬行,并为我们的NPO的网站和内容生成一个搜索结果列表。

有没有人对如何做到这一点有什么想法?你从哪里开始抓取爬虫?它是如何传回它的发现并继续爬行的呢?它如何知道它找到了什么,等等。

EN

回答 10

Stack Overflow用户

发布于 2008-09-19 15:25:22

可以肯定的是,你将重新发明轮子。但这里有一些基础知识:

  • 未访问的URL列表-以一个或多个起始页作为种子
  • 访问的URL列表-这样您就不会绕圈子
  • 不感兴趣的URL的一组规则-因此您不会索引整个

将它们放在永久存储中,这样您就可以停止和启动crawler,而不会丢失状态。

算法是:

代码语言:javascript
复制
while(list of unvisited URLs is not empty) {
    take URL from list
    remove it from the unvisited list and add it to the visited list
    fetch content
    record whatever it is you want to about the content
    if content is HTML {
        parse out URLs from links
        foreach URL {
           if it matches your rules
              and it's not already in either the visited or unvisited list
              add it to the unvisited list
        }
    }
}
票数 150
EN

Stack Overflow用户

发布于 2011-12-19 21:45:22

爬虫的复杂部分是如果你想要将它扩展到大量的网站/请求。在这种情况下,您将不得不处理一些问题,例如:

  • 不可能将所有信息都保存在一个数据库中。
  • 没有足够的内存来处理巨大的index(s)
  • Multithread性能和concurrency
  • Crawler陷阱(通过更改urls、日历、会话ids而创建的无限循环...)来自servers
  • Databases的多个computer
  • Malformed HTML codes
  • Constant http错误的
  • 爬取没有压缩,这使您需要大约8倍的bigger.
  • Recrawl例程和priorities.
  • Use请求压缩(Deflate/

)(适用于任何类型的爬虫)。

和一些重要的事情

在每次请求时,

  • 都会遵守robots.txt
  • And爬虫延迟的要求,以避免扼杀web服务器。
票数 30
EN

Stack Overflow用户

发布于 2012-12-12 23:40:05

多线程网络爬虫

如果你想抓取大型网站,那么你应该编写一个多线程的爬虫。在文件/数据库中连接、获取和写入抓取的信息-这是抓取的三个步骤,但如果你使用单线程,那么你的CPU和网络利用率将会很高。

多线程网络爬虫需要两个数据结构-linksVisited(这应该实现为hashmap或trai)和linksToBeVisited(这是一个队列)。

网络爬虫使用BFS遍历万维网。

一个基本的网络爬虫算法:

  1. 向linksToBeVisited添加一个或多个种子urls。将url添加到元素的方法必须是synchronized.
  2. Pop an linksToBeVisited from linksToBeVisited并将此添加到linksVisited。这个弹出方法从internet.
  3. Parse文件中弹出url必须是从linksToBeVisited中弹出页面,并将在页面中找到的任何至今未访问的链接添加到linksToBeVisited中。如果需要,可以对URL进行过滤。用户可以给出一组规则来过滤要扫描的url。
  4. 在页面上找到的必要信息被保存在数据库或文件中。
  5. 重复步骤2到5,直到queue is linksToBeVisited linksToBeVisited。

下面是关于如何同步线程的代码片段……

public void add(String site) { synchronized (this) { if (!linksVisited.contains(site)) { linksToBeVisited.add(site);} public String next() { if (linksToBeVisited.size() == 0) { return null;}已同步(此){ //如果(linksToBeVisited.size() > 0) { String s= linksToBeVisited.get(0);linksToBeVisited.remove(0);linksVisited.add(s);return s;} return null;} },则需要再次检查大小是否已更改

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/102631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档