最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python采集騰訊新聞實例

 更新時間:2014年07月10日 11:41:14   投稿:junjie  
這篇文章主要介紹了Python采集騰訊新聞實例,一個簡單的例子,著重于實現(xiàn)步驟的講解,需要的朋友可以參考下

目標(biāo)是把騰訊新聞主頁上所有新聞爬取下來,獲得每一篇新聞的名稱、時間、來源以及正文。

接下來分解目標(biāo),一步一步地做。

步驟1:將主頁上所有鏈接爬取出來,寫到文件里。

python在獲取html方面十分方便,寥寥數(shù)行代碼就可以實現(xiàn)我們需要的功能。

復(fù)制代碼 代碼如下:
def getHtml(url):
     page = urllib.urlopen(url)
     html = page.read()
     page.close()
     return html

我們都知道html鏈接的標(biāo)簽是“a”,鏈接的屬性是“href”,也就是要獲得html中所有tag=a,attrs=href 值。

查閱了資料,一開始我打算用HTMLParser,而且也寫出來了。但是它有一個問題,就是遇到中文字符的時候無法處理。

復(fù)制代碼 代碼如下:

 class parser(HTMLParser.HTMLParser):
     def handle_starttag(self, tag, attrs):
             if tag == 'a':
             for attr, value in attrs:
                 if attr == 'href':
                     print value

后來使用了SGMLParser,它就沒有這個問題。
復(fù)制代碼 代碼如下:

class URLParser(SGMLParser):      
        def reset(self):
                SGMLParser.reset(self)
                self.urls = []
 
        def start_a(self,attrs):       
                href = [v for k,v in attrs if k=='href']         
                if href:
                        self.urls.extend(href)

SGMLParser針對某個標(biāo)簽都需要重載它的函數(shù),這里是把所有的鏈接放到該類的urls里。

復(fù)制代碼 代碼如下:

lParser = URLParser()#分析器來的
socket = urllib.urlopen("http://news.qq.com/")#打開這個網(wǎng)頁

fout = file('urls.txt', 'w')#要把鏈接寫到這個文件里
lParser.feed(socket.read())#分析啦

reg = 'http://news.qq.com/a/.*'#這個是用來匹配符合條件的鏈接,使用正則表達(dá)式匹配
pattern = re.compile(reg)

for url in lParser.urls:#鏈接都存在urls里
    if pattern.match(url):
        fout.write(url+'\n')

fout.close()

這樣子就把所有符合條件的鏈接都保存到urls.txt文件里了。

步驟2:對于每一個鏈接,獲取它的網(wǎng)頁內(nèi)容。

很簡單,只需要打開urls.txt文件,一行一行地讀出來就可以了。

也許這里會顯得多此一舉,但是基于我對解耦的強烈愿望,我還是果斷地寫到文件里了。后面如果采用面向?qū)ο缶幊蹋貥?gòu)起來是十分方便的。

獲取網(wǎng)頁內(nèi)容部分也是相對簡單的,但是需要把網(wǎng)頁的內(nèi)容都保存到一個文件夾里。

這里有幾個新的用法:

復(fù)制代碼 代碼如下:

os.getcwd()#獲得當(dāng)前文件夾路徑
os.path.sep#當(dāng)前系統(tǒng)路徑分隔符(是這個叫法嗎?)windows下是“\”,linux下是“/”

#判斷文件夾是否存在,如果不存在則新建一個文件夾
if os.path.exists('newsdir') == False:
    os.makedirs('newsdir')

#str()用來將某個數(shù)字轉(zhuǎn)為字符串
i = 5
str(i)

有了這些方法,將字符串保存到某個文件夾下不同的文件就不再是一件困難的事了。

步驟3:枚舉每一個網(wǎng)頁,根據(jù)正則匹配獲得目標(biāo)數(shù)據(jù)。

下面的方法是用來遍歷文件夾的。

復(fù)制代碼 代碼如下:

 #這個是用來遍歷某個文件夾的
 for parent, dirnames, filenames in os.walk(dir):
     for dirname in dirnames
         print parent, dirname
     for filename in filenames:
         print parent, filename

遍歷,讀取,匹配,結(jié)果就出來了。

我使用的數(shù)據(jù)提取的正則表達(dá)式是這樣的:

復(fù)制代碼 代碼如下:

reg = '<div class="hd">.*?<h1>(.*?)</h1>.*?<span class="pubTime">(.*?)</span>.*?<a .*?>(.*?)</a>.*?<div id="Cnt-Main-Article-QQ" .*?>(.*?)</div>'

其實這個并不能匹配到騰訊網(wǎng)的所有新聞,因為上面的新聞有兩種格式,標(biāo)簽有一點差別,所以只能提取出一種。

另外一點就是通過正則表達(dá)式的提取肯定不是主流的提取方法,如果需要采集其他網(wǎng)站,就需要變更正則表達(dá)式,這可是一件比較麻煩的事情。

