Scrapy at a glance(立即Scrapy)

来源:互联网 发布:淘宝商家中心 编辑:程序博客网 时间:2024/06/03 03:32

一直想找机会学学爬虫,但是一直也没有找到时机,最近其实也不闲,手上还有很多活,想法也还有很多,但是还是觉得没事儿逼逼自己吧,再多干点儿也没什么坏处,在网上搜了搜scrapy文档的翻译,版本都比较老,于是我决定一边翻译这个文档,一边学习爬虫。

另外说说自己现在的想法,曾经我想的很多,我想获得很多东西,但是在一次次的碰壁之后,我知道很多可能都不是那么现实,于是我想办法去补强,我不知道我选择的路是否正确,甚至不知道我是否选择了路,但是我觉得现在做的事儿,以后总会有一些帮助吧。

开始翻译咯。


标题为Scrapy at a glance


Scrapy是一个用来爬取网站信息,获取可以用来数据挖掘,信息处理和历史记录等大量应用的结构化数据的应用框架。

尽管Scrapy最初是被设计用来网页检索的,它也可以通过第三方API获取数据或者当作一个通用网络爬虫。


初试Scrapy

为了向你展示Scrapy可以带来什么,我们将用一个最简单的方法去运行一个蜘蛛来带着你看看这个Scrapy示例。

因此,这个是spider的代码,它根据StackOverflow上获得最高投票数的问题的链接并且从每一个页面上爬取一些数据。


import scrapyclass StackOverflowSpider(scrapy.Spider):    name = 'stackoverflow'    start_urls = ['http://stackoverflow.com/questions?sort=votes']    def parse(self, response):        for href in response.css('.question-summary h3 a::attr(href)'):            full_url = response.urljoin(href.extract())            yield scrapy.Request(full_url, callback=self.parse_question)    def parse_question(self, response):        yield {            'title': response.css('h1 a::text').extract()[0],            'votes': response.css('.question .vote-count-post::text').extract()[0],            'body': response.css('.question .post-text').extract()[0],            'tags': response.css('.question .post-tag::text').extract(),            'link': response.url,        }


将上述代码写到一个文件中,并且为这个文件命名,就像stackoverflow_spider.py,然后利用runspider命令运行这个程序:


scrapy runspider stackoverflow_spider.py -o top-stackoverflow-questions.json

当这个程序运行完了,你将会获得一个名为top-stackoverflow-questions.json的文件,里面包含着一个StackFlow里面投票数最多问题的列表,这个列表是以json格式存在的。Json格式中包括标题,链接,投票数,标签列表还有问题内容,看起来就像这样(为了更容易阅读,重新改了一下格式):

[{    "body": "... LONG HTML HERE ...",    "link": "http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array",    "tags": ["java", "c++", "performance", "optimization"],    "title": "Why is processing a sorted array faster than an unsorted array?",    "votes": "9924"},{    "body": "... LONG HTML HERE ...",    "link": "http://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule",    "tags": ["git", "git-submodules"],    "title": "How do I remove a Git submodule?",    "votes": "1764"},...]

刚刚发生了什么?

当你运行scrapy runspider somefile.py的命令时,Scrapy在程序中寻找一个蜘蛛定义,然后通过爬虫引擎来运行它。

爬虫开始向在属性 start_urls 中定义的URLs发送请求(在这个示例中,只有Stackflow的置顶问题页面的URL),并且调用回调函数parse,将回复对象作为一个参数传递进去。在parse回调函数中,我们利用一个带有允许获得属性值的定制扩展的CSS选择器获取问题页面的链接。然后,我们处理更多的请求,当它们运行结束后注册一个parse_question作为一个回调函数被调用。
在这里,你可能看到了Scrapy的一个主要优势,请求是有固定计划并且异步处理的。这意味着Scrapy不需要等待一个请求结束然后再继续运行,它可以同时进行另外一个请求或者其他的事情。这也意味着请求可以继续运行即使一些请求失败了或者在处理请求过程中产生了错误。

当Scrapy使你快速的爬行时(在容错方式下,同一时间并行发送多个请求),Scrapy也可以通过一些你可以调整的配置,让你优雅的爬行网络。你可以做一些事情,就像在每个请求之间设置一个下载延迟,为每一个域或者IP地址设置一个并发请求量的限制,甚至可以利用自动油门去自动找出这些。

最后,回调函数parse_question爬取每一页的问题数据为字典格式,Scrapy把这些收集起来并把它们写成命令中请求的Json文件。

你可以改变结果文件的格式为XML或者CSV,也可以后台存储到数据库中。

还有什么?

你已经看到了怎么使用Scrapy从网站中获取并存储数据,但是这只是一些皮毛。Scrapy提供了很多很有用处的特征使你的Scrapy之旅变得简单有效,例如:

  1. 支持在使用正则表达式的helper方法的帮助下,利用扩展CSS选择器和xpath表达式从HTML/XML源选择并获取数据。
  2. 一个交互式的shell控制台,利用CSS和Xpath表达式来抓取数据,当你在写或者调试你的spider时,你会发现这是非常有效的。
  3. 可以将结果存在各种格式里面或者通过后台放到数据库里面。
  4. 鲁邦编码支持和自动检测,为了对待外国的非标准的或者被破坏的编码声明。
  5. 强壮的扩展支持,允许你用信号和一个完美定义的API(中间件,扩展和管道)插入自己的插件。
  6. 大量的可供使用的中间件和内置扩展:
                cookie和session处理
                HTTP的特征,类似压缩,认证和缓存
                用户代理仿造
                robots.txt
                爬虫深度限制
                和更多
         7.一个Telnet控制台钩住一个Python控制台进入你的Scrapy进程,去检测调试你的爬虫
         8.还有一些其他优点,像利用可重用蜘蛛从站点地图中去爬取站点数据,一个媒体管道自动下载图片,一个缓存DNS解析,还有更多!

下一步是什么?

下一步是你需要去安装Scrapy,跟着我们的tutorial去学习怎样在我们的爬虫项目中去组织代码,加入我们的社区吧!谢谢你的兴趣!


后记:

这是我开始翻译的第一步..发现还是不太容易,很多地方翻译的不好,希望大家理解,如果有人有缘看到了这些,麻烦多给些意见,谢谢关注!




1 0
原创粉丝点击