Python爬蟲小實踐:爬取任意CSDN博客全部文章的文字內容(或可改寫爲保存其餘的元素),間接增長博客訪問量

 

Python並非個人主業,當初學Python主要是爲了學爬蟲,覺得本身以爲可以從網上爬東西是一件很是神奇又是一件很是有用的事情,由於咱們能夠獲取一些方面的數據或者其餘的東西,反正各有用處。html

這兩天閒着沒事,主要是讓腦子放鬆一下就寫着爬蟲來玩,上一篇初略的使用BeautifulSoup去爬某個CSDN博客的基本統計信息(http://blog.csdn.net/hw140701/article/details/55048364),今天就想要不就直接根據某個CSDN博客的主頁的地址爬取該博客的全部文章連接,進而提取每一篇文章中的元素,我這裏是提取每一篇博客中的文字信息。python

1、主要思路正則表達式

經過分析CSDN博客的網站源碼,咱們發現當咱們輸入某博客主頁網址時,如:http://blog.csdn.net/hw140701瀏覽器

在主頁會有多篇文章,以及文章的連接,默認的是15篇。在主頁博客的底部會有分頁的連接,以下圖服務器

 

如圖所示,一共65篇分5頁,每一頁中又包含了15篇文章的連接。app

因此咱們整體的思路是:dom

1.輸入博客主頁地址,先獲取當前頁全部文章的連接;socket

2.獲取每一個分頁的連接地址函數

3.經過每一個分頁的連接地址獲取每個分頁上全部文章的連接地址工具

4.根據每一篇文章的連接地址,獲取每一篇文章的內容,直到該博客全部文章都爬取完畢

 

2、代碼分析

2.1分頁連接源碼分析

用瀏覽器打開網頁地址,使用開發者工具查看博客主頁網站源碼,發現分頁連接地址隱藏在下列標籤之中

 

因此咱們經過下列代碼全部分頁連接進行匹配

[python] view plain copy

1. bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/list)(/[0-9]+)*$")):#正則表達式匹配分頁的連接  

bsObj爲BeautifulSoup對象

 

2.2分頁上每一篇文章連接源碼分析

獲得每個分頁的連接後,對每個分頁上的文章連接源碼進行分析,其源碼以下

 

經過分析,因此咱們採起如下的方法進行匹配

[python] view plain copy

1. bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/details)(/[0-9]+)*$"))  


或者

[python] view plain copy

1. bsObj.findAll("span",{"class":"link_title"})  


2.3每一篇文章中文字內容源碼分析

經過對每一篇文章中的網站源碼進行分析,發現其內容位於源碼中的如下位置

 

因此經過下列代碼進行匹配

[python] view plain copy

1. bsObj.findAll("span",style=re.compile("font-size:([0-9]+)px"))  


3.所有代碼以及結果

現附上所有代碼,註釋部分可能有錯,能夠根據此代碼自行修改,去爬取某CSDN博客中的任意元素

 

[python] view plain copy

1. #__author__ = 'Administrat  

2. #coding=utf-8  

3. import io  

4. import os  

5. import sys  

6. import urllib  

7. from urllib.request import  urlopen  

8. from urllib  import request  

9. from bs4 import BeautifulSoup  

10. import datetime  

11. import random  

12. import re  

13. import requests  

14. import socket  

15. socket.setdefaulttimeout(5000)#設置全局超時函數  

16.   

17.   

18. sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')  

19. headers1={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}  

