您的位置:首页 > 其它

scrapy 1.5 第一篇 初窥scrapy

2018-02-25 14:09 141 查看
    我想要在开始之前先和阅读这篇文章的朋友们说上几句话。首先,这篇文章内,我挑选一部分官方文档中重要的内容进行翻译。其次,我本人的英语水平和编程水平也属于渣渣中的渣渣,有什么问题,请务必在评论中指出。
    一、如何开始你的第一个scrapy项目?

        在你开始爬取之前,你必须创建一个新的Scrapy项目。 进入你打算存储代码的目录中,运行下列命令:    scrapy startproject tutorial        这条命令将会在目录下创建一个名为tutorial的文件夹,文件夹内部的内容如下:tutorial/
scrapy.cfg # 项目的配置文件
tutorial/ # 用来放你py代码的地方
__init__.py

items.py # 用来定义你抓取内容的字段

middlewares.py # 中间器

pipelines.py # 管道文件

settings.py # 设置

spiders/ # 放爬虫文件的文件夹
__init__.py    
    二、你的第一只爬虫!
    爬虫是你定义的一个用于在一个或者一组网页上抓取数据的类,他们必须继承scrapy.spider类。同时,这个类也应该定义一个初始的request,如何在现有网页中提取后续链接,在下载完的网页中提取数据等方法。

    下面是我们的第一个爬虫代码,把它储存在一个被命名为quotes_spider.py的文件中,然后放置在你的项目的tutorial/spiders下。
import scrapy

class QuotesSpider(scrapy.Spider):        #QuotesSpider类必须要继承scrapy.Spider类,你可以在这个类里面定义一些方法和属性。
name = "quotes"                       #name属性,用来区分爬虫,在一个项目中,你不能用同样的名称来命名不同的爬虫。

def start_requests(self):             #必须返回一个可迭代的对象,或者写一个生成器。你的爬虫将会从这个类开始抓取。
urls = [                          #初始url,这里不解释了,这两个网站是给你做练习用的,原来中文教程的DMOZ挂了。
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:                
yield scrapy.Request(url=url, callback=self.parse) 

def parse(self, response):           #parse方法用来处理request返回的结果。关于这一部分的一些内容,我在后面详细介绍。
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)    三、运行你的第一个爬虫!

    想要运行上面的代码,你只需要进入目录下的cmd界面,然后运行scrapy crawl quotes命令就可以了。

    这条命令会启动name属性是quotes的爬虫(也就是你刚刚写进去的那个),之后你就会看见,你的界面上刷出像是下面的东西:
... (省略了一丢丢东西)
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened
2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-2.html
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Closing spider (finished)
...    现在看你的根目录下,是不是多了两个文件呢?如果你问我为什么没有对这两个html文件做更进一步的处理的话,我会在接下来一部分做这一步的。

    四、刚刚发生了什么?

    scrapy将spider中start_requests方法返回的scrapy.Request对象列入工作表内。为每一个返回的内容,实例化了一个Response对象,然后引用一个关联的方法(例子中,我们使用的是parse方法),将response作为内容传递过去。
    五、start_request的作弊写法!

    你可以将包含了一大串url的start_url作为spider类的一个类属性写在类里面,这样你就不用实现从url中生成scrapy.Response对象的start_request方法啦!scrapy会自动的读取这个列表中的url,然后调用默认的start_request方法来为你的爬虫创建初始的request。是不是轻松加愉快?

    你也许会疑惑,那么我怎么处理返回的数据呢?这都不是问题。你只需要定义一个parse方法在类内,scrapy会自动调用这个方法来进行处理。(即使你没有明确告诉scrapy!)则是因为parse方法是scrapy默认的,只要没有明确定义回调方法,那么scrapy就会默认使用parse。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: