跑爬蟲比較接近電影裡對Hacker印象,輸入幾行代碼,程式就可以運作很久
剛好樹莓派已經預裝了Python2,可以在樹莓派上體驗一下,另外爬蟲确實很實用,可以高效搜集很多資訊,比複制粘貼強了很多
而且Scrapy門檻很低,幾個小時就能上手,得到你想要的資料
安裝:
- 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
建立名為scrapy的virtualenv
- mkvirtualenv scrapy
配置完之後會終端行首會顯示(scrapy)$,說明處于名為scrapy的virtualenv
- ls $WORKON_HOME
使workon在重新開機後依然有效:
- sudo nano ~/.bashrc
添加以下内容至末尾:
- export WORKON_HOME=$HOME/Envssource /usr/local/bin/virtualenvwrapper.sh
- source ~/.bashrc
virtualenv内安裝scrapy:
- (scrapy)$ sudo pip install scrapy
進入名為scrapy的virtualenv:
- workon scrapy
退出virtualenv:
- deactivate
簡單爬蟲示例:
單個的爬蟲檔案最關鍵是start_urls,以及傳回的内容
比如你想抓取北京所有的7-11門店名稱及位置
先登入官網
店鋪資訊頁面,一共在8個區有店,滑鼠懸停觀察每個區的url,這樣start_urls就确定了
需要先擷取每個門店的url,用Chrome浏覽器右鍵審查門店連結,彈出視窗内右擊相應代碼位置 Copy > Copy XPath
得到: ...tr[1]/th/a
是以url表達式為:
- response.xpath('.//tr/th/a/@href')
補全即可得到完整url:
- response.urljoin(href.extract())
然後進入單個門店url檢視想擷取資訊的XPath
門店名稱為:
- //*[@id="mainContentsBox"]/h4
門店位置(百度地圖坐标)在js代碼内:
- //*[@id="mainContentsBox"]/script
用Shell測試是否能抓取店名及位置(百度地圖坐标):
- scrapy shell http://www.7-11bj.com.cn/?post/cq/223/id/270.html --nolog
輸入:
- response.xpath('//div[@id="mainContentsBox"]/h4/text()').extract()[0]
能夠傳回店名
百度地圖坐标藏在js代碼内,需用
正則表達提取
- response.xpath('//*[@id="mainContentsBox"]/script').re(r'BMap.Point(([0-9.]+),([0-9.]+))')
能夠傳回位置(百度地圖坐标),7-11北京官網的一部分坐标似乎本身有問題,并不是爬蟲的關系,直接去url内檢視源碼也是一樣的結果
建立單個爬蟲:
- cd ~/scrapy_spider
- 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
檢視結果:
- cat ~/scrapy_spider/test711bj.csv
這當然是非常簡單的一個爬蟲,推薦去看
官方文檔,比如這個
例子,你看懂這個例子後幾分鐘就能寫出自己的爬蟲,适用于大部分網站。官方文檔寫的非常完善,很多時候你搜尋Scrapy的問題都會被連結到這裡
另外推薦一個
視訊,這是
Eloy Zuniga Jr.一次講座的音頻修複版,時長約一個多小時,完全看懂的話,寫爬蟲基本就沒什麼問題了
爬蟲可配合crontab定時爬取,比如每月爬一次7-11在北京的店鋪資訊:
- crontab -e
首次編輯crontab,會被要求選擇編輯器,一般預設(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