9.2 scrapy安裝及基本使用

image

https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下載即可。

安裝完方法2 后需要回到方法1繼續(xù)安裝,不是說方法2完成后,scrapy就安裝好了。

報錯情況下安裝下面的twisted而不是上面lxml

image

Scrapy爬蟲的使用

一個基本的爬蟲只需要兩部分組成:Spider(爬蟲)、Pipeline(管道)。

管道是什么?

每個項目管道組件是一個實現(xiàn)簡單方法的Python類。他們接收一個項目并對其執(zhí)行操作,還決定該項目是否應(yīng)該繼續(xù)通過流水線或被丟棄并且不再被處理。

image
image
image

管道左邊是爬蟲,右側(cè)是數(shù)據(jù)庫,中間是管道

管道里面有很多重要的方法。

項目管道的典型用途是:

  • 清理HTML數(shù)據(jù)
  • 驗證抓取的數(shù)據(jù)(檢查項目是否包含特定字段)
  • 檢查重復(fù)(并刪除)
  • 將刮取的項目存儲在數(shù)據(jù)庫中
image

切盤:輸入盤符

image

或者cd D:\scrapywork

然后在里面創(chuàng)建一個city_58項目

第一個Scrapy項目

  1. 在命令行輸入scrapy startproject city_58,建立Scrapy項目,提示如圖即成功。

[圖片上傳失敗...(image-82c015-1517579234036)]

里面的文件目錄都如下:

image

[圖片上傳失敗...(image-53a11-1517579234036)]

Alt text

  1. 得到如圖的文件目錄結(jié)構(gòu)

[圖片上傳失敗...(image-601747-1517579234036)]

  1. scrapy框架文件解析:
  • city_58/:該項目的python模塊。之后您將在此加入代碼
  • city_58/spiders/:放置spider代碼的目錄,在命令行使用“scrapy genspider + 爬蟲名”生成的 - - spider文件將會被存放在此目錄下
  • city_58/items.py:項目中的item文件,存放各種字段
  • city_58/pipelines.py:項目中的pipelines文件
  • city_58/settings.py:項目的設(shè)置文件
  • scrapy.cfg:項目的配置文件,一般不需要修改,也不能刪除
  1. 在cmd中切換到city_58文件中,直接在cmd中輸入“scrapy genspider spider_city_58 58.com”,其中spider_city_58 表示爬蟲文件名(不能和工程名相同);58.com代表所要爬取的網(wǎng)站的主域名。主域名介紹:map.baidu。或者www.baidu.com。或者58.com 這一步很重要。這個域名可以限制爬取的范圍。北京啊上海啊等等。

在spider下面生成spider_city_58文件,或者python中輸入如下代碼

-- coding: utf-8 --

import scrapy

class SpiderCity58Spider(scrapy.Spider):

name = 'spider_city_58' #必不可少的屬性,需要利用它去決定啟動哪個爬蟲

allowed_domains = ['58.com']

start_urls = ['http://58.com/'] #從start_urls中啟動鏈接

def parse(self, response):

pass

結(jié)果如下:

image

自動生成如下代碼

image

-- coding: utf-8 --

import scrapy

class SpiderCity58Spider(scrapy.Spider):

name = 'spider_city_58' #必不可少的屬性,需要利用它去決定啟動哪個爬蟲

allowed_domains = ['58.com'] #允許的站點

start_urls = ['http://58.com/'] #從start_urls中啟動鏈接 ,list可以是一條也可以是一系列,也可以從文件中讀,自動調(diào)用start_urls 發(fā)送出去返回源代碼,默認的,所以原生代碼沒有。

def parse(self, response): #parse默認解析器

pass

image

不要重寫,request不重寫,按照默認

image

Scrapy的基本方法和屬性:

  • 爬蟲名稱:name屬性
  • 啟動方法:start_requests(),或者直接使用start_urls啟動
  • 默認解析器方法:parse()
  • 啟動鏈接列表:start_urls屬性

我們使用Scrapy的啟動命令的時候,需要知道它的name屬性,利用name屬性去決定啟動那個爬蟲。如本例中爬蟲名字是“spider_city_58”,則可以在命令行中使用:scrapy crawl spider_city_58 啟動這個爬蟲

爬蟲默認首先從start_urls里面讀取鏈接,然后自動調(diào)用start_request函數(shù)(或者你也可以自己定義start_request函數(shù)),此函數(shù)請求的結(jié)果自動調(diào)用默認解析器parse,也就是調(diào)用parse處理返回來的response

  1. 啟動Scrapy框架

為了方便知道請求到達了默認解析器parse,可以在解析器中輸出一句話“我進入了解析器”

-- coding: utf-8 --

