我有大约10个奇怪的网站,我希望从中获取。其中一些是wordpress博客,他们遵循相同的HTML结构,虽然有不同的类。其他是论坛或其他格式的博客。
我喜欢抓的信息很常见 - 帖子内容,时间戳,作者,标题和评论。
我的问题是,我是否必须为每个域创建一个单独的蜘蛛?如果没有,我如何创建一个通用蜘蛛,允许我通过从配置文件或类似的东西加载选项来刮掉?
我想我可以从一个文件中加载xpath表达式,这个位置可以通过命令行加载,但是在抓取某些域时似乎有一些困难要求我使用正则表达式select(expression_here).re(regex)
而有些则没有。
答案 0 :(得分:1)
我使用以下XPath表达式做同样的事情:
'/html/head/title/text()'
标题为//p[string-length(text()) > 150]/text()
了解帖子内容。答案 1 :(得分:1)
在scrapy spider中,将allowed_domains设置为域列表,例如:
class YourSpider(CrawlSpider):
allowed_domains = [ 'domain1.com','domain2.com' ]
希望有所帮助
答案 2 :(得分:1)
您可以使用空的allowed_domains
属性来指示scrapy不要过滤任何异地请求。但在这种情况下,你必须小心,只返回蜘蛛的相关请求。
答案 3 :(得分:1)
我遇到了同样的问题,所以我使用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'
希望这有帮助
答案 4 :(得分:0)
如果你使用的是Python,你应该使用BeautifulSoup。它使您能够在页面中查找元素,并使用正则表达式提取文本。
答案 5 :(得分:0)
您可以使用start_request方法!
,然后您还可以为每个URL分配优先级! 然后,您可以传递一些元数据!
以下是有效的示例代码:
async onClick() {
let result = await this.requestDataAndWait();
console.log("result:", result);
}
async requestDataAndWait() {
return await this.http.getDataAsObservable();
}
我建议您阅读此页面以获取更多信息
https://docs.scrapy.org/en/latest/topics/spiders.html#scrapy.spider.Spider.start_requests
希望这会有所帮助:)