20. headers2={'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}  

21. headers3={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}  

22.   

23. #獲得CSDN博客某一個分頁的全部文章的連接  

24. articles=set()  

25. def getArticleLinks(pageUrl):  

26.     #設置代理IP  

27.     #代理IP能夠上http://zhimaruanjian.com/獲取  

28.     proxy_handler=urllib.request.ProxyHandler({'post':'210.136.17.78:8080'})  

29.     proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  

30.     opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  

31.     urllib.request.install_opener(opener)  

32.     #獲取網頁信息  

33.     req=request.Request(pageUrl,headers=headers1 or headers2 or headers3)  

34.     html=urlopen(req)  

35.     bsObj=BeautifulSoup(html.read(),"html.parser")  

36.     global articles  

37.     #return bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/details)(/[0-9]+)*$"))  

38.     #return bsObj.findAll("a")  

39.     #for articlelist in bsObj.findAll("span",{"class":"link_title"}):  

40.     for articlelist in bsObj.findAll("span",{"class":"link_title"}):#正則表達式匹配每一篇文章連接  

41.         #print(articlelist)  

42.         if 'href' in articlelist.a.attrs:  

43.             if articlelist.a.attrs["href"] not in articles:  

44.                 #遇到了新界面  

45.                 newArticle=articlelist.a.attrs["href"]  

46.                 #print(newArticle)  

47.                 articles.add(newArticle)  

48. #articlelinks=getArticleLinks("http://blog.csdn.net/hw140701")  

49. #for list in articlelinks:  

50.     #print(list.attrs["href"])  

51.     #print(list.a.attrs["href"])  

52.   

53. #寫入文本  

54. #def data_out(data):  

55.    # with open("E:/CSDN.txt","a+") as out:  

56.        # out.write('\n')  

57.        # out.write(data,)  

58.   

59.   

60. #獲得CSDN博客每一篇文章的文字內容  

61. def getArticleText(articleUrl):  

62.     #設置代理IP  

63.     #代理IP能夠上http://zhimaruanjian.com/獲取  

64.     proxy_handler=urllib.request.ProxyHandler({'https':'111.76.129.200:808'})  

65.     proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  

66.     opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  

67.     urllib.request.install_opener(opener)  

68.     #獲取網頁信息  

69.     req=request.Request(articleUrl,headers=headers1 or headers2 or headers3)  

70.     html=urlopen(req)  

71.     bsObj=BeautifulSoup(html.read(),"html.parser")  

72.     #獲取文章的文字內容  

73.     for textlist in bsObj.findAll("span",style=re.compile("font-size:([0-9]+)px")):#正則表達式匹配文字內容標籤  

74.         print(textlist.get_text())  

75.         #data_out(textlist.get_text())  

76.   

77. #獲得CSDN博客某個博客主頁上全部分頁的連接,根據分頁連接獲得每一篇文章的連接並爬取博客每篇文章的文字  

78. pages=set()  

79. def getPageLinks(bokezhuye):  

80.     #設置代理IP  

81.     #代理IP能夠上http://zhimaruanjian.com/獲取  

82.      proxy_handler=urllib.request.ProxyHandler({'post':'121.22.252.85:8000'})  

83.      proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  

84.      opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  

85.      urllib.request.install_opener(opener)  

86.     #獲取網頁信息  

87.      req=request.Request(bokezhuye,headers=headers1 or headers2 or headers3)  

88.      html=urlopen(req)  

89.      bsObj=BeautifulSoup(html.read(),"html.parser")  

90.      #獲取當前頁面(第一頁)的全部文章的連接  

91.      getArticleLinks(bokezhuye)  

92.      #去除重複的連接  

93.      global pages  

94.      for pagelist in bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/list)(/[0-9]+)*$")):#正則表達式匹配分頁的連接  

95.          if 'href' in pagelist.attrs:  

96.              if pagelist.attrs["href"] not in pages:  

97.                  #遇到了新的界面  

98.                  newPage=pagelist.attrs["href"]  

99.                  #print(newPage)  

100.                  pages.add(newPage)  

101.                  #獲取接下來的每個頁面上的每一篇文章的連接  

102.                  newPageLink="http://blog.csdn.net/"+newPage  

103.                  getArticleLinks(newPageLink)  

104.                  #爬取每一篇文章的文字內容  

105.                  for articlelist in articles:  

106.                      newarticlelist="http://blog.csdn.net/"+articlelist  

107.                      print(newarticlelist)  

108.                      getArticleText(newarticlelist)  

109. #getArticleLinks("http://blog.csdn.net/hw140701")  

110. getPageLinks("http://blog.csdn.net/hw140701")  

111. #getArticleText("http://blog.csdn.net/hw140701/article/details/55104018")  

 

 

 

 

 

結果

 

 

在其中有時候會出現亂碼,這是因爲有空格的存在,暫時還有找到方法解決。

另外在有的時候會出現服務器沒有響應的錯誤,以下:

 

相關文章
相關標籤/搜索