日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Python爬蟲Csdn系列II

Python爬蟲Csdn系列II

來源:程序員人生   發布時間:2015-04-30 08:20:23 閱讀次數:3113次

Python爬蟲Csdn系列II



By 白熊花田(http://blog.csdn.net/whiterbear) 轉載需注明出處,謝謝。


說明:

在上1篇文章中,我們已知道了只要將程序假裝成閱讀器就可以訪問csdn網頁。在這篇文章中,我們將想法獲得某個csdn用戶的所有文章的鏈接。

分析:

打開1個某1個的csdn用戶的的專欄,可以選擇目錄視圖(如:http://blog.csdn.net/whiterbear?viewmode=contents)和摘要視圖(比如:http://blog.csdn.net/whiterbear?viewmode=list)。兩個視圖都可以顯示用戶的文章列表。

注意:這里我們選擇摘要視圖,不要選擇目錄視圖,文章最后會解釋為何。

打開摘要視圖查看網頁源代碼,我們發現,在id為’article_list’的div中,每個子div都代表著1篇文章,如圖:



每個子div中都包括1篇文章的標題,鏈接,瀏覽次數,是不是為原創,評論數等信息,我們只需要取出標題和鏈接就夠了。如何取出不難,學過正則表達式應當都會。我們再使用個數組將界面中所有的文章名及其鏈接保存便可。

這里需要注意的是,如果博客有分頁怎樣辦,我們還需要獲得分頁的下1頁中的文章的鏈接?

我嘗試了兩種方法,第1種方法是設定1個article_list字典,字典成員為‘下1頁鏈接和是不是已被訪問標識鍵值對’,初始放入首頁鏈接,每處理1個界面時將該鏈接的值設為訪問,以后查找下1頁的鏈接,如果其不在字典里,就將其加入并設訪問標識為0。

比如初始字典為article_list={‘/pongba/article/list/1’:False},在處理/pongba/article/list/1這個界面時設值為True,此時又發現了/pongba/article/list/2和/pongba/article/list/3。此時,我們判斷字典(has_key())中是沒有這兩個鍵的,就加入,并設其值為False。以后遍歷(keys())字典,如果有值為0的鏈接,則訪問該鏈接,重復。

第2種方法:在分頁的html代碼中給出了分頁的頁數,我們提取出頁數pagenum,結合/pongba/article/list/num,num為頁數,值為[1,pagenum]。通過這個鏈接便可取出該作者的所有文章了。

我代碼中采取了第2種方法,第1種方法試了,也能夠。


代碼介紹:

CsdnArticle類(article.py),封裝成1篇文章必須的東西,便于保存和訪問1個文章的屬性。

我重寫了__str__()方法,便于輸入。

#-*- coding:utf⑻ -*- class CsdnArticle(object): def __init__(self): #作者 self.author = '' #博客文章名 self.title = '' #博客鏈接 self.href = '' #博客內容 self.body = '' #字符串化 def __str__(self): return self.author + ' ' + self.title + ' ' + self.href + ' ' + self.body

CsdnCrawler類。封裝了爬取csdn博客所有鏈接的操作。

#-*- coding:utf⑻ -*- import sys import urllib import urllib2 import re from bs4 import BeautifulSoup from article import CsdnArticle reload(sys) sys.setdefaultencoding('utf⑻') class CsdnCrawler(object): #默許訪問我的博客 def __init__(self, author = 'whiterbear'): self.author = author self.domain = 'http://blog.csdn.net/' self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'} #存儲文章對象數組 self.articles = [] #給定url,得到所有的文章lists def getArticleLists(self, url= None): req = urllib2.Request(url, headers=self.headers) response = urllib2.urlopen(req) soup = BeautifulSoup(''.join(response.read())) listitem = soup.find(id='article_list').find_all(attrs={'class':r'list_item article_item'}) #鏈接的正則表達式,可以匹配鏈接 href_regex = r'href="(.*?)"' for i,item in enumerate(listitem): enitem = item.find(attrs={'class':'link_title'}).contents[0].contents[0] href = re.search(href_regex,str(item.find(attrs={'class':'link_title'}).contents[0])).group(1) #我們將獲得的1篇文章信息封裝成1個對象,然后存入數組中 art = CsdnArticle() art.author = self.author art.title = enitem.lstrip() art.href = (self.domain + href[1:]).lstrip() self.articles.append(art) def getPageLists(self, url= None): url = 'http://blog.csdn.net/%s?viewmode=list'%self.author req = urllib2.Request(url, headers=self.headers) response = urllib2.urlopen(req) soup = BeautifulSoup(''.join(response.read())) num_regex = '[1⑼]d*' pagelist = soup.find(id='papelist') self.getArticleLists(url) #如果該作者博客多,有分頁的話 if pagelist: pagenum = int(re.findall(num_regex, pagelist.contents[1].contents[0])[1]) for i in range(2, pagenum + 1): self.getArticleLists(self.domain + self.author + '/article/list/%s'%i) def mytest(self): for i,url in enumerate(self.articles): print i,url def main(): #可以將pongba換成你的博客名,也能夠不填,為空,這樣默許是訪問我的博客 csdn = CsdnCrawler(author='pongba')#'pongba' csdn.getPageLists() csdn.mytest() if __name__ == '__main__': main()<span style="font-family:Verdana;font-size:18px;"> </span>

結果:



輸出了126條數據。

 

選擇摘要視圖的解釋:當某用戶文章多有分頁時,訪問目錄視圖界面中的下1頁鏈接時會跳轉到摘要視圖的下1頁鏈接中。我這么說你可能不太明白,舉個例子吧。

我使用劉未鵬學長(我崇拜的)的博客為例子吧,地址:http://blog.csdn.net/pongba。他的文章很多,有分頁。選擇他界面中的目錄視圖后,翻到分頁鏈接出。以下圖:

其中的分頁鏈接值為:



可以看出下1頁的鏈接為:http://blog.csdn.net +/pongba/article/list/2.

當我們在閱讀器輸入這個網址回車后是出現這個結果的:



可以看到第1篇文章為“斯托克代爾悖論與底線思考法”

但是,當我們使用程序打開的結果卻是:



而這個結果卻和摘要視圖的第2頁結果1樣:


所以,如果你試圖用程序使用http://blog.csdn.net/pongba/article/list/2這個鏈接訪問,得到的結果卻其實不是目錄視圖的結果。我沒能理解為何,糾結了好久程序為何出錯了,后來換成摘要視圖了。

 

未完待續。


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩高清免费观看 | 中文字幕国产在线 | 国产成人在线看 | 美女视频黄a| 久久久精品高清 | 天堂在线中文 | 91久久国产 | 国产日韩中文字幕 | 亚洲人成电影在线 | 粉嫩蜜桃麻豆免费大片 | 日韩一区二区三区四区 | 国产一区二区成人 | 在线观看免费黄视频 | 精品成人在线视频 | 精品一区二区三区日本 | 欧美成人手机在线 | 久久国产精品久久w女人spa | 亚洲精品国产第一综合99久久 | 久久se精品一区精品二区 | 久久一区精品 | 99只有精品 | 污网站在线播放 | 国产激情精品一区二区三区 | 国产成人亚洲综合 | 91.成人天堂一区 | 欧美精品三区 | 狠狠搞狠狠干 | 日本va欧美va欧美va精品 | 国产精品成人国产乱一区 | 麻豆视频在线观看免费网站黄 | cao在线| 国产一区二区高清 | 久久精品国产一区 | 欧美色图片一区二区 | 国产四区| 久久九九免费视频 | 亚洲高清在线 | 亚洲xxxx做受欧美 | 在线日韩视频 | 91精品国产综合久久久久久 | 免费在线观看黄网站 |