python爬蟲的最佳實踐(八)--初探Scrapy

程序員可以讓步,卻不可以退縮,可以羞澀,卻不可以軟弱,總之,程序員必須是勇敢的

本節(jié)目標(biāo)

  1. 配置scrapy環(huán)境,創(chuàng)建第一個scrapy項目
  2. 了解scrapy項目結(jié)構(gòu)。
  3. 使用scrapy成功編寫一個爬蟲。

小插曲

有人說,virtualenvpip是pythonner的兩大神器。pip我們在之前的項目中用過很多次了,今天來告訴大家virtualenv怎么使用。

所謂virtualenv,你可以簡單的理解為創(chuàng)建一個虛擬的python環(huán)境,這個python環(huán)境是和本機的其他python環(huán)境互不干擾的,所以隨你怎么玩~玩壞了刪除了重新創(chuàng)建就好了。

首先,打開pycharm。選擇file->Default Setting,如圖:

1.png

單擊左上角setting標(biāo)準(zhǔn),選擇Create VirtualEnv,如圖:


2.png

給你的virtyalEnv起個名字,然后選擇基礎(chǔ)的python環(huán)境,記得勾選下面的Inhert global site-packages選項,這回復(fù)制你安裝的第三方庫到你的虛擬環(huán)境中,就不用再安裝一次了。

這樣,一個虛擬環(huán)境便創(chuàng)建好了,你到指定的位置可以看到一個虛擬環(huán)境的文件夾,進(jìn)入可以看到一個完整的python環(huán)境,python的第三方庫都在Scripts文件夾下可以找到,如果要給虛擬環(huán)境安裝第三方庫,可以從pycharm安裝,也可以直接運行 虛擬環(huán)境根目錄\Scripts\pip.exe install packageName。好了這樣我們的虛擬環(huán)境變創(chuàng)建好了。

安裝scrapy

建議用python2.x的版本安裝。
打開pycharm,選擇 file->Default Setting,選中剛剛創(chuàng)建的虛擬環(huán)境,點擊+,在搜索框中輸入scrapy。如圖:

3.png

點擊安裝等待安裝完畢即可。

創(chuàng)建項目

首先把剛剛創(chuàng)建的虛擬環(huán)境的Scripts文件夾加入到環(huán)境變量中,然后運行scrapy startproject tutorial,執(zhí)行完畢后可以看到tutorial項目已經(jīng)被創(chuàng)建在根目錄下,目錄結(jié)構(gòu)如下:

4.png

下面來簡單介紹一下各個文件的作用:

  • scrapy.cfg:項目的配置文件
  • items.py:項目的items文件,用來定義數(shù)據(jù)結(jié)構(gòu)
  • pipelines.py:項目的pipelines文件,用來處理數(shù)據(jù)
  • settings.py:項目的設(shè)置文件
  • spiders/:存儲爬蟲的目錄

接下來我們創(chuàng)建第一個scrapy爬蟲

第一個scrapy爬蟲

在spiders目錄下創(chuàng)建一個新的python文件命名為test.py,然后代碼如下:

#coding:utf-8
import scrapy
from scrapy.spiders import BaseSpider
from bs4 import BeautifulSoup

class testSpider(scrapy.Spider):
    name = 'test'
    start_urls = ['https://s.2.taobao.com/list/list.htm?spm=2007.1000337.0.0.RrSiSG&catid=50100398&st_trust=1&page=1&ist=0']

    def parse(self, response):
        for title in response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "item-title", " " ))]//a'):
            yield scrapy.Request('http:'+title.xpath('@href').extract()[0], self.detail)

    def detail(self, response):
        data = BeautifulSoup(response.body, 'lxml')
        area = data.select('#J_Property > h1')
        print area[0].get_text()

首先引入庫scrapy,緊接著引入庫beautifulsoup,沒錯,scrapy可以和beautifulsoup結(jié)合起來使用

name = 'test'定義了這個爬蟲的名稱,這個名稱必須是唯一的,以便用來區(qū)分其他爬蟲。
start_urls = ['https://s.2.taobao.com/list/list.htm?spm=2007.1000337.0.0.RrSiSG&catid=50100398&st_trust=1&page=1&ist=0']
定義了開始的url,這個和pyspider類似,可以填入多個url。

def parse(self, response):
        for title in response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "item-title", " " ))]//a'):
            yield scrapy.Request('http:'+title.xpath('@href').extract()[0], self.detail)

parse這個函數(shù)是我們繼承的scrapy.Spiderclass里面內(nèi)置的函數(shù),我們對它進(jìn)行重寫,當(dāng)我們的spider開始運行的時候會首先請求start_urls里面的鏈接并調(diào)用parse函數(shù),給其返回一個response對象。

response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "item-title", " " ))]//a')

上面這句是使用xpath定位標(biāo)簽,scrapy支持xpath,還記得上節(jié)介紹的infolite么,剛好可以結(jié)合起來使用。如圖得到了我們要的title的xpath:

5.png

我們選擇咸魚網(wǎng)的列表的title,然后創(chuàng)建一個yield迭代器去遍歷每個title里面的url,代碼如下:

yield scrapy.Request('http:'+title.xpath('@href').extract()[0], self.detail)

scrapy.Request函數(shù)第一個參數(shù)傳入url,第二個參數(shù)傳入callback。對于我們已經(jīng)取出來的title的a標(biāo)簽,我們依然可以通過xpath取出里面的屬性title.xpath('@href'),如果要取出文字,則使用title.xpath('text()')

接下來我們進(jìn)入到detail函數(shù):

def detail(self, response):
        data = BeautifulSoup(response.body, 'lxml')
        area = data.select('#J_Property > h1')
        print area[0].get_text()

一如我們之前講解的,在這里,我們用beautifulsoup解析response.body,然后通過csspath取出我們想要的信息。

至此,我們第一個scrapy爬蟲就寫完了,是不是比想象中的簡單呢?

寫在最后

今天,我們簡單介紹了scrapy并實現(xiàn)了一個scrapy爬蟲,下一節(jié)是scrapy的進(jìn)階篇,我們將介紹scrapy中items 與pipelines的用法。小伙伴們可以用scrapy把我們之前寫過的爬蟲再重新試試,看看效率如何~

有興趣的同學(xué)可以加群498945822一起交流學(xué)習(xí)哦~~
發(fā)現(xiàn)問題的同學(xué)歡迎指正,直接說就行,不用留面子,博主臉皮厚!

最后編輯于
?著作權(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)容