Scrapy - 外部可配置的抓取规则

时间:2016-06-21 14:01:18

标签: python xpath scrapy

我想在外部文件中定义我的抓取规则,这样就不需要为每个网站更改核心代码。该文件将有几个规则,每个规则对不同的网站生效。我有 start_urls allowed_domains 的外部文件,但我们希望了解有关规则的最佳解决方法。

我想我可以使用xpath或regex规则。

谢谢!

1 个答案:

答案 0 :(得分:3)

提取规则的一个选项是使用Parsley DSL

parslepy是Python中the language的实现(免责声明:我编写了parslepy)

使用parslepy,您可以使用XPath和CSS选择器。你得到了一个Python字典。

这是一个示例黑客新闻蜘蛛,在回调中使用规则中的特殊“_items”键作为scrapy的输出项目:

# -*- coding: utf-8 -*-
import parslepy
import scrapy


class HnSpider(scrapy.Spider):
    name = "hn"
    allowed_domains = ["news.ycombinator.com"]
    start_urls = (
        'https://news.ycombinator.com/',
    )
    parselet = parslepy.Parselet({
        "_items(tr.athing)": [
            {
                "title": "td.title > a",
                "source": "td.title span a",
                "rank": "span.rank",
                "--(./following-sibling::tr[1])":
                {
                    "score": "span.score",
                    "age": "span.age",
                    "comments": "span.age ~ a:last-child"
                }
            }
        ]
    })

    def parse(self, response):
        return self.parselet.parse_fromstring(
            response.body).get("_items", [])

外部文件可以是带有规则的JSON对象。如果使用此JSON文件中的数据初始化spider的self.parselet对象,则可以像上面的示例一样保留回调。

你可以想象使用其他特殊键来链接。