最近因为工作需要,自学了python、scrapy并且写出了自己的第一个爬虫项目。记录过程:
- 所用的系统:Ubuntu gnome 16.04
- IDE: pycharm
安装Setuptools&Pip以及scrapy
-
安装Pip
最新版本的linux发行版(CentOS,Fedora,RHEL以及Ubuntu)都自带python2.7以及python3,默认情况下使用的是Python2.7,因此在terminal中输入$ python --version
的时候找的是python2,若想使用Python3,可以输入$ python3 --version
。
Setuptools和Pip是最重要的两个python第三方软件安装包,它们可以实现一行命令自动下载所需要的应用包到python库里面供项目使用。python2.7.9之后以及python3.4之后的版本均默认下载安装了Pip,可以使用$ command -v pip
查看Pip是否已经安装。若没有安装,则可以先 下载get pip.py 到计算机,然后就可以输入$ python pip.py
来进行Pip的安装。
-
安装scrapy
在安装完成了python以及pip之后,键入下面的命令安装scrapy
$ pip install scrapy
创建爬虫项目
在安装完成后scrapy之后,就可以创建爬虫项目了,首先,在terminal中进入想创建项目的目录(workspace),例如笔者就是/usr/local/pythonProjects
,之后键入
$ scrapy startproject projectName //最后的'projectName'替换为想要的项目名称
回车之后,scrapy就会自动为你创建爬虫目录,用python编辑器打开这个目录(推荐sublime text或者pycharm),会看见项目目录结构如下:
projectName/
scrapy.cfg
projectName/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
这些文件分别代表:
-
scrapy.cfg
:项目的总配置文件 -
projectName/item.py
: 项目中的item文件。(个人理解:类似于java中的pojo或者dto) -
projectName/pipelines.py
:项目中的pipeline文件。(用于将抓取到的数据存进数据库中) -
projectName/settings.py
:项目中的设置文件。 -
projectName/spiders/
:用来存在爬虫文件的目录,稍后将在这个目录下写爬虫文件。
至此,一个爬虫项目创建就算成功了,下面开始写代码啦。
编写item文件
item文件 是用来保存我们爬取到的数据的容器,爬取下来的数据会放入item中来封装进行下一步处理(存入数据库),所以,item文件其实就相当于java中的实体类(pojo),用来将我们需要的数据封装成一个一个的整体(对象)。因此,item文件需要我们对需要的数据和业务需求进行分析之后来编写。
例如,笔者所要爬取的网站是 有效质检机构的查询网站 中的所有机构的数据,对该网站中机构的数据结构进行分析,发现需要的数据有 质检机构名称
、质检机构的注册编号
等信息,将每一个质检机构看做一个独立的对象,写出item.py
文件如下:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
#类的名字根据实际情况更改
class CrawlerItem(scrapy.Item):
name = scrapy.Field() #质检机构名称
register_id = scrapy.Field() #机构的注册编号
alias = scrapy.Field() #报告/证书允许使用认可标识的其他名称
contact = scrapy.Field() #联系人
phone_num = scrapy.Field() #联系电话
zip_code = scrapy.Field() #邮政编码
fax_num = scrapy.Field() #传真号码
website = scrapy.Field() #网站地址
email = scrapy.Field() #电子邮箱
company_address = scrapy.Field() #公司地址
validity_term = scrapy.Field() #认可有效期限
ability_range = scrapy.Field() #能力范围
close_project = scrapy.Field() #暂停项目/参数
certificate = scrapy.Field() #证书附件
一开始可能看起来很复杂,但是定义了item.py
之后,您就可以很方便的使用scrapy的其他方法(例如pipeline.py
中的方法),因为这些方法需要只要您对item的定义。
编写第一个爬虫(Spider文件)
一个爬虫(Spider)是从一个或多个网站用来爬取需要的数据的类。
为了创建一个爬虫,必须集成scrapy.Spider类,并且定义以下两个属性和一个方法:
-
name
:爬虫的名字,必须唯一,不能有重复名字的爬虫存在于一个项目中。 -
start_urls
:一个列表,由spider在开始启动的时候需要爬取的url组成,spider会爬取这个list中的所有url,可以在爬取到新url之后将新的url添加进去。 -
parse(self,response)
:此方法会在spider每爬取完成一个网页后调用,每次爬取网站下载的数据会通过response参数传递给此方法,在此方法中您可以对response进行操作。
知道了如何编写spider之后,在目录projectName/spiders/
下新建tutorial_spider.py
文件,并编写代码:
import scrapy
class TutorialSpider(scrapy.Spider):
name = 'tutorial' #爬虫的名字
start_urls = ['https://las.cnas.org.cn/LAS/publish/externalQueryL1.jsp'] #要爬取的网站列表
def parse(self, response):
print(response.body) #打印网站的静态代码(此种方法无法获取由js动态生成的数据)
之后打开terminal,进入项目根目录,如/usr/local/pythonProjects/projectName
,键入以下命令以启动爬虫。
$ scrapy crawl spider_name #将spider_name改为爬虫的名称(即name的值)
如果顺利,您应该可以看见该网页的html代码了。当然,您也可以更改parse(self, response)
中的代码,利用response做更多的事。