快速入门
应掌握的四个能力
1、能够创建scrapy项目、编写个简单的蜘蛛并运行蜘蛛;
2、能够简单的使用scrapy shell 调试数据;
3、能够使用scrapy css选择器提取简单数据;
4、除了能够提取一页数据,还要能提取下一页、在下一页。
创建一个scrapy项目
在开始爬取之前,我们首先要创建一个scrapy项目,在命令行输入一下命令即可创建。
scrapy startproject mingyan #mingyan是我们创建的蜘蛛名字,后面我们运行的时候用得到。
之后便可在pycharm中打开。
编写第一个scrapy蜘蛛
- 在spiders目录下面,这一个scrapy 文档,我们就来创造一只scrapy蜘蛛。
上面我们已经创建了一个mingyan_spider.py 的文件,那里面到底该写神马呢?当然我们需要遵守scrapy的规则,那一个蜘蛛到底需要神马规则呢?
A:首先我们需要创建一个类,并继承scrapy的一个子类:scrapy.Spider 或者是其他蜘蛛类型,后面会说到,除了Spider还有很多牛X的蜘蛛类型;
B:然后定义一个蜘蛛名,name=“” 后面我们运行的话需要用到;
C:定义我们需要爬取的网址,没有网址蜘蛛肿么爬,所以这是必须滴;
D:继承scrapy的一个方法:start_requests(self),这个方法的作用就是通过上面定义的链接去爬取页面,简单理解就是下载页面。
我们先来看看第一个简单的蜘蛛项目:
import scrapy
class mingyan(scrapy.Spider): #需要继承scrapy.Spider类
name = "mingyan2" # 定义蜘蛛名
def start_requests(self): # 由此方法通过下面链接爬取页面
# 定义爬取的链接
urls = [
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse) #爬取到的页面如何处理?提交给parse方法处理
def parse(self, response):
'''
start_requests已经爬取到页面,那如何提取我们想要的内容呢?那就可以在这个方法里面定义。
这里的话,并木有定义,只是简单的把页面做了一个保存,并没有涉及提取我们想要的数据,后面会慢慢说到
也就是用xpath、正则、或是css进行相应提取,这个例子就是让你看看scrapy运行的流程:
1、定义链接;
2、通过链接爬取(下载)页面;
3、定义规则,然后提取数据;
就是这么个流程,似不似很简单呀?
'''
page = response.url.split("/")[-2] #根据上面的链接提取分页,如:/page/1/,提取到的就是:1
filename = 'mingyan-%s.html' % page #拼接文件名,如果是第一页,最终文件名便是:mingyan-1.html
with open(filename, 'wb') as f: #python文件操作,不多说了;
f.write(response.body) #刚才下载的页面去哪里了?response.body就代表了刚才下载的页面!
self.log('保存文件: %s' % filename) # 打个日志
运行蜘蛛
在scrapy所在主目录下执行
scrapy crawl mingyan2
详细教程参见http://www.scrapyd.cn/doc/144.html
scrapy调试工具:scrapy shell使用方法
scrapy提取数据的方式有:CSS、XPATH、RE(正则)
scrapy调试工具
scrapy shell http://lab.scrapyd.cn #要爬取的网页。
你看,我刚已输入:scrapy shell http://lab.scrapyd.cn命令行立马就显示为:
2017-12-15 09:48:38 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2017-12-15 09:48:38 [scrapy.extensions.telnet] DEBUG: Telnet console listening o
n 127.0.0.1:6023
2017-12-15 09:48:38 [scrapy.core.engine] INFO: Spider opened
2017-12-15 09:48:38 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://lab.sc
rapyd.cn> (referer: None)
2017-12-15 09:48:39 [traitlets] DEBUG: Using default logger
2017-12-15 09:48:39 [traitlets] DEBUG: Using default logger
[s] Available Scrapy objects:
[s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s] crawler <scrapy.crawler.Crawler object at 0x0000000004ED2940>
[s] item {}
[s] request <GET http://lab.scrapyd.cn>
[s] response <200 http://lab.scrapyd.cn>
[s] settings <scrapy.settings.Settings object at 0x0000000004FF8F98>
[s] spider <DefaultSpider 'default' at 0x525afd0>
[s] Useful shortcuts:
[s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default
, redirects are followed)
[s] fetch(req) Fetch a scrapy.Request and update local object
s
[s] shelp() Shell help (print this help)
[s] view(response) View response in a browser
In [1]:
比如我们想提取 http://lab.scrapyd.cn 的 title,我们可以在 In[1]: 后面输入:response.css(‘title’) ,然后回车, 立马就得到如下结果:
>>> response.css('title')
[<Selector xpath='descendant-or-self::title' data='<title>爬虫实验室 - S
CRAPY中文网提供</title>'>]