亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Using Django with GAE Python 后臺抓取多個網站的頁面全文

2020-01-04 17:45:26
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Using Django with GAE Python 后臺抓取多個網站的頁面全文,需要的朋友可以參考下
 

一直想做個能幫我過濾出優質文章和博客的平臺 給它取了個名 叫Moven。。 把實現它的過程分成了三個階段:
1. Downloader: 對于指定的url的下載 并把獲得的內容傳遞給Analyser--這是最簡單的開始
2. Analyser: 對于接受到的內容,用Regular Expression 或是 XPath 或是 BeautifulSoup/lxml 進行過濾和簡化--這部分也不是太難
3. Smart Crawler: 去抓取優質文章的鏈接--這部分是最難的:

Crawler的話可以在Scrapy Framework的基礎上快速的搭建
但是判斷一個鏈接下的文章是不是優質 需要一個很復雜的算法

最近就先從Downloader 和 Analyser 開始: 最近搭了一個l2z story 并且還有一個 Z Life 和 Z Life@Sina 還有一個她的博客 做為一個對Downloader 和 Analyser的練習 我就寫了這個東西來監聽以上四個站點 并且把它們的內容都同步到這個站上:

http://l2zstory.appspot.com

Using Django with GAE Python 后臺抓取多個網站的頁面全文

App 的特色
這個站上除了最上面的黑色導航條 和 最右邊的About This Site 部分外, 其他的內容都是從另外的站點上自動獲得
原則上, 可以添加任何博客或者網站地址到這個東西。。。當然因為這個是L2Z Story..所以只收錄了四個站點在里面
特點是: 只要站點的主人不停止更新, 這個東西就會一直存在下去---這就是懶人的力量


值得一提的是, Content 菜單是在客戶端用JavaScript 自動生成的--這樣就節約了服務器上的資源消耗

Using Django with GAE Python 后臺抓取多個網站的頁面全文

這里用的是html全頁面抓取 所以對那些feed沒有全文輸出的站點來說, 這個app 可以去把它要隱藏的文字抓來
在加載的時候會花很多時間因為程序會自動到一個沒有全文輸出的頁面上抓取所有的文章列表,作者信息,更新時間,以及文章全文。。所以打開的時候請耐心。。。下一步會加入數據存儲部分,這樣就會快了。。

技術準備
  
前端:

1. CSS 在信奉簡單之上的原則上 twitter的bootstrap.css滿足了我大多數的要求 個人超喜歡它的 Grid System
2. Javascript上, 當然選用了jQuery 自從我開始在我的第一個小項目上用了jQuery 后 我就愛上了它   那個動態的目錄系統就是用jQuery快速生成的
   為了配合bootstrap.css, bootstrap-dropdown.js 也用到了

服務器:

這個app有兩個版本:
     一個跑在我的Apache上, 但是因為我的網絡是ADSL, 所以ip一直會變基本上只是我在我的所謂的局域網內自測用的。。這個版本是純Django的
     另一個跑在Google App Engine上 地址是 http://l2zstory.appspot.com 在把Django 配置到GAE的時候我花了很多功夫才把框架搭起來

詳情請見: Using Django with Google App Engine GAE: l2Z Story Setup-Step 1           http://blog.sina.com.cn/s/blog_6266e57b01011mjk.html

后臺:

主要語言是Python--不解釋, 自從認識Python后就沒有離開它

主要用到的module是

1. BeautifulSoup.py 用于html 的解析--不解釋
2. feedparser.py 用于對feed xml的解析--網上有很多人說GAE不支持feedparser..這里你們得到答案了。??梢?。。這里我也是花了很久才弄明白到底是怎么回事。。總之簡單講就是: 可以用!但是feedparser.py這個文件必須放到跟app.yaml同一個目錄中 不然會出現網上眾人說的不可以import feedparser的情況

數據庫:
Google Datastore: 在下一步中, 這個程序會每隔30分鐘醒來 逐一查看各個站點有沒有更新并抓取更新后的文章并存入Google 的Datastore中

App 的配置