import scrapy

class SpiderCity58Spider(scrapy.Spider):

name = 'spider_city_58'

allowed_domains = ['58.com']

start_urls = ['http://58.com/']

def parse(self, response):

print('我進入了解析器')

啟動方法:

第一種方法:打開命令行,切換到項目目錄下,執(zhí)行scrapy crawl spider_city_58。

第二種方法:在項目中建立一個main.py文件,然后運行該文件即可。

from scrapy import cmdline

cmdline.execute("scrapy crawl spider_city_58".split())

課后作業(yè):

  • 利用Scrapy框架自行設(shè)計一個爬蟲

補充資料

Scrapy常用命令行命令

Scrapy提供了兩種類型的命令,分別為全局命令和項目命令

項目命令必須在Scrapy項目中運行,全局命令則不需要。因此,運行相關(guān)的項目命令時,必須把當(dāng)前命令行的路徑切換到對應(yīng)的項目下

|

全局命令:

|

全局命令:

|
|

項目命令

|

項目命令

|
|

startproject

|

shell

|
|

crawl

|

bench

|
|

genspider

|

fetch

|
|

check

|

list

|
|

settings

|

view

|
|

parse

|

edit

|
|

runspider

|

version

|
|
|
|

查看所有命令

scrapy -h

查看幫助信息

scapy –help

查看版本信息

scrapy version

Scrapy 1.1.2

scrapy version -v

Scrapy : 1.4.0

lxml : 3.8.0.0

libxml2 : 2.9.4

cssselect : 1.0.1

parsel : 1.2.0

w3lib : 1.18.0

Twisted : 17.9.0

Python : 3.6.2 |Anaconda custom (64-bit)| (default, Sep 19 2017, 08:03:39) [MSC v.1900 64 bit (AMD64)]

pyOpenSSL : 17.2.0 (OpenSSL 1.0.2l 25 May 2017)

Platform : Windows-8.1-6.3.9600-SP0

startproject命令:新建一個項目,后面跟的是項目名字

scrapy startproject spider_name

genspider命令:

生成一個spider文件,一個工程中可以存在多個spider, 但是名字必須唯一;

爬蟲名字后面加上限制的主域名,也就是限制爬蟲只爬取該域名頁面下的數(shù)據(jù);

針對某個爬蟲項目生成spider文件時,需要將命令行當(dāng)前工作目錄切換到對應(yīng)的爬蟲項目路徑下

scrapy genspider name domain

例如:

scrapy genspider taobao taobao.com

指定了新生成的爬蟲名字是“taobao”,限制爬取的主域名是“taobao.com”

查看當(dāng)前項目內(nèi)有多少爬蟲

scrapy list

使用瀏覽器打開網(wǎng)頁

scrapy view http://www.baidu.com

shell命令:進入scrapy交互環(huán)境,方便實時驗證結(jié)果

進入該url的交互環(huán)境

scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/

之后便進入交互環(huán)境

我們主要對這里面的response(也就是爬蟲的響應(yīng)文件)進行操作, 例如:

response.xpath() #括號里直接加xpath路徑

runspider命令:用于直接運行創(chuàng)建的爬蟲, 并不會運行整個項目

scrapy runspider 爬蟲名稱

fetch命令:使用Scrapy下載器下載給定的URL,并將內(nèi)容寫入標(biāo)準(zhǔn)輸出。

scrapy fetch

settings:獲取Scrapy設(shè)置的值。 如果在項目中使用,它將顯示項目設(shè)置值,否則將顯示該設(shè)置的默認Scrapy值。

scrapy settings [options]

parse命令:獲取給定的URL并使用處理它的爬蟲解析它,使用通過–callback選項傳遞的方法,或者parse如果沒有給出。

scrapy parse [options]

scrapy項目文件的結(jié)構(gòu)及用途

可以看到,在city_58項目文件夾下有city_58文件夾和scrapy.cfg文件,其中scrapy.cfg文件中主要包含的是項目的相關(guān)設(shè)置。而在scrapy文件夾下我們可以看到:

Spiders文件夾:我們可以在Spiders文件夾下編寫我們的爬蟲文件,里面主要是用于分析response并提取返回的item或者是下一個URL信息,每個Spider負責(zé)處理特定的網(wǎng)站或一些網(wǎng)站。

init.py:項目的初始化文件。

items.py:定義我們所要爬取的信息的相關(guān)屬性。Item對象是種容器,用來保存獲取到的數(shù)據(jù)。

middlewares.py:Spider中間件,在這個文件里我們可以定義相關(guān)的方法,用以處理蜘蛛的響應(yīng)輸入和請求輸出。

