樹莓派 之 爬蟲(Scrapy)

跑爬蟲比較接近電影里對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)):

輸入:

  • 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容