最近因為工作需要,自學了python、scrapy并且寫出了自己的第一個爬蟲項目。記錄過程:
- 所用的系統(tǒng):Ubuntu gnome 16.04
- IDE: pycharm
安裝Setuptools&Pip以及scrapy
-
安裝Pip
最新版本的linux發(fā)行版(CentOS,Fedora,RHEL以及Ubuntu)都自帶python2.7以及python3,默認情況下使用的是Python2.7,因此在terminal中輸入$ python --version的時候找的是python2,若想使用Python3,可以輸入$ python3 --version。
Setuptools和Pip是最重要的兩個python第三方軟件安裝包,它們可以實現(xiàn)一行命令自動下載所需要的應用包到python庫里面供項目使用。python2.7.9之后以及python3.4之后的版本均默認下載安裝了Pip,可以使用$ command -v pip查看Pip是否已經(jīng)安裝。若沒有安裝,則可以先 下載get pip.py 到計算機,然后就可以輸入$ python pip.py來進行Pip的安裝。
-
安裝scrapy
在安裝完成了python以及pip之后,鍵入下面的命令安裝scrapy
$ pip install scrapy
創(chuàng)建爬蟲項目
在安裝完成后scrapy之后,就可以創(chuàng)建爬蟲項目了,首先,在terminal中進入想創(chuàng)建項目的目錄(workspace),例如筆者就是/usr/local/pythonProjects,之后鍵入
$ scrapy startproject projectName //最后的'projectName'替換為想要的項目名稱
回車之后,scrapy就會自動為你創(chuàng)建爬蟲目錄,用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文件。(用于將抓取到的數(shù)據(jù)存進數(shù)據(jù)庫中) -
projectName/settings.py:項目中的設置文件。 -
projectName/spiders/:用來存在爬蟲文件的目錄,稍后將在這個目錄下寫爬蟲文件。
至此,一個爬蟲項目創(chuàng)建就算成功了,下面開始寫代碼啦。
編寫item文件
item文件 是用來保存我們爬取到的數(shù)據(jù)的容器,爬取下來的數(shù)據(jù)會放入item中來封裝進行下一步處理(存入數(shù)據(jù)庫),所以,item文件其實就相當于java中的實體類(pojo),用來將我們需要的數(shù)據(jù)封裝成一個一個的整體(對象)。因此,item文件需要我們對需要的數(shù)據(jù)和業(yè)務需求進行分析之后來編寫。
例如,筆者所要爬取的網(wǎng)站是 有效質檢機構的查詢網(wǎng)站 中的所有機構的數(shù)據(jù),對該網(wǎng)站中機構的數(shù)據(jù)結構進行分析,發(fā)現(xiàn)需要的數(shù)據(jù)有 質檢機構名稱、質檢機構的注冊編號 等信息,將每一個質檢機構看做一個獨立的對象,寫出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
#類的名字根據(jù)實際情況更改
class CrawlerItem(scrapy.Item):
name = scrapy.Field() #質檢機構名稱
register_id = scrapy.Field() #機構的注冊編號
alias = scrapy.Field() #報告/證書允許使用認可標識的其他名稱
contact = scrapy.Field() #聯(lián)系人
phone_num = scrapy.Field() #聯(lián)系電話
zip_code = scrapy.Field() #郵政編碼
fax_num = scrapy.Field() #傳真號碼
website = scrapy.Field() #網(wǎng)站地址
email = scrapy.Field() #電子郵箱
company_address = scrapy.Field() #公司地址
validity_term = scrapy.Field() #認可有效期限
ability_range = scrapy.Field() #能力范圍
close_project = scrapy.Field() #暫停項目/參數(shù)
certificate = scrapy.Field() #證書附件
一開始可能看起來很復雜,但是定義了item.py之后,您就可以很方便的使用scrapy的其他方法(例如pipeline.py中的方法),因為這些方法需要只要您對item的定義。
編寫第一個爬蟲(Spider文件)
一個爬蟲(Spider)是從一個或多個網(wǎng)站用來爬取需要的數(shù)據(jù)的類。
為了創(chuàng)建一個爬蟲,必須集成scrapy.Spider類,并且定義以下兩個屬性和一個方法:
-
name:爬蟲的名字,必須唯一,不能有重復名字的爬蟲存在于一個項目中。 -
start_urls:一個列表,由spider在開始啟動的時候需要爬取的url組成,spider會爬取這個list中的所有url,可以在爬取到新url之后將新的url添加進去。 -
parse(self,response):此方法會在spider每爬取完成一個網(wǎng)頁后調用,每次爬取網(wǎng)站下載的數(shù)據(jù)會通過response參數(shù)傳遞給此方法,在此方法中您可以對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'] #要爬取的網(wǎng)站列表
def parse(self, response):
print(response.body) #打印網(wǎng)站的靜態(tài)代碼(此種方法無法獲取由js動態(tài)生成的數(shù)據(jù))
之后打開terminal,進入項目根目錄,如/usr/local/pythonProjects/projectName,鍵入以下命令以啟動爬蟲。
$ scrapy crawl spider_name #將spider_name改為爬蟲的名稱(即name的值)
如果順利,您應該可以看見該網(wǎng)頁的html代碼了。當然,您也可以更改parse(self, response)中的代碼,利用response做更多的事。