跑爬蟲比較接近電影里對Hacker印象,輸入幾行代碼,程序就可以運行很久
剛好樹莓派已經(jīng)預(yù)裝了Python2,可以在樹莓派上體驗一下,另外爬蟲確實很實用,可以高效搜集很多信息,比復(fù)制粘貼強了很多
而且Scrapy門檻很低,幾個小時就能上手,得到你想要的數(shù)據(jù)
安裝:
- sudo apt-get install libffi-dev
- sudo apt-get install libxml2-dev
- sudo apt-get install libxslt1-dev
- sudo apt-get install python-dev
- sudo apt-get install libssl-dev
安裝配置virtualenv:
- sudo pip install virtualenv
安裝virtualenvwrapper:
- sudo mkdir ~/scrapy_spider
- sudo pip install --user virtualenvwrapper
- export WORKON_HOME=~/Envs
- mkdir -p $WORKON_HOME
- source /usr/local/bin/virtualenvwrapper.sh
創(chuàng)建名為scrapy的virtualenv
- mkvirtualenv scrapy
配置完之后會終端行首會顯示(scrapy)$,說明處于名為scrapy的virtualenv
- ls $WORKON_HOME
使workon在重啟后依然有效:
- sudo nano ~/.bashrc
添加以下內(nèi)容至末尾:
- export WORKON_HOME=$HOME/Envssource /usr/local/bin/virtualenvwrapper.sh
- source ~/.bashrc
virtualenv內(nèi)安裝scrapy:
- (scrapy)$ sudo pip install scrapy
進(jìn)入名為scrapy的virtualenv:
- workon scrapy
退出virtualenv:
- deactivate
簡單爬蟲示例:
單個的爬蟲文件最關(guān)鍵是start_urls,以及返回的內(nèi)容
比如你想抓取北京所有的7-11門店名稱及位置
先登錄官網(wǎng)店鋪信息頁面,一共在8個區(qū)有店,鼠標(biāo)懸停觀察每個區(qū)的url,這樣start_urls就確定了
需要先獲取每個門店的url,用Chrome瀏覽器右鍵審查門店鏈接,彈出窗口內(nèi)右擊相應(yīng)代碼位置 Copy > Copy XPath
得到: ...tr[1]/th/a
所以url表達(dá)式為:
- response.xpath('.//tr/th/a/@href')
補全即可得到完整url:
- response.urljoin(href.extract())
然后進(jìn)入單個門店url查看想獲取信息的XPath
門店名稱為:
- //*[@id="mainContentsBox"]/h4
門店位置(百度地圖坐標(biāo))在js代碼內(nèi):
- //*[@id="mainContentsBox"]/script
用Shell測試是否能抓取店名及位置(百度地圖坐標(biāo)):
- scrapy shell http://www.7-11bj.com.cn/?post/cq/223/id/270.html --nolog
輸入:
- response.xpath('//div[@id="mainContentsBox"]/h4/text()').extract()[0]
能夠返回店名
百度地圖坐標(biāo)藏在js代碼內(nèi),需用正則表達(dá)提取
- response.xpath('//*[@id="mainContentsBox"]/script').re(r'BMap.Point(([0-9.]+),([0-9.]+))')
能夠返回位置(百度地圖坐標(biāo)),7-11北京官網(wǎng)的一部分坐標(biāo)似乎本身有問題,并不是爬蟲的關(guān)系,直接去url內(nèi)查看源碼也是一樣的結(jié)果
創(chuàng)建單個爬蟲:
- cd ~/scrapy_spider
- workon scrapy
- sudo nano ~/scrpay_spider/711bj.py
711bj.py
# -*- coding: utf-8 -*-
import scrapy
class StackOverflowSpider(scrapy.Spider):
name = '711bj'
start_urls = ['http://www.7-11bj.com.cn/?chengqu/cq/223.html'] + \
['http://www.7-11bj.com.cn/?chengqu/cq/224.html'] + \
['http://www.7-11bj.com.cn/?chengqu/cq/225.html'] + \
['http://www.7-11bj.com.cn/?chengqu/cq/226.html'] + \
['http://www.7-11bj.com.cn/?chengqu/cq/227.html'] + \
['http://www.7-11bj.com.cn/?chengqu/cq/228.html'] + \
['http://www.7-11bj.com.cn/?chengqu/cq/242.html'] + \
['http://www.7-11bj.com.cn/?chengqu/cq/243.html']
def parse(self, response):
for href in response.xpath('.//tr/th/a/@href'):
full_url = response.urljoin(href.extract())
yield scrapy.Request(full_url, callback=self.parse_store)
def parse_store(self, response):
yield {
'title': response.xpath('//div[@id="mainContentsBox"]/h4/text()').extract()[0],
'BMap.Point': response.xpath('//*[@id="mainContentsBox"]/script').re(r'BMap.Point\(([0-9.]+),([0-9.]+)\)'),
'link': response.url,
}
保存退出 CTRL + X ,提示是否保存按 y
運行爬蟲:
- scrapy runspider 711bj.py -o test711bj.csv
查看結(jié)果:
- cat ~/scrapy_spider/test711bj.csv
這當(dāng)然是非常簡單的一個爬蟲,推薦去看官方文檔,比如這個例子,你看懂這個例子后幾分鐘就能寫出自己的爬蟲,適用于大部分網(wǎng)站。官方文檔寫的非常完善,很多時候你搜索Scrapy的問題都會被鏈接到這里
另外推薦一個視頻,這是Eloy Zuniga Jr.一次講座的音頻修復(fù)版,時長約一個多小時,完全看懂的話,寫爬蟲基本就沒什么問題了
爬蟲可配合crontab定時爬取,比如每月爬一次7-11在北京的店鋪信息:
- crontab -e
首次編輯crontab,會被要求選擇編輯器,一般默認(rèn)(Nano)即可,在文件末加入:
- 0 0 1 * * env -i bash -c 'export WORKON_HOME=~/Envs && source /usr/local/bin/virtualenvwrapper.sh && source ~/Envs/scrapy/bin/activate && cd ~/scrapy_spider && scrapy runspider 711bj.py -o 711bj_$(date +%Y%m%d).csv && deactivate'
如果爬蟲被封,需要用IP代理或者加入Header