国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python爬蟲建站入門手記——從零開始建立采集站點(三:采集入庫)

amuqiao / 1744人閱讀

摘要:進入正題第三部分,采集入庫。內容如下加上這個可以記住問題在的位置,方便以后更新或者其他操作都很直白,關于各個可以看看的文檔。代碼如下添加方法采集當前分頁正在抓取分頁這個地方寫得很笨,之前該在加上這個屬性。

上回,我已經(jīng)大概把爬蟲寫出來了。
我寫了一個內容爬蟲,一個爬取tag里面內容鏈接的爬蟲
其實還差一個,就是收集一共有哪些tag的爬蟲。但是這里先不說這個問題,因為我上次忘了 這次又不想弄。。
還有個原因:如果實際采集的話,直接用http://segmentfault.com/questions/newest?page=1這個鏈接 獲取所有問題,挨個爬就行。

進入正題

第三部分,采集入庫。 3.1 定義數(shù)據(jù)庫(or model or schema)

為了入庫,我需要在Django定義一個數(shù)據(jù)庫的結構。(不說nosql和mongodb(也是一個nosql但是很像關系型)的事)
還記得那個名叫web的app么,里面有個叫models.py的文件,我現(xiàn)在就來編輯它。

bashvim ~/python_spider/web/models.py

內容如下:

python# -*- coding: utf-8 -*-
from django.db import models

# Create your models here.


class Tag(models.Model):
    title = models.CharField(max_length=30)

    def __unicode__(self):
        return self.title


