【问题标题】:How To Make A Web Crawler More Efficient?如何让网络爬虫更高效?
【发布时间】:2017-01-22 20:23:10
【问题描述】:

这是一个代码:

str_regex = '(https?:\/\/)?([a-z]+\d\.)?([a-z]+\.)?activeingredients\.[a-z]+(/?(work|about|contact)?/?([a-zA-z-]+)*)?/?'

import urllib.request
from Stacks import Stack
import re
import functools
import operator as op
from nary_tree import *
url = 'http://www.activeingredients.com/'
s = set()
List = []
url_list = []
def f_go(List, s, url):
    try:
        if url in s:
            return
        s.add(url)
        with urllib.request.urlopen(url) as response:
            html = response.read()
            #print(url)
        h = html.decode("utf-8")
        lst0 = prepare_expression(list(h))
        ntr = buildNaryParseTree(lst0)
        lst2 = nary_tree_tolist(ntr)
        lst3= functools.reduce(op.add, lst2, [])
        str2 = ''.join(lst3)
        List.append(str2)
        f1 = re.finditer(str_regex, h)

        l1 = []
        for tok in f1:
            ind1 = tok.span()
            l1.append(h[ind1[0]:ind1[1]])
    for exp in l1:
        length = len(l1)
        if (exp[-1] == 'g' and exp[length - 2] == 'p' and exp[length - 3] == 'j')  or \
            (exp[-1] == 'p' and exp[length - 2] == 'n' and exp[length - 3] == 'g'):
                pass
        else:
            f_go(List, s, exp, iter_cnt + 1, url_list)
except:
    return

它基本上使用 urllib.request.urlopen 在循环中递归地打开 url;是否在某个域中(在这种情况下为 activeingredients.com);从页面中提取链接是通过正则表达式完成的。在里面,打开页面它会解析它并作为字符串添加到列表中。因此,假设要做的是遍历给定的域,提取信息(在这种情况下是有意义的文本),添加到列表中。尝试 except 块,只在所有 http 错误的情况下返回(以及所有其他错误,但这是经过测试和工作的)。
例如,它适用于这个小页面,但对于更大的页面非常慢并且会占用内存。
解析,准备页面,我相信或多或少地做正确的工作。
问题是,有没有一种有效的方法来做到这一点?网络搜索如何如此快速地通过网络爬行?

【问题讨论】:

  • 如果这是工作代码,请参阅Code Review。但是你为什么是parsing HTML with regex
  • 在我看来,您绝对应该使用多线程,因为大部分时间您都在等待网络内容。您应该同时发送多个请求。
  • 这是一个很好的问题,但答案很复杂。对于初学者,您应该使用数据库来存储数据,这样就不需要将整个数据集加载到内存中。此外,您应该并行加载多个 Web 请求。但是,是的,这是一项复杂的任务。也许尝试寻找一个现有的库来做到这一点?
  • @jonrsharpe:更糟糕的是:对内容使用迭代器并检查每个字符。
  • 图书馆推荐与 SO 无关。

标签: python html web web-crawler


【解决方案1】:

首先:我不认为 Google 的网络爬虫是在一台笔记本电脑或一台个人电脑上运行的。因此,如果您不能像大公司那样获得结果,请不要担心。

需要考虑的要点:

  1. 您可以从可以从许多网站下载的大量单词开始。这会整理出一些无用的 url 组合。之后,您也可以仅使用字母进行爬网,以在索引中获取无用的命名站点。

  2. 您可以从 dns 服务器上所有已注册域的列表开始。 IE。像这样:http://www.registered-domains-list.com

  3. 使用多个线程

  4. 有很多带宽

  5. 考虑购买 Google 的数据中心

这些要点只是让您了解如何改进爬虫的基本思路。

【讨论】:

  • 谢谢,很明显,我发现它比我想象的要大。
  • 是的。并且不可能让它保持小(不幸的是)。如果您认为该答案有帮助,您可以投票(仅当您愿意时)。我很高兴能帮助你。快乐编码 ;-)
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多