Python scrapy學習入門

Scrapy 是使用Python編寫的一個用來爬取網站數據,提取結構性數據的應用框架。可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。如果不熟悉可以在以下網站學習其基礎知識。http://scrapy-chs.readthedocs.org/zh_CN/latest/intro/overview.html
使用Scrapy編寫爬蟲能大大提高工作效率。在安裝好Scrapy之後我們可以在命令行中輸入如:scrapy startproject bbs創建一個爬蟲項目,在項目中會自動生成如下所示的一些文件。
bbs/
scrapy.cfg
bbs/
init.py
items.py
pipelines.py
settings.py
spiders/
init.py
結合這些生成的文件我們編寫一個簡單的bbs爬蟲主要可以分爲3個步驟:1、定義我們需要爬取的數據,這部分主要在items.py中實現。

Item 是保存爬取到的數據的容器;其使用方法和python字典類似, 並且提供了額外保護機制來避免拼寫錯誤導致的未定義字段錯誤。

如圖所示我們要抓取論壇中的:論壇名稱、今日登陸人數、帖子、會員、新會員、今日格言等數據。
這裏寫圖片描述

所以items.py代碼如下:

import scrapy
class BbsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name=scrapy.Field()
    today=scrapy.Field()
    posting=scrapy.Field()
    member=scrapy.Field()
    vanfan_geyan=scrapy.Field()
    newmember=scrapy.Field()

2、編寫自己的Spider

Spider類定義瞭如何爬取某個(或某些)網站。包括了爬取的動作(例如:是否跟進鏈接)以及如何從網頁的內容中提取結構化數據(爬取item)。 換句話說,Spider就是您定義爬取的動作及分析某個網頁(或者是有些網頁)的地方。對spider來說,爬取的循環類似下文:以初始的URL初始化Request,並設置回調函數。 當該request下載完畢並返回時,將生成response,並作爲參數傳給該回調函數。spider中初始的request是通過調用 start_requests() 來獲取的。 start_requests() 讀取 start_urls 中的URL, 並以 parse 爲回調函數生成 Request 。在回調函數內分析返回的(網頁)內容,返回 Item 對象或者 Request 或者一個包括二者的可迭代容器。 返回的Request對象之後會經過Scrapy處理,下載相應的內容,並調用設置的callback函數(函數可相同)。在回調函數內,您可以使用 選擇器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 來分析網頁內容,並根據分析的數據生成item。最後,由spider返回的item將被存到數據庫(由某些 Item Pipeline 處理)或使用 Feed exports 存入到文件中。雖然該循環對任何類型的spider都(多少)適用,但Scrapy仍然爲了不同的需求提供了多種默認spider。 之後將討論這些spider。

我們在spiders文件夾中創建自己的spider.py文件,在這個文件中我們可以編寫自己的爬蟲類。這裏我們自己編寫的爬蟲類是從scrapy框架的Spider類中繼承的。在我們這個最基本的爬蟲中我們需要定義自己的爬蟲名:name、限制爬蟲爬取數據的域名範圍:allowed_domain、爬蟲開始工作的起始地址:start_urls。然後就可以在parse函數中對返回的response內容進行處理。在Scrapy中提取數據有自己的一套機制,它們被稱作選擇器(seletors),因爲他們通過特定的 XPath 或者CSS 表達式來“選擇” HTML文件中的某個部分。在這裏我們選用xpath,xpath路徑我們可以自己編寫也可以使用firedebug中自帶的提取xpath路徑功能,如圖所示,選擇需要提取內容的部分右鍵選擇xpath路徑即可自動生成,但有時候這樣生成的路徑可能無法使用,建議自己手動編寫。

這裏寫圖片描述

爲了驗證我們的xpath路徑是否正確,我們可以在shell中進行驗證,輸入scrapy shell “url”如下圖所示:
In中我們輸入要提取的xpath路徑,Out中就會輸出對應位置的文本。
這裏寫圖片描述
具體的spider代碼如下所示:

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy import log
from bbs.items import BbsItem

class bbsSpider(Spider):
    name="bbs"
    allowed_domain=["bbs.uestc.edu.cn/"]
    start_urls=[
        "http://bbs.uestc.edu.cn/"
    ]
    def parse(self,response):
        sel=Selector(response)
        item=BbsItem()
        item['name']=sel.xpath('//title/text()').extract()
        item['today']=sel.xpath('/html/body/div[6]/div[4]/div[1]/p/em[1]/text()').extract()
        item['posting']=sel.xpath('/html/body/div[6]/div[4]/div[1]/p/em[3]/text()').extract()
        item['member']=sel.xpath('/html/body/div[6]/div[4]/div[1]/p/em[4]/text()').extract()
        item['vanfan_geyan']=sel.xpath('/html/body/div[6]/div[4]/div[1]/div/div/div[1]/a/span/text()').extract()
        item['newmember']=sel.xpath('/html/body/div[6]/div[4]/div[1]/p/em[5]/a/text()').extract()
        return item

3、編寫pipelines、以及配置settings

當Item在Spider中被收集之後,它將會被傳遞到Item Pipeline,一些組件會按照一定的順序執行對Item的處理。每個item pipeline組件(有時稱之爲“Item Pipeline”)是實現了簡單方法的Python類。他們接收到Item並通過它執行一些行爲,同時也決定此Item是否繼續通過pipeline,或是被丟棄而不再進行處理。
以下是item pipeline的一些典型應用:
清理HTML數據
(1)驗證爬取的數據(檢查item包含某些字段)
(2)查重(並丟棄)
(3)將爬取結果保存到數據庫中

我們在pipelines.py中主要將spider抓取返回的item數據以utf-8形式保存到一個json文件中。並且在settings.py文件中添加配置項ITEM_PIPELINES = {
‘bbs.pipelines.BbsPipeline’:300,
}

# -*- 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


import codecs
import json
from scrapy import signals

class BbsPipeline(object):
    def __init__(self):
    self.file=codecs.open('data.json','w',encoding='utf-8')

    def process_item(self, item, spider):
    line=json.dumps(dict(item))+'\n'
    self.file.write(line.decode("unicode_escape"))
        return item

    def spider_closed(self,spider):
    self.file.close()

最後在該項目的根目錄運行scrapy crawl +爬蟲名 開始運行爬蟲,得到如下所示結果:
這裏寫圖片描述

在爬蟲運行完之後,在項目文件中會生成一個data.json文件,這個就是我們在pipelines.py文件中寫的用來保存抓取數據的文件。文件內容如圖所示:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章