遵循Google的規則, 配置文件app.yaml 如下:
這里主要是定義了一些static directory--css 和 javascript的所在地

 

復制代碼代碼如下:

application: l2zstory 
version: 1
runtime: python
api_version: 1

 


handlers:
   
- url: /images
  static_dir: l2zstory/templates/template2/images
- url: /css
  static_dir: l2zstory/templates/template2/css
- url: /js
  static_dir: l2zstory/templates/template2/js  
- url: /js
  static_dir: l2zstory/templates/template2/js
- url: /.*
  script: main.py

 

URL的配置


這里采用的是Django 里的正則表達式

 

復制代碼代碼如下:

from django.conf.urls.defaults import *

 

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()


urlpatterns = patterns('',
    # Example:
    # (r'^l2zstory/', include('l2zstory.foo.urls')),


    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),


    # Uncomment the next line to enable the admin:
    # (r'^admin/(.*)', admin.site.root),
    (r'^$','l2zstory.stories.views.L2ZStory'),
    (r'^YukiLife/','l2zstory.stories.views.YukiLife'),
     (r'^ZLife_Sina/','l2zstory.stories.views.ZLife_Sina'),
     (r'^ZLife/','l2zstory.stories.views.ZLife')
)

 

Views的細節


對Django比較熟悉的人應該會從url的配置中看到view的名字了 我只把L2ZStory的這個view貼出來因為其他的在view里的架構至少是差不多的

復制代碼代碼如下:

#from BeautifulSoup import BeautifulSoup 
from PyUtils import getAboutPage
from PyUtils import getPostInfos

 

def L2ZStory(request):
    url="feed://l2zstory.wordpress.com/feed/"
    about_url="http://l2zstory.wordpress.com/about/"
    blog_type="wordpress"
    htmlpages={}
    aboutContent=getAboutPage(about_url,blog_type)
    if aboutContent=="Not Found":
        aboutContent="We use this to tell those past stories..."
    htmlpages['about']={}
    htmlpages['about']['content']=aboutContent
    htmlpages['about']['title']="About This Story"
    htmlpages['about']['url']=about_url
    PostInfos=getPostInfos(url,blog_type,order_desc=True)
    return render_to_response('l2zstory.html',
{'PostInfos':PostInfos,
'htmlpages':htmlpages
})

 

這里主要是構建一個dictionary of dictionary  htmlpages 和一個list of dictionary PostInfos
htmlpages 主要是存貯站點的 About, Contact US 之類的頁面
PostInfos 會存貯所有文章的 內容, 作者, 發布時間 之類的

這里面最重要的是PyUtils。。這是這個app的核心

PyUtils的細節

我把一些我認為比較重要的細節加深了 并加了評論

 

復制代碼代碼如下:

import feedparser 
import urllib2
import re
from BeautifulSoup import BeautifulSoup
header={
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:8.0.1) Gecko/20100101 Firefox/8.0.1',
}

 

#用來欺騙網站的后臺。。象新浪這類的網站對我們這類的app十分不友好。。。希望它們可以多象被墻掉的wordpress學一學。。

 

復制代碼代碼如下:

timeoutMsg="""
The Robot cannot connect to the desired page due to either of these reasons:
1. Great Fire Wall
2. The Blog Site has block connections made by Robots.
"""

 

def getPageContent(url,blog_type): 
    try:
        req=urllib2.Request(url,None,header)
        response=urllib2.urlopen(req)
        html=response.read()
        html=BeautifulSoup(html).prettify()
        soup=BeautifulSoup(html)
        Content=""
        if blog_type=="wordpress":
            try:
                for Sharesection in soup.findAll('div',{'class':'sharedaddy sd-like-enabled sd-sharing-enabled'}):
                    Sharesection.extract()
                for item in soup.findAll('div',{'class':'post-content'}):
                    Content+=unicode(item)
            except:
                Content="No Post Content Found"
        elif blog_type=="sina":
            try:
                for item in soup.findAll('div',{'class':'articalContent  '}):
                    Content+=unicode(item)
            except:
                Content="No Post Content Found"


        #對于不同的網站類型 應用不同的過濾器


    except:
        Content=timeoutMsg
    return removeStyle(Content)