提取之后觀察可知,正文部分總是會參雜一些無關(guān)信息,比如“<script>...</script>”“<p></p>”等等。所以我再通過正則表達(dá)式將正文切片。

復(fù)制代碼 代碼如下:

def func(str):#誰起的這個名字
    strs = re.split("<style>.*?</style>|<script.*?>.*?</script>|&#[0-9]+;|<!--\[if !IE\]>.+?<!\[endif\]-->|<.*?>", str)#各種匹配,通過“|”分隔
    ans = ''
    #將切分的結(jié)果組合起來
    for each in strs:
        ans += each
    return ans

這樣騰訊網(wǎng)上面的正文基本全部能夠提取出來。

到此整個采集也就結(jié)束了。

展示一下我提取到的結(jié)果(不使用自動換行,右邊隱藏了):

注意:

1、打開某個網(wǎng)址的時候,如果網(wǎng)址是壞的(打不開),若不處理則會報錯。我簡單地使用處理異常的方式,估計應(yīng)該有其他方式。

復(fù)制代碼 代碼如下:

try:
    socket = urllib.urlopen(url)
except:
    continue

2、Python正則表達(dá)式中的“.”號,可以匹配任意字符,但是除了“\n”。

3、如何去除字符串末尾的“\n”?python的處理簡直優(yōu)雅到死?。?/p>

復(fù)制代碼 代碼如下:
if line[-1] == '\n':
    line = line[0:-1]

相關(guān)文章

  • python字典的setdefault的巧妙用法

    python字典的setdefault的巧妙用法

    這篇文章主要介紹了python字典的setdefault的巧妙用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python中裝飾器的基本功能理解

    Python中裝飾器的基本功能理解

    裝飾器本質(zhì)上是一個Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能,下面這篇文章主要給大家介紹了關(guān)于Python中裝飾器的基本功能,需要的朋友可以參考下
    2021-10-10
  • python 通過 socket 發(fā)送文件的實例代碼

    python 通過 socket 發(fā)送文件的實例代碼

    這篇文章主要介紹了python 通過 socket 發(fā)送文件的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • 基于Python的數(shù)據(jù)分析與可視化

    基于Python的數(shù)據(jù)分析與可視化

    在當(dāng)今數(shù)字化時代,數(shù)據(jù)分析和可視化已經(jīng)成為了企業(yè)和個人必備的技能,Python 作為一種高級編程語言,具有易學(xué)易用、高效快捷的特點,在數(shù)據(jù)科學(xué)領(lǐng)域中得到了廣泛應(yīng)用,本篇文章將介紹基于 Python 的數(shù)據(jù)分析與可視化
    2023-07-07
  • 對python插入數(shù)據(jù)庫和生成插入sql的示例講解

    對python插入數(shù)據(jù)庫和生成插入sql的示例講解

    今天小編就為大家分享一篇對python插入數(shù)據(jù)庫和生成插入sql的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python命令行解析模塊詳解

    Python命令行解析模塊詳解

    這篇文章主要介紹了Python命令行解析模塊詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • python調(diào)用api實例講解

    python調(diào)用api實例講解

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python調(diào)用api實例講解內(nèi)容,有興趣的朋友們可以參考下。
    2021-04-04
  • python創(chuàng)建臨時文件夾的方法

    python創(chuàng)建臨時文件夾的方法

    這篇文章主要介紹了python創(chuàng)建臨時文件夾的方法,涉及Python基于tempfile模塊創(chuàng)建臨時文件夾的實現(xiàn)方法,需要的朋友可以參考下
    2015-07-07
  • python進(jìn)程的狀態(tài)、創(chuàng)建及使用方法詳解

    python進(jìn)程的狀態(tài)、創(chuàng)建及使用方法詳解

    這篇文章主要介紹了python進(jìn)程的狀態(tài)、創(chuàng)建及使用方法,結(jié)合實例形式詳細(xì)分析了Python進(jìn)程的概念、原理、工作狀態(tài)、創(chuàng)建以及使用方法,需要的朋友可以參考下
    2019-12-12
  • Django項目如何正確配置日志(logging)

    Django項目如何正確配置日志(logging)

    本文將教你如何在Django項目中正確配置日志(logging),讓Django生成log日志文件,并在程序運行發(fā)生error級別故障時通知管理員。
    2021-04-04

最新評論

楚雄市| 汝阳县| 商水县| 哈巴河县| 修武县| 团风县| 徐水县| 原平市| 奎屯市| 丘北县| 宁远县| 仙游县| 新巴尔虎左旗| 武宣县| 茌平县| 安康市| 卫辉市| 大同县| 从化市| 浏阳市| 景德镇市| 隆昌县| 梓潼县| 嘉禾县| 阿勒泰市| 中西区| 浏阳市| 天台县| 连江县| 乌拉特后旗| 隆安县| 沂源县| 泰宁县| 吉木萨尔县| 马关县| 响水县| 新源县| 兴国县| 通道| 安陆市| 南康市|