https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml 下載即可。
安裝完方法2 后需要回到方法1繼續(xù)安裝,不是說方法2完成后,scrapy就安裝好了。
報錯情況下安裝下面的twisted而不是上面lxml
Scrapy爬蟲的使用
一個基本的爬蟲只需要兩部分組成:Spider(爬蟲)、Pipeline(管道)。
管道是什么?
每個項目管道組件是一個實現(xiàn)簡單方法的Python類。他們接收一個項目并對其執(zhí)行操作,還決定該項目是否應(yīng)該繼續(xù)通過流水線或被丟棄并且不再被處理。
管道左邊是爬蟲,右側(cè)是數(shù)據(jù)庫,中間是管道
管道里面有很多重要的方法。
項目管道的典型用途是:
- 清理HTML數(shù)據(jù)
- 驗證抓取的數(shù)據(jù)(檢查項目是否包含特定字段)
- 檢查重復(fù)(并刪除)
- 將刮取的項目存儲在數(shù)據(jù)庫中
切盤:輸入盤符
或者cd D:\scrapywork
然后在里面創(chuàng)建一個city_58項目
第一個Scrapy項目
- 在命令行輸入scrapy startproject city_58,建立Scrapy項目,提示如圖即成功。
[圖片上傳失敗...(image-82c015-1517579234036)]
里面的文件目錄都如下:
[圖片上傳失敗...(image-53a11-1517579234036)]
Alt text
- 得到如圖的文件目錄結(jié)構(gòu)
[圖片上傳失敗...(image-601747-1517579234036)]
- 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:項目的配置文件,一般不需要修改,也不能刪除
- 在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é)果如下:
自動生成如下代碼
-- 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
不要重寫,request不重寫,按照默認
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
- 啟動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 = [
'&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方法,就是重載的父類的方法,我們爬蟲的主體一般就寫在這里面
敲黑板
- 有能力的同學(xué)可以嘗試去Scrapy框架官網(wǎng)查看英文文檔,解鎖更多關(guān)于Scrapy框架最新的使用和操作方法
- 老師上課說的大神必備:windows 命令行基本操作命令介紹