程序員可以讓步,卻不可以退縮,可以羞澀,卻不可以軟弱,總之,程序員必須是勇敢的
本節目標
- 配置scrapy環境,創建第一個scrapy項目
- 了解scrapy項目結構。
- 使用scrapy成功編寫一個爬蟲。
小插曲
有人說,virtualenv、pip是pythonner的兩大神器。pip我們在之前的項目中用過很多次了,今天來告訴大家virtualenv怎么使用。
所謂virtualenv,你可以簡單的理解為創建一個虛擬的python環境,這個python環境是和本機的其他python環境互不干擾的,所以隨你怎么玩~玩壞了刪除了重新創建就好了。
首先,打開pycharm。選擇file->Default Setting,如圖:
單擊左上角setting標準,選擇Create VirtualEnv,如圖:
給你的virtyalEnv起個名字,然后選擇基礎的python環境,記得勾選下面的Inhert global site-packages選項,這回復制你安裝的第三方庫到你的虛擬環境中,就不用再安裝一次了。
這樣,一個虛擬環境便創建好了,你到指定的位置可以看到一個虛擬環境的文件夾,進入可以看到一個完整的python環境,python的第三方庫都在Scripts文件夾下可以找到,如果要給虛擬環境安裝第三方庫,可以從pycharm安裝,也可以直接運行 虛擬環境根目錄\Scripts\pip.exe install packageName。好了這樣我們的虛擬環境變創建好了。
安裝scrapy
建議用python2.x的版本安裝。
打開pycharm,選擇 file->Default Setting,選中剛剛創建的虛擬環境,點擊+,在搜索框中輸入scrapy。如圖:
點擊安裝等待安裝完畢即可。
創建項目
首先把剛剛創建的虛擬環境的Scripts文件夾加入到環境變量中,然后運行scrapy startproject tutorial,執行完畢后可以看到tutorial項目已經被創建在根目錄下,目錄結構如下:
下面來簡單介紹一下各個文件的作用:
- scrapy.cfg:項目的配置文件
- items.py:項目的items文件,用來定義數據結構
- pipelines.py:項目的pipelines文件,用來處理數據
- settings.py:項目的設置文件
- spiders/:存儲爬蟲的目錄
接下來我們創建第一個scrapy爬蟲
第一個scrapy爬蟲
在spiders目錄下創建一個新的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'
定義了這個爬蟲的名稱,這個名稱必須是唯一的,以便用來區分其他爬蟲。
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這個函數是我們繼承的scrapy.Spiderclass里面內置的函數,我們對它進行重寫,當我們的spider開始運行的時候會首先請求start_urls里面的鏈接并調用parse函數,給其返回一個response對象。
response.xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "item-title", " " ))]//a')
上面這句是使用xpath定位標簽,scrapy支持xpath,還記得上節介紹的infolite么,剛好可以結合起來使用。如圖得到了我們要的title的xpath:
我們選擇咸魚網的列表的title,然后創建一個yield迭代器去遍歷每個title里面的url,代碼如下:
yield scrapy.Request('http:'+title.xpath('@href').extract()[0], self.detail)
scrapy.Request函數第一個參數傳入url,第二個參數傳入callback。對于我們已經取出來的title的a標簽,我們依然可以通過xpath取出里面的屬性title.xpath('@href')
,如果要取出文字,則使用title.xpath('text()')
。
接下來我們進入到detail函數:
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并實現了一個scrapy爬蟲,下一節是scrapy的進階篇,我們將介紹scrapy中items 與pipelines的用法。小伙伴們可以用scrapy把我們之前寫過的爬蟲再重新試試,看看效率如何~
有興趣的同學可以加群498945822一起交流學習哦~~
發現問題的同學歡迎指正,直接說就行,不用留面子,博主臉皮厚!