def removeStyle(Content):
    #add this to remove all the img tag : (<img +(/w=/".*/")>)|(</img>)|(src=/".*/")|
    patn=re.compile(r"(align=/".*/")|(id=/".*/")|(class=/"*/")|(style=/".*/")|(</font>)|(<font.*/">)|(<embed +(/w*=/".*/")>)|(</embed>)")
    replacepatn=""


    Content=re.sub(patn,replacepatn,Content)
    #運用正則表達式把抓取的內容中那些格式通通去掉 這樣得到的文字比較純粹
    return Content
   
def getPostInfos(url,blog_type,order_desc=False):
    feeds=feedparser.parse(url)
    PostInfos=[]
    if order_desc:
        items=feeds.entries[::-1]
    else:
        items=feeds.entries
    Cnt=0
    for  item in items:
        PostInfo={}
        PostInfo['title']=item.title
        PostInfo['author']=item.author
        PostInfo['date']=item.date
        PostInfo['link']=item.link
       
        if blog_type=="wordpress":
            Cnt+=1
            if Cnt<=8:
                PostInfo['description']=getPageContent(item.link,blog_type)
            else:
                PostInfo['description']=removeStyle(item.description)
        elif blog_type=="sina":
            PostInfo['description']=removeStyle(item.description)
           
       
        PostInfos.append(PostInfo)
       
    return PostInfos

 

template 的概覽

在簡單之上的原則的鼓舞下, 所有的站點都統一使用一個template 這個template 只接受兩個變量--前文中提到的htmlpages 和 PostInfos
重要的片斷是:

復制代碼代碼如下:

<div class="page-header">
                              <a href="{{htmlpages.about.url}}" name="{{htmlpages.about.title}}"><h3>{{htmlpages.about.title}}</h3></a>
                             
                         </div>
                         <p>
                              {{htmlpages.about.content}}
                         </p>
                         {%for item in PostInfos%}
                         <div class="page-header">
                              <a href="{{item.link}}" name="{{item.title}}"><h3>{{item.title}}</h3></a>
                             
                         </div>
                         <p><i>author: {{item.author}}    date: {{item.date}}</i></p>
                         <p>{{item.description}}</p>
                         {%endfor%}
                    </div>

 

總結

