利用scrapy框架進行爬蟲
今天一個網友問爬蟲知識,自己把許多小細節都忘了,很慚愧,所以這裡寫一下大概的步驟,主要是自己鞏固一下知識,順便複習一下。(scrapy框架有一個好處,就是可以爬取https的內容)
【爬取的是楊子晚報,這裡就以此為例,建立scrapy爬蟲 網址:http://www.yangtse.com/】
第一步:安裝scrapy框架
(這裡不做詳細介紹了,要是安裝遇到問題的朋友們,可以參考下面連結
http://www.cnblogs.com/wj-1314/p/7856695.html)
第二步:建立scrapy爬蟲檔案
格式:scrapy startproject + 專案名稱
scrapy startproject yangzi
第三步:進入爬蟲檔案
格式:cd 專案名稱
cd yangzi
第四步:建立爬蟲專案
格式:scrapy genspider -t basic 專案名稱 網址
具體用法如下:
Usage
=====
scrapy genspider [options] <name> <domain>
Generate new spider using pre-defined templates
Options
=======
--help, -h show this help message and exit
--list, -l List available templates
--edit, -e Edit spider after creating it
--dump=TEMPLATE, -d TEMPLATE
Dump template to standard output
--template=TEMPLATE, -t TEMPLATE
Uses a custom template.
--force If the spider already exists, overwrite it with the
template
Global Options
--------------
--logfile=FILE log file. if omitted stderr will be used
--loglevel=LEVEL, -L LEVEL
log level (default: DEBUG)
--nolog disable logging completely
--profile=FILE write python cProfile stats to FILE
--pidfile=FILE write process ID to FILE
--set=NAME=VALUE, -s NAME=VALUE
set/override setting (may be repeated)
--pdb enable pdb on failure
scrapy genspider -t basic yz http://www.yangtse.com/
建立好了,如下圖:
解釋一下檔案:
- scrapy.cfg:專案的配置檔案
- yangzi:該專案的python模組。之後您將在此加入程式碼。
- yangzi/items.py:專案中的item檔案。
- yangzi/pipelines.py:專案中的pipelines檔案。
- yangzi/yz/:放置spider程式碼的目錄。
第五步:進入爬蟲專案中,先寫items
寫這個的目的就是告訴專案,你要爬去什麼東西,比如標題,連結,作者等.
Item是儲存爬取到的資料的容器:其使用方法和python字典類似,並且提供了額外保護機制來避免拼寫錯誤導致的未定義欄位錯誤。
類似在ORM中做的一樣,你可以通過建立一個scrapy.Item
類,並且定義型別為scrapy.Field
的類屬性來定義一個Item。
首先根據需要從dmoz.org獲取到的資料對item進行建模。我們需要從dmoz中獲取名字,url,以及網站的描述。對此,在item中定義相應的欄位。
以我寫的為例,我想爬取標題,連結,內容,如下:
class YangziItem(scrapy.Item): # define the fields for your item here like: #標題 title = scrapy.Field() #連結 link = scrapy.Field() #內容 text = scrapy.Field()
第六步:進入pipelines,設定相應程式
分析爬去的網站,依次爬取的東西,因為pipelines是進行後續處理的,比如把資料寫入MySQL,或者寫入本地文件啊等等,就在pipelies裡面寫。這裡直接輸出,不做資料庫的匯入處理
class YangziPipeline(object): def process_item(self, item, spider): print(item["title"]) print(item["link"]) return item
第七步:再寫自己建立的爬蟲
(其實,爬蟲和pipelines和settings前後順序可以顛倒,這個不重要,但是一定要先寫items)
Spider是使用者編寫用於從單個網站(或者一些網站)爬取資料的類。
其包含了一個用於下載的初始url,如何跟進網頁中的連結以及如何分析頁面中的內容,提取生成item的方法。
為了建立一個Spider,您必須繼承scrapy.Spider
類,且定義以下三個屬性:
name
:用於區別Spider。改名字必須是唯一的,您不可以為不同的Spider設定相同的名字。start_urls
:包含了Spider在啟動時進行爬取的url列表。因此,第一個被獲取的頁面給將是其中之一。後續的URL則從初始的URL獲取到的資料中提取。-
parse()
:是spider的一個方法。被呼叫時,每個初始url完成下載後生成的Response
物件將會作為唯一的引數傳遞給該函式。該方法負責解析返回的資料(response data),提取資料(生成item)以及生成需要進一步處理的URL的Request
物件。
進入爬蟲後,先匯入items
接下來需要建立一個ITEM容器,
it = YangziItem()
然後寫自己的要爬去的內容,分析網頁後,利用xpath寫
def parse(self, response): it = YangziItem() it["title"] = response.xpath('//div[@class="box-text-title]/text()').extract() it["link"] = response.xpath('//a[@target="_blank"]/@href').extract() #it["text"] = response.xpath().extract() yield it
第八步:設定settings
在settings中配置pipelines(ctrl+f 找到pipelines,然後解除那三行的註釋,大約在64-68行之間),如下圖
第九步:執行爬蟲檔案
scrapy crawl yz
scrapy crawl yz --nolog #不想顯示日誌檔案