我想在外部文件中定义我的抓取规则,这样就不需要为每个网站更改核心代码。该文件将有几个规则,每个规则对不同的网站生效。我有 start_urls 和 allowed_domains 的外部文件,但我们希望了解有关规则的最佳解决方法。
我想我可以使用xpath或regex规则。
谢谢!
答案 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
对象,则可以像上面的示例一样保留回调。
你可以想象使用其他特殊键来链接。