一句話, 我愛死Python了
兩句話, 我愛死Python了,我愛死Django了
三句話, 我愛死Python了,我愛死Django了,我愛死jQuery了。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
狠狠操狠狠色综合网| 精品视频在线导航| 国产精品久久久久久久久久久新郎| 91久久国产综合久久91精品网站| 免费91麻豆精品国产自产在线观看| 欧美电影免费看| 992tv成人免费视频| 欧美亚洲日本黄色| 国产综合视频在线观看| 福利精品视频在线| 国产精品成人一区| 国产99视频在线观看| 亚洲a在线观看| 久久99国产精品自在自在app| 欧美福利视频在线观看| 欧美一区二区三区精品电影| 亚洲精品之草原avav久久| 久久伊人精品视频| 欧美一级黑人aaaaaaa做受| 国产美女精品免费电影| 91美女片黄在线观| 97久久精品视频| 91人人爽人人爽人人精88v| 91精品国产沙发| 日韩网站免费观看| 日韩欧美在线一区| 日韩一二三在线视频播| 国产精品流白浆视频| 亚洲自拍偷拍一区| 色综合久久久久久中文网| 亚洲天堂色网站| 日韩av一区二区在线| 国产男女猛烈无遮挡91| 国产精品亚洲综合天堂夜夜| 国产精品香蕉国产| 亚洲xxxx在线| 一区二区三区天堂av| 国产男女猛烈无遮挡91| 欧美国产欧美亚洲国产日韩mv天天看完整| 91精品视频在线免费观看| 全色精品综合影院| 亚洲欧美日韩中文在线制服| 久久6免费高清热精品| 美女久久久久久久| 亚洲变态欧美另类捆绑| 亚洲天堂一区二区三区| 日韩美女主播视频| 国语自产精品视频在线看一大j8| 欧美理论电影在线播放| 亚洲国产精品国自产拍av秋霞| 国产精品一久久香蕉国产线看观看| 久久人人爽人人爽人人片av高请| 4438全国成人免费| 国产一区二区三区三区在线观看| 国产主播在线一区| 一区二区中文字幕| 久久亚洲精品一区二区| 亚洲毛片在线观看.| 久久五月天色综合| 成人免费自拍视频| 欧美大尺度激情区在线播放| 欧美高清视频在线| 日韩在线播放一区| 欧美电影免费播放| 国产精品私拍pans大尺度在线| www.国产精品一二区| 日韩天堂在线视频| 欧美超级免费视 在线| 亚洲另类图片色| 日韩成人中文电影| 国产精品成人一区| 91在线中文字幕| 97色在线视频观看| 57pao成人国产永久免费| 美日韩丰满少妇在线观看| 中文字幕亚洲激情| 成人黄色影片在线| 国产精品xxxxx| 一区二区亚洲精品国产| 欧美韩国理论所午夜片917电影| 亚洲精品国精品久久99热| 亚洲自拍在线观看| 俺去了亚洲欧美日韩| 亚洲四色影视在线观看| 在线播放亚洲激情| 亚洲精品自在久久| 国产女人18毛片水18精品| 欧美精品午夜视频| 一区二区成人精品| 色午夜这里只有精品| 欧美激情女人20p| 午夜精品www| 亚洲国产精品va在线看黑人动漫| 国产成人中文字幕| 91香蕉国产在线观看| 韩国视频理论视频久久| 久久精品国产99国产精品澳门| 欧美电影电视剧在线观看| 欧美视频二区36p| 亚洲精品av在线播放| 欧美不卡视频一区发布| 日韩av在线免播放器| 国产suv精品一区二区三区88区| 精品久久久久久久久久久久久久| 久久久精品国产亚洲| 欧美日韩免费在线| 亚洲激情在线观看视频免费| 国产精品视频久久久| 欧美自拍大量在线观看| 亚洲国内精品在线| 亚洲精品久久久一区二区三区| 米奇精品一区二区三区在线观看| 久久久av免费| 操日韩av在线电影| 欧美日韩国产影院| 久久色精品视频| 日韩在线视频免费观看高清中文| 亚洲欧美日韩在线一区| 国产在线精品自拍| 亚洲精品在线看| 国产精品视频99| 亚洲高清久久久久久| 国产精品成人一区二区三区吃奶| 亚洲欧美激情另类校园| 精品国产成人在线| 亚洲欧美日韩国产成人| 午夜精品久久久久久99热| 欧美又大粗又爽又黄大片视频| 九九视频直播综合网| 米奇精品一区二区三区在线观看| 国产欧美日韩精品丝袜高跟鞋| 超碰日本道色综合久久综合| 精品magnet| 欧美激情三级免费| 国产精品久久久久高潮| 欧美日韩免费在线观看| 欧美精品精品精品精品免费| 久久久99久久精品女同性| 日韩av在线天堂网| 国产成人精品一区二区| 久久九九精品99国产精品| 久久香蕉国产线看观看av| 亚洲精品不卡在线| 欧美在线一区二区视频| 97在线免费观看视频| 亚洲国产精品久久久久秋霞不卡| 成人网欧美在线视频| 欧美乱人伦中文字幕在线| 日韩欧美在线第一页| 日韩一级黄色av| 欧美在线视频一二三| 另类专区欧美制服同性| 国产在线精品自拍| 午夜剧场成人观在线视频免费观看| 久久精品视频在线| 亚洲精品一区二区三区婷婷月| 亚洲国产小视频| 国产精品日韩欧美| 日韩精品在线免费播放| 国产精品三级久久久久久电影| 亚洲免费视频在线观看| 亚洲视频第一页| 最新国产精品亚洲| 欧美色视频日本高清在线观看|