在目标文件夹下命令行输入:
scrapy startproject projectname
成功后打印如下:
E:\studyData\scrapy>scrapy startproject tutorial
New Scrapy project 'tutorial', using template directory 'c:\\python36\\lib\\site-packages\\scrapy\\templates\\project', created in:
E:\studyData\scrapy\tutorialYou can start your first spider with:
cd tutorial
scrapy genspider example example.com
成功后,文件夹结构如下:
tutorial/
scrapy.cfg # 部署配置文件
tutorial/ # 项目的Python模块, 从这里导入你的代码
__init__.py
items.py # 项目的items定义文件
middlewares.py # 项目的middlewares(中间件)文件
pipelines.py # 项目的pipelines文件
settings.py # 项目settings(设置)文件
spiders/ # 放你自己编写的代码的文件夹
__init__.py
Spider是用来从一个网站(或一组网站)获取信息的自定义定义的类和Scrapy类。它们必须对scrappy.spider进行子类化,并定义初始请求,可以选择如何获取页面中的链接,以及如何解析下载的页面内容以提取数据。
下面是第一个Spider,保存为qutoes_spider.py,并保存在tutorial/spiders文件目录里。
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(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.parse)
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('Saved file %s' % filename)
如上所示,Spider 子类 scrapy.Spider
定义了一些属性和方法:
name
: 标识Spider。必须唯一,也就是说不同的Spider不能有相同的name。
start_requests()
: 必须返回迭代的Requests (可以返回requests列表或者生成器函数) 。 随后的请求将从这些初始请求中依次生成。
parse()
: 用来处理为每个请求下载的响应的方法。response参数是textResponse的一个实例,用来保存页面内容,并有进一步有用的方法来处理它。
注:parse()
方法通常解析响应,将获取的数据提取为dict,并查找要跟踪的新URL,并从中创建新请求(Request)。
在目标文件夹下命令行输入:
scrapy crawl quotes
这个命令运行的name为quotes的spider,它将发送一些对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)
...
现在,检查当前目录中的文件。目录中新增了两个文件:quotes-1.html和quotes-2.html,其中包含了我们的parsemethod结构中的各个URL的内容。
scrappy调度scrappy.request对象,该对象由spider的start-requests方法返回。在接收到每个响应后,它实例化响应对象并调用与请求相关联的回调方法(在本例中是parse方法),将响应作为参数传递。
只需定义一个start_urls类的URL列表属性。然后,start_requests()的默认实现将使用此列表为您的spider创建初始请求:
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)