天天看點

樹莓派 之 爬蟲(Scrapy)

跑爬蟲比較接近電影裡對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測試是否能抓取店名及位置(百度地圖坐标):

輸入:

  • 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