Python爬蟲之Scrapy框架入門1

環(huán)境搭建

在開始搭建scrapy爬蟲的開發(fā)環(huán)境之前,建議已經(jīng)安裝Anaconda這個python發(fā)行版本,這個可以讓以后的開發(fā)過程中,安裝其他的模塊環(huán)境不至于出現(xiàn)一堆的錯誤。

假定你安裝好了Anaconda,也配置好了相應(yīng)的環(huán)境變量,這是你可以用以下的命令安裝scrapy框架:

  1. 在終端執(zhí)行下面這條命令

conda install Scrapy

下面是安裝過程的截圖,是不是很簡單

安裝scrapy

2.通過python的包安裝和管理工具pip來安裝

pip install Scrapy

這樣,scrapy就安裝完成了, 不管通過哪種方式,是不是都很簡單!當(dāng)然此處推薦使用第一種安裝方式,什么??你就要用第二種,ok,ok,你用好了,體驗一把安裝python模塊庫錯綜復(fù)雜,藕斷絲連,欲罷不能,讓人蛋疼依賴關(guān)系(有多疼??疼到你懷疑你有一顆假的蛋,沒錯,一顆),也是一種人生的歷練??!

環(huán)境安裝好了以后,下面就可以開始我們想入非非,性奮不已的scrapy基礎(chǔ)之路了。
作為流程,下面請允許我從scrapy的官網(wǎng)借(程序員的事情不叫偷的)一些話來湊個字?jǐn)?shù)

項目創(chuàng)建

在開始爬取之前,您必須創(chuàng)建一個新的Scrapy項目(廢話,請忽略)
怎么創(chuàng)建項目??對,沒錯,就是這樣,打開終端:

scrapy新建項目

注意注意 項目取名字的時候,不要像我的這個取得這么見名知意,萬一你的領(lǐng)導(dǎo)或同事沒有八年開發(fā)經(jīng)驗和漢語八級,你可能會被打的

見名知意

項目創(chuàng)建完成,可以看到下面的項目目錄

項目結(jié)構(gòu)

下面該寫爬蟲了??no??!在開始寫爬蟲之前還是來了解一下scrapy的工作流程!

scrapy工作流程圖

沒錯我又從網(wǎng)上偷來的這張圖

??圖看不太懂?我艸,我就知道有人跟我一樣,沒關(guān)系,來來來,看看別人通俗形象的解釋:

引擎:Hi!Spider, 你要處理哪一個網(wǎng)站?

Spiders:我要處理xxoo.com

引擎:你把第一個需要的處理的URL給我吧。

Spiders:給你第一個URL是XXXXXXX.com

引擎:Hi!調(diào)度器,我這有request你幫我排序入隊一下。

調(diào)度器:好的,正在處理你等一下。

引擎:Hi!調(diào)度器,把你處理好的request給我,

調(diào)度器:給你,這是我處理好的request

引擎:Hi!下載器,你按照下載中間件的設(shè)置幫我下載一下這個request

下載器:好的!給你,這是下載好的東西。(如果失敗:不好意思,這個request下載失敗,然后引擎告訴調(diào)度器,這個request下載失敗了,你記錄一下,我們待會兒再下載。)

引擎:Hi!Spiders,這是下載好的東西,并且已經(jīng)按照Spider中間件處理過了,你處理一下(注意!這兒responses默認(rèn)是交給def parse這個函數(shù)處理的)

Spiders:(處理完畢數(shù)據(jù)之后對于需要跟進(jìn)的URL),Hi!引擎,這是我需要跟進(jìn)的URL,將它的responses交給函數(shù) def xxxx(self, responses)處理。還有這是我獲取到的Item。

引擎:Hi !Item Pipeline 我這兒有個item你幫我處理一下!調(diào)度器!這是我需要的URL你幫我處理下。然后從第四步開始循環(huán),直到獲取到你需要的信息,

注意!只有當(dāng)調(diào)度器中不存在任何request了,整個程序才會停止,(也就是說,對于下載失敗的URL,Scrapy會重新下載。)

以上就是Scrapy整個流程了。

注: 以上引用自博客http://cuiqingcai.com/3472.html

以上完成了對scrapy的工作流程的理解,下面開始進(jìn)入正題,開始我們的小爬蟲,用于scrapy官網(wǎng)給出的例子中的domz網(wǎng)站已經(jīng)永久關(guān)閉,所以下面的例子,我們以http://quotes.toscrape.com/tag/humor/這個網(wǎng)站為例。

Item編寫

觀察網(wǎng)頁的結(jié)構(gòu)后,確定一下需要爬取的頁面和想要爬取的內(nèi)容字段,比如,你要要爬取番號,封面,還是種子呢?別激動,我們在這里只爬取上面的網(wǎng)站每個條目的標(biāo)題,鏈接作者標(biāo)簽四個字段,

