Python scrapy爬蟲框架簡介

卒跡發表於2017-04-06

安裝準備

需要安裝Python2.7/3.5 需要安裝scrapy庫:pip install scrapy
Windows下還需要安裝win32py擴充套件包:安裝參考另一篇文章http://blog.csdn.net/u010129985/article/details/69257887

scrapy

scrapy的每個item物件都表示一個網頁,裡面可以定義各種屬性,比如:標題,時間,內容等 自定義的item一般都會繼承Item
items.py

class Article(Item):
    title=Field()

詳細文章參考:
整體專案結構介紹:(包含專案,但是虎嗅網好像限制爬蟲,所以執行不了)
https://www.xncoding.com/2016/03/10/scrapy-02.html

參考二:http://www.pythontip.com/blog/post/1985/

已測試可用示例:

維基百科採集

1 生成專案
scrapy startproject wikiSpider wikiSpider是專案名稱
2 編輯items.py檔案

import scrapy
from scrapy import Item,Field

class Article(Item):
    title=Field()

在spiders資料夾下建一個處理檔案articleSpider.py

from scrapy.contrib.spiders import CrawlSpider, Rule
from wikiSpider.items import Article
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy import log

class ArticleSpider(CrawlSpider):
    #log.start(logfile='log.txt', loglevel=log.CRITICAL)
    name="article"
    allowed_domains = ["en.wikipedia.org"]
    start_urls = ["http://en.wikipedia.org/wiki/Python_%28programming_language%29"]
    rules = [
        Rule(SgmlLinkExtractor(allow=('(/wiki/)((?!:).)*$'),), callback="parse_item", follow=True)
    ]

    def parse_item(self, response):
        item = Article()
        title = response.xpath('//h1/text()')[0].extract()
        print("Title is: "+title)
        item['title'] = title
        return item

介紹:name很關鍵 scrapy crawl article 執行爬蟲專案時指定的引數就是這個name,allowed_domains表示能夠被採集的站點 ;在piplines.py檔案裡可定義一定不會採集的站點;start_urls說明該爬蟲從哪個URL開始爬;parse()是預設的採集回撥,當採集到一個網頁後自動呼叫該方法,該方法只接受一個response參數列示網頁體;CrawlSpider是框架提供的一個爬蟲基礎類(Spider>BaseSpider>CrawlSpider) ; Rule為規則物件,主要用來篩選網頁元素;SgmlLinkExtractor實現規則allow表示允許通過的連結,deny=(‘deny.php’, )表示不被允許的連結 ;callback指定回撥函式,上面放棄了預設的回撥parse() ;response是下載的網頁流(字串) 本咧中用的Xpath選擇器,同時還可以用beautifulsoup來解析,lxml來解析(Scrapy選擇器構建在lxml基礎之上,所以可以保證速度和準確性。)

Xpath語法

//div/li 選擇所有div下的li標籤
a/@href  選擇所有a標籤的屬性href 
a/text() 選擇a標籤的文字
a[@href="/abc"] 選擇a標籤且href屬性為“/abc”
text()表示選擇文字
//div[@class="mod-info-flow"]/div/div[@vlass="mob-ctt"] 表示選擇所有div標籤且div的class為mod-info-flow再選擇該div下的div再下面的div且該div class為mod-ctt
Xpath選擇器返回的是一個序列
item['link']=sel.xpath('h2/a/@href')[0].extract() 表示選擇序列第一個物件,extract()表示提取出結果

callback指定的回撥都會返回一個結果序列,這個序列可以用來輸出到檔案;如果是全網站爬蟲,需要對xpath解析後的連結再次執行需要返回一個Request序列 進行下一步處理,如:
yield scrapy.Request(url,callback=self.parse_article) 把xpath提取出來的URL交付給下一個回撥處理,yield表示提供一個生成器,這個生成器可以用來迭代

輸出日誌

scrapy crawl article -s LOG_FILE=wiki.log

輸出採集結果到檔案

scrapy crawl article -o articles.json/csv/xml -t json/csv/xml

相關文章