程序員可以讓步厂财,卻不可以退縮,可以羞澀痒给,卻不可以軟弱说墨,總之,程序員必須是勇敢的
本節(jié)目標
- 配置scrapy環(huán)境苍柏,創(chuàng)建第一個scrapy項目
- 了解scrapy項目結構尼斧。
- 使用scrapy成功編寫一個爬蟲。
小插曲
有人說试吁,virtualenv突颊、pip是pythonner的兩大神器。pip我們在之前的項目中用過很多次了潘悼,今天來告訴大家virtualenv怎么使用。
所謂virtualenv爬橡,你可以簡單的理解為創(chuàng)建一個虛擬的python環(huán)境治唤,這個python環(huán)境是和本機的其他python環(huán)境互不干擾的,所以隨你怎么玩~玩壞了刪除了重新創(chuàng)建就好了糙申。
首先宾添,打開pycharm。選擇file->Default Setting柜裸,如圖:
單擊左上角setting標準缕陕,選擇Create VirtualEnv,如圖:
給你的virtyalEnv起個名字疙挺,然后選擇基礎的python環(huán)境扛邑,記得勾選下面的Inhert global site-packages選項,這回復制你安裝的第三方庫到你的虛擬環(huán)境中铐然,就不用再安裝一次了蔬崩。
這樣,一個虛擬環(huán)境便創(chuàng)建好了搀暑,你到指定的位置可以看到一個虛擬環(huá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毅该。如圖:
點擊安裝等待安裝完畢即可博秫。
創(chuàng)建項目
首先把剛剛創(chuàng)建的虛擬環(huán)境的Scripts文件夾加入到環(huán)境變量中,然后運行scrapy startproject tutorial眶掌,執(zhí)行完畢后可以看到tutorial項目已經(jīng)被創(chuàng)建在根目錄下挡育,目錄結構如下:
下面來簡單介紹一下各個文件的作用:
- scrapy.cfg:項目的配置文件
- items.py:項目的items文件,用來定義數(shù)據(jù)結構
- pipelines.py:項目的pipelines文件朴爬,用來處理數(shù)據(jù)
- settings.py:項目的設置文件
- 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結合起來使用
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ù),我們對它進行重寫疲恢,當我們的spider開始運行的時候會首先請求start_urls里面的鏈接并調(diào)用parse函數(shù)凶朗,給其返回一個response對象。
response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "item-title", " " ))]//a')
上面這句是使用xpath定位標簽显拳,scrapy支持xpath棚愤,還記得上節(jié)介紹的infolite么,剛好可以結合起來使用杂数。如圖得到了我們要的title的xpath:
我們選擇咸魚網(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標簽,我們依然可以通過xpath取出里面的屬性title.xpath('@href')
羊精,如果要取出文字斯够,則使用title.xpath('text()')
囚玫。
接下來我們進入到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的進階篇,我們將介紹scrapy中items 與pipelines的用法怕敬。小伙伴們可以用scrapy把我們之前寫過的爬蟲再重新試試揣炕,看看效率如何~
有興趣的同學可以加群498945822一起交流學習哦~~
發(fā)現(xiàn)問題的同學歡迎指正,直接說就行东跪,不用留面子畸陡,博主臉皮厚!