Python爬蟲建站入門手記——從零開始創建採集站點(二:編寫爬蟲)

上回,我裝了環境
也就是一對亂七八糟的東西
裝了pip,用pip裝了virtualenv,創建了一個virtualenv,在這個virtualenv裏面,裝了Django,建立了一個Django項目,在這個Django項目裏面建立了一個叫作web的阿皮皮。javascript

接上回~css

第二部分,編寫爬蟲。

工欲善其事,必先利其器。html

bashapt-get install vim # 接上回,咱們在screen裏面是root身份哦~

固然了,如今我要想一個採集的目標,爲了方便,我就選擇segmentfault吧,這網站寫博客不錯,就是在海外上傳圖片有點慢。java

這個爬蟲,就像我訪問同樣,要分步驟來。 我先看到segmentfault首頁,而後發現裏面有不少tags,每一個tags下面,纔是一個一個的問題的內容。python

因此,爬蟲也要分爲這幾個步驟來寫。 可是我要反着寫,先寫內容爬蟲,再寫分類爬蟲, 由於我想。jquery

2.1 編寫內容爬蟲

首先,給爬蟲創建個目錄,在項目裏面和app同級,而後把這個目錄變成一個python的packageweb

bashmkdir ~/python_spider/sfspider
touch ~/python_spider/sfspider/__init__.py

之後,這個目錄就叫爬蟲包了shell

在爬蟲包裏面創建一個spider.py用來裝個人爬蟲們vim

bashvim ~/python_spider/sfspider/spider.py

一個基本的爬蟲,只須要下面幾行代碼:
基本爬蟲代碼
(代碼下面會提供)
而後呢,就能夠玩玩咱們的「爬蟲」了。
進入python shellsegmentfault

python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> s.url
>>> 'http://segmentfault.com/q/1010000002542775'
>>> print s.dom('h1#questionTitle').text()
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實現一鍵上傳圖片,遇到問題

看吧,我如今已經能夠經過爬蟲獲取segmentfault的提問標題了。下一步,爲了簡化代碼,我把標題,回答等等的屬性都寫爲這個蜘蛛的屬性。代碼以下

python# -*- coding: utf-8 -*-
import requests # requests做爲咱們的html客戶端
from pyquery import PyQuery as Pq # pyquery來操做dom


class SegmentfaultQuestionSpider(object):

    def __init__(self, segmentfault_id): # 參數爲在segmentfault上的id
        self.url = 'http://segmentfault.com/q/{0}'.format(segmentfault_id)
        self._dom = None # 弄個這個來緩存獲取到的html內容,一個蜘蛛應該之訪問一次

    @property
    def dom(self): # 獲取html內容
        if not self._dom:
            document = requests.get(self.url)
            document.encoding = 'utf-8'
            self._dom = Pq(document.text)
        return self._dom

    @property 
    def title(self): # 讓方法能夠經過s.title的方式訪問 能夠少打對括號
        return self.dom('h1#questionTitle').text() # 關於選擇器能夠參考css selector或者jquery selector, 它們在pyquery下幾乎均可以使用

    @property
    def content(self):
        return self.dom('.question.fmt').html() # 直接獲取html 膽子就是大 之後再來過濾

    @property
    def answers(self):
        return list(answer.html() for answer in self.dom('.answer.fmt').items()) # 記住,Pq實例的items方法是頗有用的

    @property
    def tags(self):
        return self.dom('ul.taglist--inline > li').text().split() # 獲取tags,這裏直接用text方法,再切分就好了。通常只要是文字內容,並且文字內容本身沒有空格,逗號等,均可以這樣弄,省事。

而後,再把玩一下升級後的蜘蛛。

python>>> from sfspider import spider
>>> s = spider.SegmentfaultQuestionSpider('1010000002542775')
>>> print s.title
>>> 微信JS—SDK嵌套選擇圖片和上傳圖片接口,實現一鍵上傳圖片,遇到問題
>>> print s.content
>>> # [故意省略] #
>>> for answer in s.answers
        print answer
>>> # [故意省略] #
>>> print '/'.join(s.tags)
>>> 微信js-sdk/python/微信開發/javascript

OK,如今個人蜘蛛玩起來更方便了。

2.2 編寫分類爬蟲

下面,我要寫一個抓取標籤頁面的問題的爬蟲。
代碼以下, 注意下面的代碼是添加在已有代碼下面的, 和以前的最後一行之間 要有兩個空行

pythonclass SegmentfaultTagSpider(object):

    def __init__(self, tag_name, page=1):
        self.url = 'http://segmentfault.com/t/%s?type=newest&page=%s' % (tag_name, page)
        self.tag_name = tag_name
        self.page = page
        self._dom = None

    @property
    def dom(self):
        if not self._dom:
            document = requests.get(self.url)
            document.encoding = 'utf-8'
            self._dom = Pq(document.text)
            self._dom.make_links_absolute(base_url="http://segmentfault.com/") # 相對連接變成絕對連接 爽
        return self._dom


    @property
    def questions(self):
        return [question.attr('href') for question in self.dom('h2.title > a').items()]

    @property
    def has_next_page(self): # 看看還有沒有下一頁,這個有必要
        return bool(self.dom('ul.pagination > li.next')) # 看看有木有下一頁

    def next_page(self): # 把這個蜘蛛殺了, 產生一個新的蜘蛛 抓取下一頁。 因爲這個原本就是個動詞,因此就不加@property了
        if self.has_next_page:
            self.__init__(tag_name=self.tag_name ,page=self.page+1)
        else:
            return None

如今能夠兩個蜘蛛一塊兒把玩了,就不貼出詳細把玩過程了。。。

python>>> from sfspider import spider
>>> s = spider.SegmentfaultTagSpider('微信')
>>> question1 = s.questions[0]
>>> question_spider = spider.SegmentfaultQuestionSpider(question1.split('/')[-1])
>>> # [故意省略] #

想作小偷站的,看到這裏基本上就能搞出來了。 套個模板 加一個簡單的腳原本接受和返回請求就好了。

未完待續。
下一篇,採集入庫!

相關文章
相關標籤/搜索