使用Scrapy爬取多个域名的最佳方法是什么?

6 投票
6 回答
4385 浏览
提问于 2025-04-16 14:47

我有大约10个网站想要抓取数据。其中有几个是WordPress博客,它们的HTML结构差不多,只是类名不同。其他的则是论坛或者其他格式的博客。

我想抓取的信息是比较常见的,包括帖子内容、时间戳、作者、标题和评论。

我的问题是,我是否需要为每个域名创建一个单独的爬虫?如果不需要,我该如何创建一个通用的爬虫,让它可以通过加载配置文件或类似的方式来抓取数据呢?

我想我可以从一个文件中加载XPath表达式,这个文件的位置可以通过命令行加载,但在抓取某些域名时似乎会遇到一些困难,因为有些需要我使用正则表达式 select(expression_here).re(regex),而有些则不需要。

6 个回答

1

我用以下的XPath表达式做了类似的事情:

  • '/html/head/title/text()' 用来获取网页的标题
  • //p[string-length(text()) > 150]/text() 用来获取内容超过150个字符的段落。
3

我也遇到过同样的问题,所以我用 type() 动态创建了一个爬虫类。

from scrapy.contrib.spiders import CrawlSpider
import urlparse

class GenericSpider(CrawlSpider):
    """a generic spider, uses type() to make new spider classes for each domain"""
    name = 'generic'
    allowed_domains = []
    start_urls = []

    @classmethod
    def create(cls, link):
        domain = urlparse.urlparse(link).netloc.lower()
        # generate a class name such that domain www.google.com results in class name GoogleComGenericSpider
        class_name = (domain if not domain.startswith('www.') else domain[4:]).title().replace('.', '') + cls.__name__
        return type(class_name, (cls,), {
            'allowed_domains': [domain],
            'start_urls': [link],
            'name': domain
        })

比如说,如果我想为 'http://www.google.com' 创建一个爬虫,我只需要这样做 -

In [3]: google_spider = GenericSpider.create('http://www.google.com')

In [4]: google_spider
Out[4]: __main__.GoogleComGenericSpider

In [5]: google_spider.name
Out[5]: 'www.google.com'

希望这能帮到你

3

在Scrapy爬虫中,可以把允许的域名设置成一个列表,比如:

class YourSpider(CrawlSpider):    
   allowed_domains = [ 'domain1.com','domain2.com' ]

希望这对你有帮助

撰写回答