pipelines.py:在item被Spider收集之后,就會將數(shù)據(jù)放入到item pipelines中,在這個組件是一個獨立的類,他們接收到item并通過它執(zhí)行一些行為,同時也會決定item是否能留在pipeline,或者被丟棄。

settings.py:提供了scrapy組件的方法,通過在此文件中的設(shè)置可以控制包括核心、插件、pipeline以及Spider組件。

我們來具體介紹一下我們在今后用的到的文件的基本用途:

items.py

雙擊打開這個文件,看一下都初始化了什么東西

-- coding: urf-8 --

Define here the models for your scrapyed items

See documentation in

http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

class TaoBaoItem(scrapy.Item):

define the fields for your item here like:

name = scrapy.Filed()

pass

通過里面的注釋可見,這個文件的作用是定義我們要爬取信息的標(biāo)準(zhǔn)格式,打個比方說,如果我們要爬取一批人的個人信息,包括姓名,性別,生日,那么我們可以這樣來書寫這個文件

import scrapy

class TaoBaoItem(scrapy.Item):

name = scrapy.Filed()

sex = scrapy.Filed()

birthday = scrapy.Filed()

易見本文件只是定義了一個類,至于什么時候?qū)嵗趺幢4嫠埨^續(xù)了解下面的內(nèi)容。

settings.py

如其名,這是本項目的配置文件,里面注釋著很多常用的配置項,我們通過在其它文件中引入本文件的方式來使用這些配置項。

當(dāng)然,我們可以把這些注釋都刪掉,等需要開啟哪個功能的時候再另行編輯

我們此處先看看默認打開的配置項吧

BOT_NAME = 'taobao'

SPIDER_MODULES = ['taobao.spiders']

NEWSPIDER_MODULE = 'taobao.spider'

Obey robots.txt rules

ROBORSTXT_OBEY = True

因為我們寫的是定向爬蟲,前面三個按默認即可,我們不去管他。看第四項,注釋里說這個配置項的意思是遵守robots.txt,如果不遵守的話可以設(shè)置為False

pipelines.py

雙擊打開這個文件,看看都初始化了什么東西

-- coding: utf-8 --

Define your item pipelines here

Don't forget to add your pipeline to the ITEM_PIPELINES setting

See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

class TaobaoPipeline(object):

def process_item(self, item, spider):

return item

注釋提醒我們要啟用Pipeline的話必須要在settings.py里配置一下ITEM_PIPELINES,配置好后,我們的setting.py如下:

-- coding: utf-8 --

BOT_NAME = 'taobao'

SPIDER_MODULES = ['taobao.spiders']

NEWSPIDER_MODULE = 'taobao.spider'

ROBORSTXT_OBEY = True

ITEM_PIPELINES = {

'taobao.pipelines.TaobaoPipeline': 300,

}

此處的300表示優(yōu)先級,數(shù)字越小優(yōu)先級越高,代表這個Pipeline會越優(yōu)先被執(zhí)行。因為本項目只用到這一個pipeline,所以隨意取0-1000中的一個數(shù)值即可。

再回到pipelines.py這個文件,這個文件到底有什么用呢?

  • 對爬取到的數(shù)據(jù)(Item)進行處理,比如存入數(shù)據(jù)庫
  • 爬蟲結(jié)束時產(chǎn)生事件,比如發(fā)送一封郵件

此處只是介紹一下,具體的操作要看后續(xù)教程。

爬蟲

以上為默認生成的項目結(jié)構(gòu),而爬蟲文件我們需要自己寫。

在默認生成的spiders目錄下新建Taobao_spider.py,我們的爬蟲就寫在這里面。下面為一個簡單的下載網(wǎng)頁源代碼的爬蟲。

import scrapy

class TaobaoSpider(scrapy.Spider):

name = "taobao" # 爬蟲的名字,執(zhí)行時使用

start_urls = [

'https://s.taobao.com/search?q=%E8%BF%9E%E8%A1%A3%E8%A3%99&imgfile=&js=1&stats_click=search_radio_all%3A1'

'&initiative_id=staobaoz_20171101&ie=utf8'

]

def parse(self, response): # 真正的爬蟲方法

html = response.body # response是獲取到的來自網(wǎng)站的返回

以下四行將html存入文件

filename = "index.html"

file = open(filename, "w")

file.write(html)

file.close()

需要說明的是:這個類不是隨心所欲來寫的,name,allowed_domains,start_urls,都是類似于“重載”的值。也就是說,scrapy內(nèi)部會檢測這些變量的值,變量名不可以起成其它的名字,類似的變量之后還會有介紹。至于parse方法,就是重載的父類的方法,我們爬蟲的主體一般就寫在這里面

敲黑板

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容