大家好,我是一只小蟲子,下面我來介紹一下我從出生到學(xué)會爬的過程.(這是一個心酸的故事),好久好久以前,我在瀏覽簡書的時(shí)候看到了"爬",特別的吸引我,所以決定去學(xué)習(xí)一下大家都是怎么搬到的.于是我找到了python ,它看我骨骼驚奇,就給了我一個秘籍Scrapy,那么下面我們來一起看看這本秘籍吧.
Python
mac下python是2.7版本.python3和2.7是有一定的區(qū)別的,本秘籍是2.7版本的.剛開始學(xué)習(xí) python 也是借鑒了廖雪峰老師的課堂傳送門,
Scrapy
Scrapy在 python2.7上是比較穩(wěn)定的,利用 Homebrew和wget來安裝.傳送門
安裝pip工具
pip是基于python的管理工具包,話不多說,打開終端
wget https://bootstrap.pypa.io/get-pip.py
sudo python?get-pip.py
下面要修改一下 pip源:至于為什么要改官方源,我想大家知道.總之換成天朝的源就對了.
需要自己創(chuàng)建配置文件
mkdir .pip
touch pip.conf
vi pip.conf
index-url =http://pypi.mirrors.ustc.edu.cn/simple
當(dāng)然后面的也可以用其他的,只要是國內(nèi)的就可以.
安裝 Scrapy
下面來安裝 Scrapy,在終端輸入
sudo pip install Scrapy
出現(xiàn)問題
大家是不是會遇到報(bào)錯 six-1.4.1已存在鸵闪,uninstall six 操作被拒絕岖赋,導(dǎo)致安裝Scrapy失敗。是因?yàn)镸ac OS 的SIP(System Integrity Protection)服務(wù)(默認(rèn)開啟)依賴six包养晋,所以系統(tǒng)拒絕卸載six列另。
問題解決
如果要卸載six,需要先關(guān)閉系統(tǒng)的SIP。關(guān)閉方法:重啟Mac植锉,期間一直按住 command + r 鍵,直到屏幕出現(xiàn)了蘋果的Logo峭拘;然后在菜單欄的“實(shí)用工具”中選擇終端俊庇,打開之;在終端中輸入
csrutil disable
csrutil status
接下來棚唆,正常重啟 Mac,手動卸載six:
sudo rm -rf /Library/Python/2.7/site-packages/six*
sudo rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six*
在重新輸入安裝命令就 OK 了
sudo pip install Scrapy
創(chuàng)建第一個 Scrapy 程序
在開始爬取之前暇赤,必須創(chuàng)建一個新的Scrapy項(xiàng)目。 選擇一個想要存取信息的目錄宵凌,運(yùn)行下列命令:
scrapy startproject tutorial
tutorial,是自己取的名字.成功之后會出現(xiàn)一個已這個名字命名的文件夾.結(jié)構(gòu)如下
tutorial/? ? //該項(xiàng)目的python模塊鞋囊。之后您將在此加入代碼。
scrapy.cfg? //項(xiàng)目的配置文件
? ? ? ? ? tutorial/ __init__.py
? ? ? ? ? ? ? ? ? ? ? tems.py ?//項(xiàng)目中的item文件
? ? ? ? ? ? ? ? ? ? ? ?pipelines.py
? ? ? ? ? ? ? ? ? ? ? settings.py? //項(xiàng)目的設(shè)置文件
? ? ? ? ? ? ? ? ? ? ? spiders/? ? //放置spider代碼的目錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? __init__.py
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?...
但是如果失敗了,請看這里.....,我遇到的是這個錯誤
AttributeError: 'module' object has no attribute 'PROTOCOL_TLSv1_2' with Python 2.7.11
解決方法
安裝zope.interface 4.3.3,下載,
sudo wheel install xxxx.xxxxx.xxxx.whl
zope.interface包安裝完成瞎惫。再次新建 scrapy溜腐,成功译株。如果還不成功,那么點(diǎn)這里github下載之后運(yùn)行setup.py文件就可以了.再次新建就 ok 了, 如果還不成功,兄弟,去谷歌吧.
回歸正題
我們要為提取數(shù)據(jù)做準(zhǔn)備,怎么去提取數(shù)據(jù),從網(wǎng)頁中提取數(shù)據(jù)有很多方法。Scrapy使用了一種基于XPath和CSS表達(dá)式機(jī)制:Scrapy Selectors挺益。Selector有四個基本的方法
xpath(): 傳入xpath表達(dá)式歉糜,返回該表達(dá)式所對應(yīng)的所有節(jié)點(diǎn)的selector list列表 。
css(): 傳入CSS表達(dá)式望众,返回該表達(dá)式所對應(yīng)的所有節(jié)點(diǎn)的selector list列表.
extract(): 序列化該節(jié)點(diǎn)為unicode字符串并返回list匪补。
re(): 根據(jù)傳入的正則表達(dá)式對數(shù)據(jù)進(jìn)行提取,返回unicode字符串list列表烂翰。
為了介紹Selector的使用方法夯缺,接下來我們將要使用內(nèi)置的Scrapy shell。Scrapy Shell需要您預(yù)裝好IPython(一個擴(kuò)展的Python終端)甘耿。
您需要進(jìn)入項(xiàng)目的根目錄踊兜,執(zhí)行下列命令來啟動shell:
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
關(guān)于 xpath 的學(xué)習(xí)我在這就不多說了.
編輯 item.py 文件
import scrapy ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? classDmozItem(scrapy.Item): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? title=scrapy.Field() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? link=scrapy.Field() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? desc=scrapy.Field()
這個文件的作用是去對網(wǎng)站的信息的獲取,想要什么信息就可以在這里定義好,方便獲取.實(shí)質(zhì)上在對一個網(wǎng)頁去進(jìn)行爬去數(shù)據(jù)的時(shí)候,最重要的是清楚自己想要什么,可以利用瀏覽器去查看源碼,分析.這確實(shí)是一個比較枯燥的過程.一旦當(dāng)你成功的那一刻,會有賭神上身的感覺,隨便從網(wǎng)站中拿出4個A..
在爬蟲文件夾中寫入如下代碼:
import scrapy
from tutorial.DmozItem import DmozItem
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
for sel in response.xpath('//ul/li'):
item = DmozItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
yield item
然后執(zhí)行
scrapy crawl dmoz
出現(xiàn)這個就說明成功
[dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books>
{'desc': [u' - By David Mertz; Addison Wesley. Book in progress, full text, ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.\n],
'link': [u'http://gnosis.cx/TPiP/'],
'title': [u'Text Processing in Python']}
[dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books>
{'desc': [u' - By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]\n'],
'link': [u'http://www.informit.com/store/product.aspx?isbn=0130211192'],
'title': [u'XML Processing with Python']}
成功之后在終端上的數(shù)據(jù)終歸不方便我們?nèi)シ治?最終我們要導(dǎo)出為 Json 或者 XML 的形式.
scrapy crawl dmoz -o items.json
這樣就可以查看到我們剛剛爬到的數(shù)據(jù)了..
總結(jié)
學(xué)習(xí)的道路還很長,革命尚未成功,同志仍然需要努力.我是一個初學(xué)者,希望大神指導(dǎo),一起進(jìn)步.