class Question(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()
    tags = models.ManyToManyField(Tag, related_name="questions")
    sf_id = models.CharField(max_length=16, default="0") # 加上這個可以記住問題在sf的位置,方便以后更新或者其他操作
    update_date = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.title


class Answer(models.Model):
    question = models.ForeignKey(Question, related_name="answers")
    content = models.TextField()

    def __unicode__(self):
        return "To question %s" % self.question.title

都很直白,關于各個field可以看看 Django 的文檔。

然后,我需要告訴我的python_spider項目,在運行的時候加載web這個app(項目不會自動加載里面的app)。

bashvim ~/python_spider/python_spider/settings.py

在INSTALLED_APPS里面加入web:

pythonINSTALLED_APPS = (
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "web",
)

下面,就可以用django自動生成數(shù)據(jù)庫schema了

bashcd ~/python_spider
python manage.py makemigrations
python manage.py migrate

現(xiàn)在,我~/python_spider目錄就產(chǎn)生了一個db.sqlite3文件,這是我的數(shù)據(jù)庫。
把玩一番我的模型

python>>> from web.models import Answer, Question, Tag
>>> tag = Tag()
>>> tag.title = u"測試標簽"
>>> tag.save()
>>> tag

>>> question = Question(title=u"測試提問", content=u"提問內容")
>>> question.save()
>>> question.tags.add(tag)
>>> question.save()
>>> answer = Answer(content=u"回答內容", question=question)
>>> answer.save()
>>> tag.questions.all() # 根據(jù)tag找question
[]
>>> question.tags.all() # 獲取question的tags
[]
>>> question.answers.all() # 獲取問題的答案
[]

以上操作結果正常,說明定義的models是可用的。

3.2 入庫

接下來,我需要把采集的信息入庫,說白了,就是把我自己蜘蛛的信息利用django的ORM存到django連接的數(shù)據(jù)庫里面,方便以后再用Django讀取用于做站。

入庫的方法太多了,這里隨便寫一種,就是在web app里面建立一個spider.py, 里面定義兩個蜘蛛,繼承之前自己寫的蜘蛛,再添加入庫方法。

bashvim ~/python_spider/web/spider.py

代碼如下:

python# -*- coding: utf-8 -*-
from sfspider import spider
from web.models import Answer, Question, Tag


class ContentSpider(spider.SegmentfaultQuestionSpider):

    def save(self): # 添加save()方法
        sf_id = self.url.split("/")[-1] # 1
        tags = [Tag.objects.get_or_create(title=tag_title)[0] for tag_title in self.tags] # 2
        question, created = Question.objects.get_or_create(
            sf_id=sf_id,
            defaults={"title":self.title, "content":self.content}
        ) # 3
        question.tags.add(*tags) # 4
        question.save()
        for answer in self.answers:
            Answer.objects.get_or_create(content=answer, question=question)
        return question, created


class TagSpider(spider.SegmentfaultTagSpider):

    def crawl(self): # 采集當前分頁
        sf_ids = [url.split("/")[-1] for url in self.questions]
        for sf_id in sf_ids:
            question, created = ContentSpider(sf_id).save()

    def crawl_all_pages(self):
        while True:
            print u"正在抓取TAG:%s, 分頁:%s" % (self.tag_name, self.page) # 5
            self.crawl()
            if not self.has_next_page:
                break
            else:
                self.next_page()
  

這個地方寫得很笨,之前該在SegmentfaultQuestionSpider加上這個屬性。

創(chuàng)建或者獲取該提問的tags

創(chuàng)建或者獲取提問,采用sf_id來避免重復

把tags都添加到提問,這里用*是因為這個方法原本的參數(shù)是(tag1, tag2, tag3)。但是我們的tags是個列表

測試的時候方便看看進度

然后,測試下我們的入庫腳本

bashpython manage.py shell
python>>> from web.spider import TagSpider
>>> t = TagSpider(u"微信")
>>> t.crawl_all_pages()
正在抓取TAG:微信, 分頁:1
正在抓取TAG:微信, 分頁:2
正在抓取TAG:微信, 分頁:3
KeyboardInterrupt # 用control-c中斷運行,測試一下就行:)
>>> from web.models import Tag, Question
>>> Question.objects.all()
[, , , , , , , , , , , , , , , , , , , , "...(remaining elements truncated)..."]
>>> Question.objects.get(pk=5).tags.all() # 數(shù)據(jù)庫中id=5的question的tags
[, , , ]
3.3 設置django.contrib.admin來查看和編輯內容

為了更直觀的觀察我采集的數(shù)據(jù),我可以利用django自帶的admin
編輯文件

bashvim ~/python_spider/web/admin.py
pythonfrom django.contrib import admin
from web.models import Tag, Question, Answer

admin.site.register(Tag)
admin.site.register(Question)
admin.site.register(Answer)

然后創(chuàng)建超級用戶

bashpython manage.py createsuperuser # 根據(jù)提示創(chuàng)建

啟動測試服務器

bashpython manage.py runserver 0.0.0.0:80 # 我這是在runabove上,本地直接manage.py runserver

然后,我訪問http://192.99.71.91/admin/登錄剛剛創(chuàng)建的賬號,就能對內容進行查看和編輯了

OK, 今天的內容到此,
下一篇,是編寫django的view,套用簡單的模板來建站。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37501.html

相關文章

  • Python爬蟲建站入門手記——從零開始建立采集站點(一:環(huán)境搭建)

    摘要:從今天起,我將在這里更新一個系列的簡單爬蟲到建立網(wǎng)站的實踐手記。內容將會從最簡單的開始,環(huán)境搭建,基本爬蟲,入庫,用建立可供用戶訪問的網(wǎng)站,網(wǎng)站部署。第一部分,買,裝環(huán)境。我們爬蟲站點的所有文件都放在里面。 從今天起,我將在這里更新一個系列的python簡單爬蟲到建立網(wǎng)站的實踐手記。 內容將會從最簡單的開始,環(huán)境搭建,基本爬蟲,入庫,用Django建立可供用戶訪問的網(wǎng)站,網(wǎng)站部署。 ...

    HackerShell 評論0 收藏0
  • Python爬蟲建站入門手記——從零開始建立采集站點(二:編寫爬蟲

    摘要:接上回第二部分,編寫爬蟲。進入微信嵌套選擇圖片和上傳圖片接口,實現(xiàn)一鍵上傳圖片,遇到問題看吧,我現(xiàn)在已經(jīng)可以通過爬蟲獲取的提問標題了。微信故意省略想做小偷站的,看到這里基本上就能搞出來了。下一篇,采集入庫 上回,我裝了環(huán)境 也就是一對亂七八糟的東西 裝了pip,用pip裝了virtualenv,建立了一個virtualenv,在這個virtualenv里面,裝了Django,創(chuàng)建了一個...

    Codeing_ls 評論0 收藏0
  • [時隔20個月來填坑]Python爬蟲建站入門手記

    摘要:大概個月前已新手的身份寫了幾篇入門的文章爬蟲建站入門手記從零開始建立采集站點結果弄到一半就棄坑了。前兩次的視頻存檔編寫爬蟲入庫由于很久沒有寫這些東西了,視頻里面有一半的時間在和上找資料。。。下面是建立的一個微信群的二維碼 大概20個月前已新手的身份寫了幾篇入門的文章:Python爬蟲建站入門手記——從零開始建立采集站點 結果弄到一半就棄坑了。 該填的坑是要填的,于是我最近開始在 liv...

    Lavender 評論0 收藏0
  • 從零開始nodejs系列文章

    摘要:從零開始系列文章,將介紹如何利做為服務端腳本,通過框架開發(fā)。框架是基于的引擎,是目前速度最快的引擎。瀏覽器就基于,同時打開個網(wǎng)頁都很流暢。標準的開發(fā)框架,可以幫助我們迅速建立站點,比起的開發(fā)效率更高,而且學習曲線更低。 從零開始nodejs系列文章,將介紹如何利Javascript做為服務端腳本,通過Nodejs框架web開發(fā)。Nodejs框架是基于V8的引擎,是目前速度最快的Java...

    rickchen 評論0 收藏0
  • 小程序開發(fā)(一):使用scrapy爬蟲采集數(shù)據(jù)

    摘要:用途廣泛,可以用于數(shù)據(jù)挖掘監(jiān)測和自動化測試。運行下,發(fā)現(xiàn)數(shù)據(jù)全部存到了數(shù)據(jù)庫中。提供了一些接口來查看項目爬蟲情況,以及執(zhí)行或者停止執(zhí)行爬蟲。完成小程序所需要的所有接口的開發(fā),以及使用定時任務執(zhí)行爬蟲腳本。 過完年回來,業(yè)余時間一直在獨立開發(fā)一個小程序。主要數(shù)據(jù)是8000+個視頻和10000+篇文章,并且數(shù)據(jù)會每天自動更新。 我會整理下整個開發(fā)過程中遇到的問題和一些細節(jié)問題,因為內容會比...

    mrli2016 評論0 收藏0

發(fā)表評論

0條評論

amuqiao

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<