我正在进行一项与分发Internet索引相关的研究。
虽然存在多个此类项目(IRLbot,分布式索引,Cluster-Scrapy,Common-Crawl等),但我的项目更着重于激励此类行为。我正在寻找一种爬网真实网页的简单方法,而无需了解其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
您在这里寻找的是抓地力的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
这个蜘蛛会抓取它可以在网站上找到的每个网页,并记录标题,URL和全文。
对于文本主体,您可能希望以某种更聪明的方式提取它(以排除javascript和其他不需要的文本节点),但这是一个要讨论的问题。实际上,对于您所描述的内容,您可能想保存完整的html源代码,而不是仅保存文本,因为非结构化文本对于任何种类的分析或索引都没有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句