一、在Scrapy框架中新建爬虫项目
- 新建项目的语法格式:
scrapy startproject <project_name> [project_dir]
注意:该命令会在project_dir文件加下创建一个名为project_name的Scrapy新项目。如果project_dir没有指定,project_dir与project_name相同
。(带尖括号的必须要写,中括号的不一定要写) -
具体示例:进入你想要存放项目的目录下运行一下命令:
scrapy startproject tz_spider(项目名字)
该命令会在当前目录创建包含一下文件的名为tz_spider的目录(用tree命令来进行查看
):
二、在Scrapy框架中编写爬虫
1、创建一个TzcSpider的类,它必须继承scrapy.Spider类,需要定义一下三个属性:
- name:spider的名字,必须且唯一。
- start_urls: 初始的url列表(可以有多个请求,是按顺序来进行的,当列表中的第一个请求结束后,就进行第二个请求,直到结束为止)。
- parse(self, response) 方法:每个初始url完成之后被调用。这个函数要完成一下两个功能:
(1)解析响应,封装成item对象并返回这个对象。
(2)提取新的需要下载的url,创建新的request,并返回它。
2、我们也可以通过命令创建爬虫(注意:一定要cd到创建项目的根目录下进行相关命令)
- 语法格式:
scrapy genspider [-t template] <name> <domain>
示例:运行命令:scrapy genspider tzc www.shiguangkey.com
- 以上步骤结束后,会在spiders文件夹下生成tzc.py文件,文件内容如下:
- 接下来,我们来完善这个爬虫,代码如下:
注意:
parse()会在请求完成时被调用。response是请求返回来的响应,可以通过xpath或者css方法很方便的解析。分析页面结构,提取课程需要的数据,生成一个字典,然后通过json模块,转成字符串,写入项目根目录下的course.txt 文件内。
三、在Scrapy框架中运行爬虫
- 首先进入项目根目录,然后运行命令就可以启动爬虫了:
scrapy crawl tzc(爬虫名字)
注意:这个命令会启动我们刚才创建的那个名为tzc的爬虫,你会在屏幕上得到类似下图的输出。(在项目目录下启动爬虫命令) - 现在检查项目根目录,我们会发现多了一个course.txt的文件,即是我们刚才下载的课程内容信息。
四、 在Scrapy框架中追踪链接(进行追踪爬取链接网页源代码)
上面的爬虫仅仅只爬取了一页,当然不符合我们的要求,我们需要爬取下一页,下一页,直到所有的信息都被下载。我们从页面中提取连接,或者根据规则构建。现在来看我们的爬虫修改为递归的爬取下一页的链接,从中提取数据。
- 我们创建了一个
类变量page_num
用来记录当前爬取到的页码,在parse函数中提取课程信息,然后通过爬虫对象给变量page__num自加1,构造下一页的url,然后创建scrapy.Request对象并返回。如果response中提取不到课程信息,我们判断已经到了最后一页,parse函数直接return结束。 - 注意:
Scrapy.Request(url)会让scrapy框架自动处理请求,默认调用方法为parse方法。
五、在Scrapy框架中定义(激活)item管道
- 注意:
由于直接在爬虫类中编写代码会每次进行请求时会打开文件,当爬取完文件后就会关闭文件,重复这个过程,知道没有请求url为止,这样导致内存极大的浪费。所以将文件写入到piplines.py中(即items管道中,在settings.py文件中激活此管道)--------利用了反射机制来调用相关的类。
- item管道的典型用途是:
1、清理HTML数据
2、验证已删除的数据(检查项目是否包含某些字段)
3、检查重复项(并删除它们)
4、将已爬取的item进行数据持久化 - 我们先修改爬虫文件见下图:
六、在Scrapy框架中编写管道类
- 我们编写一个用来存储课程信息到courses.txt文件中的管道类,修改项目下piplines.py文件,代码如下:
- 要激活这个管道组件,必须将其添加到ITEM_PIPELINES设置中,在settings文件中设置如下:
在此设置中为类分配的整数值决定了它们运行的顺序:
按照从较低值到较高值的顺序进行。
注意:这个管道的目的只是介绍如何编写项目管道,如果要将所有爬取的item存储到json文件中,则应使用Feed导出,在运行爬虫是加上如下参数:scrapy crawl tzc -o courses.json
七、定义item(在items.py文件中定义item对象)
-
抓取的主要目标是从非结构化数据源(通常是web页面)中提取结构化数据。
-
Scrapy spider可以将提取的数据作为Python的dicts返回。虽然方便且熟悉,但Python的dicts缺乏结构:很容易在字段名中犯错误或返回不一致的数据,特别是在有许多爬虫的大型项目中。
-
作用:就是声明一下item对象中必须有的几个字段而已。这个文件相当于一个容器。若要定义公共输出数据格式,Scrapy提供了Item类。Item对象是用于收集剪贴数据的简单容器。它们提供了一个类似词典的API,提供了一种方便的语法来声明它们的可用字段。scray.Item对象是用于收集抓取数据的简单容器,使用方法和python的字典类似。编辑项目目录下items.py文件。
-
然后我们只需要在爬虫中导入我们定义的Item类,实例化后用它进行数据结构化。
网友评论