確定要爬取的字段以后,就可以開始爬蟲的編寫,在==items.py==文件中加入我們要爬取的字段,如下圖所示:

item定義

爬蟲文件編寫

確定以及定義好了我們需要提取的字段,下面就該開始爬蟲的編寫了,在spiders文件夾下新建自己的爬蟲文件:

新建spider文件

對于這個文件里的幾行代碼,這里只簡單的解釋一下,詳細(xì)的介紹以后再說,畢竟這里只是入門嘛!

開始我們導(dǎo)入scrapy模塊(這行還看不懂的話)。。。。

我還能說什么

除了這個模塊,我們還需要導(dǎo)入之前編寫的item文件。之后是定義了一個spider類,該類繼承自scrapy.Spider,下面的name = 'PachongSpider'是爬蟲的名字,這個名字是唯一的,因為在完成代碼后運行爬蟲要用到這個名字,start_urls 列表里存放要爬取的鏈接地址,scrapy會自動從這個列表取出地址進(jìn)行爬取,并將返回的response作為參數(shù)傳遞給self.parse,在self.parse里就可以從response解析出需要的數(shù)據(jù)字段(即item里定義的字段)。

關(guān)于數(shù)據(jù)的解析,scrapy提供了多種方式,xpath,css,re,都是可以的,這里先來試試xpath,如果對xpath不是很熟悉,可以先看一下http://www.w3school.com.cn/xpath/index.asp,看了,還不會用???多試幾遍就會了,或者也可以借助強(qiáng)大的chrome瀏覽器

提取xpath

爬蟲的編寫如下:

#coding:utf-8

import scrapy
from pachong.items import PachongItem

class QuotesSpider(scrapy.Spider):
    name =  'pachong'
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        base_url = 'http://quotes.toscrape.com'
        item = PachongItem()
        divs = response.xpath('//div[@class="quote"]')
        for div in divs:
            item['name'] = div.xpath('span[@class="text"]/text()').extract()[0]
            item['url'] = base_url+div.xpath('span/a/@href').extract()[0]
            item['tags'] = div.xpath('div[@class="tags"]/a/text()').extract()
            item['author'] = div.xpath('span/small[@class="author"]/text()').extract()[0]
            print(item)
            yield item

數(shù)據(jù)持久化

最后我們將爬取的數(shù)據(jù)持久化到本地,可以存儲在文件中,csv,json,當(dāng)然也可以是數(shù)據(jù)庫,這里采用mongodb來存儲(關(guān)于python使用mongodb,請自行百度),如同文章開始介紹的,數(shù)據(jù)持久化需要在pipelines.py文件中進(jìn)行,
一下開始編寫pipelines.py文件

import pymongo

class PachongPipeline(object):
    def __init__(self):
        self.client = pymongo.MongoClient('localhost', 27017)
        self.pchdb = self.client['pchdb']
        self.pchtab = self.pchdb['pchtab']

    def process_item(self, item, spider):
        self.pchtab.insert_one(dict(item))
        return item

首先導(dǎo)入mongodb的python依賴模塊,在pipelines.py初始化方法中,連接到mongodb數(shù)據(jù)庫,在process_item方法中向數(shù)據(jù)庫插入數(shù)據(jù)。這個文件編寫完成,需要在settings.py文件中配置該管道

ITEM_PIPELINES = {
   'pachong.pipelines.PachongPipeline': 1,
}

如果運行了程序,數(shù)據(jù)庫沒有數(shù)據(jù),可能是沒有在settings里配置ITEM_PIPELINES。

下面就是運行腳本了,打開終端,進(jìn)入到爬蟲的根目錄(到達(dá)根目錄,scrapy list命令查看爬蟲的列表就是前面所說的spider里面的name對應(yīng)的值),然后輸入scrapy crawl pachong,腳本運行完成可以在數(shù)據(jù)庫看到爬取到的數(shù)據(jù)了

爬取到的數(shù)據(jù)

最后說一下,每次都要打開終端輸入命令來運行腳本多少有些不便,可以在項目的根目錄下新建一個python文件輸入下面的代碼:

from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'pachong'])

execute方法的的參數(shù)list中的三個元素是不是很熟悉,沒錯,就是前面在終端輸入過的命令,第三個元素是根據(jù)你爬蟲的“name”來定的

至此一個簡單的爬蟲就完成了,至于怎么爬取有分頁的網(wǎng)頁,怎么設(shè)置代理,應(yīng)對反爬,以及怎么爬取js動態(tài)加載的頁面,將會在后面的博客中講到。
最后是代碼地址:https://github.com/lexyhp/pachong

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容