我正在进行一项涉及分发互联网索引的研究。
虽然存在几个这样的项目(IRLbot,分布式索引,集群扫描,共同爬行等),但我更关注于激励这种行为。我正在寻找一种简单的方法来抓取真正的网页,而不了解他们的URL或HTML结构,并且:
澄清一下 - 这只适用于概念验证(PoC),所以我不介意它不会扩展,速度慢等等。我的目标是刮掉大部分的在大多数情况下,在有或没有动态内容的情况下呈现给用户的文本,以及尽可能少的"垃圾"诸如功能,标签,关键字等等。开箱即用的简单部分解决方案优于完美的解决方案,需要大量的专业知识才能部署。
第二个问题是存储(url,提取的文本)以进行索引(通过不同的进程?),但我想我可以通过更多的挖掘来弄清楚它。
有关如何增强其解析功能的任何建议都将受到高度赞赏!
import scrapy
from scrapy_1.tutorial.items import WebsiteItem
class FirstSpider(scrapy.Spider):
name = 'itsy'
# allowed_domains = ['dmoz.org']
start_urls = \
[
"http://www.stackoverflow.com"
]
# def parse(self, response):
# filename = response.url.split("/")[-2] + '.html'
# with open(filename, 'wb') as f:
# f.write(response.body)
def parse(self, response):
for sel in response.xpath('//ul/li'):
item = WebsiteItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['body_text'] = sel.xpath('text()').extract()
yield item

答案 0 :(得分:4)
您在这里寻找的是sc CrawlSpider
CrawlSpider允许您定义每个页面遵循的爬网规则。它非常聪明,可以避免抓取不是网络资源的图像,文档和其他文件,而且它几乎可以为您完成整个过程。
这里有一个很好的例子,你的蜘蛛可以用CrawlSpider看看:
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'crawlspider'
start_urls = ['http://scrapy.org']
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True),
)
def parse_item(self, response):
item = dict()
item['url'] = response.url
item['title'] = response.meta['link_text']
# extracting basic body
item['body'] = '\n'.join(response.xpath('//text()').extract())
# or better just save whole source
item['source'] = response.body
return item
这个蜘蛛会抓取它在网站上找到的每个网页,并记录标题,网址和整个文本正文。
对于文本正文,您可能希望以更智能的方式提取它(以排除javascript和其他不需要的文本节点),但这是它自己要讨论的问题。
实际上,对于您所描述的内容,您可能希望保存完整的html源而不是仅保留文本,因为非结构化文本对于任何类型的分析或索引都是无用的。
还有一堆scrapy设置可以针对这种类型的抓取进行调整。它在Broad Crawl docs page
中描述得非常好