Python爬蟲小實踐:爬取任意CSDN部落格所有文章的文字內容(或可改寫為儲存其他的元素),間接增加部落格訪問量

來源:互聯網
上載者:User

標籤:class   程式碼分析   位置   實踐   https   網站源碼   add   錯誤   存在   

 

 

Python並不是我的主業,當初學Python主要是為了學爬蟲,以為自己覺得能夠從網上爬東西是一件非常神奇又是一件非常有用的事情,因為我們可以擷取一些方面的資料或者其他的東西,反正各有用處。

 

這兩天閑著沒事,主要是讓腦子放鬆一下就寫著爬蟲來玩,上一篇初略的使用BeautifulSoup去爬某個CSDN部落格的基本統計資訊(http://blog.csdn.net/hw140701/article/details/55048364),今天就想要不就直接根據某個CSDN部落格的首頁的地址爬取該部落格的所有文章連結,進而提取每一篇文章中的元素,我這裡是提取每一篇部落格

 

一、主要思路

通過分析CSDN部落格的網站源碼,我們發現當我們輸入某部落客頁網址時,如:http://blog.csdn.net/hw140701

在首頁會有多篇文章,以及文章的連結,預設的是15篇。在首頁部落格的底部會有分頁的連結,如

 

,一共65篇分5頁,每一頁中又包含了15篇文章的連結。

所以我們總體的思路是:

1.輸入部落客頁地址,先擷取當前頁所有文章的連結;

2.擷取每個分頁的連結地址

3.通過每個分頁的連結地址擷取每一個分頁上所有文章的連結地址

4.根據每一篇文章的連結地址,擷取每一篇文章的內容,直到該部落格所有文章都爬取完畢

 

二、程式碼分析

2.1分頁連結源碼分析

用瀏覽器開啟網頁地址,使用開發人員工具查看部落客頁網站源碼,發現分頁連結地址隱藏在下欄標籤之中

 

所以我們通過下列代碼所有分頁連結進行匹配

[python] view plain copy

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

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. sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=‘gb18030‘)  
  17. headers1={‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0‘}  
  18. 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‘}  
  19. headers3={‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11‘}  
  20. #得到CSDN部落格某一個分頁的所有文章的連結  
  21. articles=set()  
  22. def getArticleLinks(pageUrl):  
  23. #設定代理IP  
  24. #代理IP可以上http://zhimaruanjian.com/擷取  
  25. proxy_handler=urllib.request.ProxyHandler({‘post‘:‘210.136.17.78:8080‘})  
  26. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  
  27. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  
  28. urllib.request.install_opener(opener)  
  29. #擷取網頁資訊  
  30. req=request.Request(pageUrl,headers=headers1 or headers2 or headers3)  
  31. html=urlopen(req)  
  32. bsObj=BeautifulSoup(html.read(),"html.parser")  
  33. global articles  
  34. #return bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/details)(/[0-9]+)*$"))  
  35. #return bsObj.findAll("a")  
  36. #for articlelist in bsObj.findAll("span",{"class":"link_title"}):  
  37. for articlelist in bsObj.findAll("span",{"class":"link_title"}):#Regex匹配每一篇文章連結  
  38. #print(articlelist)  
  39. if ‘href‘ in articlelist.a.attrs:  
  40. if articlelist.a.attrs["href"] not in articles:  
  41. #遇到了新介面  
  42. newArticle=articlelist.a.attrs["href"]  
  43. #print(newArticle)  
  44. articles.add(newArticle)  
  45. #articlelinks=getArticleLinks("http://blog.csdn.net/hw140701")  
  46. #for list in articlelinks:  
  47. #print(list.attrs["href"])  
  48. #print(list.a.attrs["href"])  
  49. #寫入文本  
  50. #def data_out(data):  
  51. # with open("E:/CSDN.txt","a+") as out:  
  52. # out.write(‘\n‘)  
  53. # out.write(data,)  
  54. #得到CSDN部落格每一篇文章的文字內容  
  55. def getArticleText(articleUrl):  
  56. #設定代理IP  
  57. #代理IP可以上http://zhimaruanjian.com/擷取  
  58. proxy_handler=urllib.request.ProxyHandler({‘https‘:‘111.76.129.200:808‘})  
  59. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  
  60. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  
  61. urllib.request.install_opener(opener)  
  62. #擷取網頁資訊  
  63. req=request.Request(articleUrl,headers=headers1 or headers2 or headers3)  
  64. html=urlopen(req)  
  65. bsObj=BeautifulSoup(html.read(),"html.parser")  
  66. #擷取文章的文字內容  
  67. for textlist in bsObj.findAll("span",style=re.compile("font-size:([0-9]+)px")):#Regex匹配文字內容標籤  
  68. print(textlist.get_text())  
  69. #data_out(textlist.get_text())  
  70. #得到CSDN部落格某個部落客頁上所有分頁的連結,根據分頁連結得到每一篇文章的連結並爬取部落格每篇文章的文字  
  71. pages=set()  
  72. def getPageLinks(bokezhuye):  
  73. #設定代理IP  
  74. #代理IP可以上http://zhimaruanjian.com/擷取  
  75. proxy_handler=urllib.request.ProxyHandler({‘post‘:‘121.22.252.85:8000‘})  
  76. proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  
  77. opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  
  78. urllib.request.install_opener(opener)  
  79. #擷取網頁資訊  
  80. req=request.Request(bokezhuye,headers=headers1 or headers2 or headers3)  
  81. html=urlopen(req)  
  82. bsObj=BeautifulSoup(html.read(),"html.parser")  
  83. #擷取當前頁面(第一頁)的所有文章的連結  
  84. getArticleLinks(bokezhuye)  
  85. #去除重複的連結  
  86. global pages  
  87. for pagelist in bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/list)(/[0-9]+)*$")):#Regex匹配分頁的連結  
  88. if ‘href‘ in pagelist.attrs:  
  89. if pagelist.attrs["href"] not in pages:  
  90. #遇到了新的介面  
  91. newPage=pagelist.attrs["href"]  
  92. #print(newPage)  
  93. pages.add(newPage)  
  94. #擷取接下來的每一個頁面上的每一篇文章的連結  
  95. newPageLink="http://blog.csdn.net/"+newPage  
  96. getArticleLinks(newPageLink)  
  97. #爬取每一篇文章的文字內容  
  98. for articlelist in articles:  
  99. newarticlelist="http://blog.csdn.net/"+articlelist  
  100. print(newarticlelist)  
  101. getArticleText(newarticlelist)  
  102. #getArticleLinks("http://blog.csdn.net/hw140701")  
  103. getPageLinks("http://blog.csdn.net/hw140701")  
  104. #getArticleText("http://blog.csdn.net/hw140701/article/details/55104018")  

 

 

 

 

 

結果

 

 

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

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

 

Python爬蟲小實踐:爬取任意CSDN部落格所有文章的文字內容(或可改寫為儲存其他的元素),間接增加部落格訪問量

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.