成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

amuqiao / 1753人閱讀

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

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

進(jìn)入正題

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

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

bashvim ~/python_spider/web/models.py

內(nèi)容如下:

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")?。!〖由线@個(gè)可以記住問題在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

都很直白,關(guān)于各個(gè)field可以看看 Django 的文檔。

然后,我需要告訴我的python_spider項(xiàng)目,在運(yùn)行的時(shí)候加載web這個(gè)app(項(xiàng)目不會(huì)自動(dòng)加載里面的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自動(dòng)生成數(shù)據(jù)庫schema了

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

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

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

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

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

3.2 入庫

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

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

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): # 采集當(dāng)前分頁
        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()
  

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

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

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

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

測試的時(shí)候方便看看進(jìn)度

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

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中斷運(yùn)行,測試一下就行:)
>>> 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 設(shè)置django.contrib.admin來查看和編輯內(nèi)容

為了更直觀的觀察我采集的數(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)建超級(jí)用戶

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

啟動(dòng)測試服務(wù)器

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

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

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

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37501.html

相關(guān)文章

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

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

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

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

    Codeing_ls 評(píng)論0 收藏0
  • [時(shí)隔20個(gè)月來填坑]Python爬蟲建站入門手記

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

    Lavender 評(píng)論0 收藏0
  • 從零開始nodejs系列文章

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

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

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

    mrli2016 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

amuqiao

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<