在不知道网页的情况下使用Scrapy刮取所有文本'结构

时间:2016-08-25 20:41:02

标签: python web-scraping scrapy

我正在进行一项涉及分发互联网索引的研究。

虽然存在几个这样的项目(IRLbot,分布式索引,集群扫描,共同爬行等),但我更关注于激励这种行为。我正在寻找一种简单的方法来抓取真正的网页,而不了解他们的URL或HTML结构,并且:

  1. 提取所有文本(以便将其编入索引)
  2. 收集所有网址并将其添加到要抓取的网址
  3. 防止网页格式错误时崩溃并优雅地继续(即使没有抓取的文字)
  4. 澄清一下 - 这只适用于概念验证(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
    
    
    

1 个答案:

答案 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

中描述得非常好