假设你的电脑上已经安装了Scrapy。
这篇教程将会带你学习以下任务:
我们进入正题吧 ~
这样会建立一个tutorial目录,包含以下内容:
tutorial/
scrapy.cfg #部署配置文件
tutorial/ #工程的Python模块,你将从这里导入你的代码
__init__.py
items.py #工程项目定义文件
pipelines.py #工程传输线文件
settings.py #工程设置文件
spiders/ #之后存放你的爬虫的目录
__init__.py
下面是我们的第一个爬虫的代码。使用你的Python可视开发环境(PyCharm、Spyder等等)把下面这段代码在前面建立的工程目录tutorial/spiders下保存为quotes_spider.py:
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_request(self)
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/'
]
for url in urls:
yield scrapy.Request(url=url,callback=self.sparse)
def parse(self,response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html'%page
with open(filename,'wb') as f;
f.write(response.body)
self.log('save file %s' % filename)
你可以看到,我们的爬虫构造了一个子类scrapy.Spider,定义了一些归属关系和函数。
name:用于辨别这个爬虫。name在工程内必须是独一无二的,也就是说,你不能给不同的爬虫设置相同的name。
start_requesst():必须返回Requests的迭代值(你可以返回一个请求表或者编写一个生成器函数),爬虫将从Requests开始爬取数据。后续的请求将会从这些初始请求中产生。
parse:这是一个被调用的函数,用来处理为每一个请求下载的相应的响应。
parse函数通常解析响应,把爬取的数据当做字典来提取,并且找到新的可追踪的URL,还从这些URL中产生新的请求。
scrapy crawl quotes
这个命令将会运行我们刚刚添加的名为quotes的爬虫,并会向域名quotes.toscrape.com发送一些请求。
你将得到类似于下面这样的输出:
... (omitted for brevity)
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) (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) (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)
实际大概是这样,截图中爬取网页的操作细节可以实际去看:
现在,你可以到tutorial顶层目录中查看。你会发现新增了两个文件:quotes-1.html 和 quotes-2.html
import scrapy
class QuotesSpider(scrapy.Spider)
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/'
]
def parse(self,response)
page = response.url.split("/")[-2]
filename = 'quotes-%s.html'%page
with open(filename,'wb') as f:
f.write(response.body)
parse()函数将会被调用来处理那些URL的每一个请求,尽管我们并没有明确地告诉Scrapy这样去做。这是因为,parse()函数是Scrapy的默认回调函数。
scrapy shell 'http://quotes.toscrape.com/page/1'
NOTE:注意,在Windows上要是用双引号把URL地址括起来。
你将会看到类似下面的结果:
由于是境外网站,TCP传输被阻断,实际无法提取数据,大家想试验可以将URL改成国内网站,注意网站需要是静态技术搭建的。
使用shell,你可以尝试使用CSS(Selectors Level 4)选择对应的数据内容。
运行response.css(‘title’)的结果是一个列表样式的对象SlectorList,这个列表代表了一系列的Selector对象环绕着XML和HTML元素,允许你进行精细选择或者提取数据。
要想把上面的titile中的文本提取出来,你可以运行如下:
由于我们并未从境外网站提取到数据,所以输出out那里没有内容显示。
未完待续,敬请期待 ^ _ ^