`
shaoziqiang
  • 浏览: 4675 次
文章分类
社区版块
存档分类
最新评论

Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量

阅读更多

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

<!--[if !supportLists]-->1. <!--[endif]-->bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/list)(/[0-9]+)*$")):#正则表达式匹配分页的链接  

bsObj为BeautifulSoup对象

 

2.2分页上每一篇文章链接源码分析

得到每一个分页的链接后,对每一个分页上的文章链接源码进行分析,其源码如下



  

通过分析,所以我们采取以下的方法进行匹配

[python] view plain copy

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


或者

[python] view plain copy

<!--[if !supportLists]-->1. <!--[endif]-->bsObj.findAll("span",{"class":"link_title"})  


2.3每一篇文章中文字内容源码分析

通过对每一篇文章中的网站源码进行分析,发现其内容位于源码中的以下位置



  

所以通过下列代码进行匹配

[python] view plain copy

<!--[if !supportLists]-->1. <!--[endif]-->bsObj.findAll("span",style=re.compile("font-size:([0-9]+)px"))  


3.全部代码以及结果

现附上全部代码,注释部分可能有错,可以根据此代码自行修改,去爬取某CSDN博客中的任意元素

 

[python] view plain copy

<!--[if !supportLists]-->1. <!--[endif]-->#__author__ = 'Administrat  

<!--[if !supportLists]-->2. <!--[endif]-->#coding=utf-8  

<!--[if !supportLists]-->3. <!--[endif]-->import io  

<!--[if !supportLists]-->4. <!--[endif]-->import os  

<!--[if !supportLists]-->5. <!--[endif]-->import sys  

<!--[if !supportLists]-->6. <!--[endif]-->import urllib  

<!--[if !supportLists]-->7. <!--[endif]-->from urllib.request import  urlopen  

<!--[if !supportLists]-->8. <!--[endif]-->from urllib  import request  

<!--[if !supportLists]-->9. <!--[endif]-->from bs4 import BeautifulSoup  

<!--[if !supportLists]-->10. <!--[endif]-->import datetime  

<!--[if !supportLists]-->11. <!--[endif]-->import random  

<!--[if !supportLists]-->12. <!--[endif]-->import re  

<!--[if !supportLists]-->13. <!--[endif]-->import requests  

<!--[if !supportLists]-->14. <!--[endif]-->import socket  

<!--[if !supportLists]-->15. <!--[endif]-->socket.setdefaulttimeout(5000)#设置全局超时函数  

<!--[if !supportLists]-->16. <!--[endif]-->  

<!--[if !supportLists]-->17. <!--[endif]-->  

<!--[if !supportLists]-->18. <!--[endif]-->sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')  

<!--[if !supportLists]-->19. <!--[endif]-->headers1={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}  

<!--[if !supportLists]-->20. <!--[endif]-->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'}  

<!--[if !supportLists]-->21. <!--[endif]-->headers3={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}  

<!--[if !supportLists]-->22. <!--[endif]-->  

<!--[if !supportLists]-->23. <!--[endif]-->#得到CSDN博客某一个分页的所有文章的链接  

<!--[if !supportLists]-->24. <!--[endif]-->articles=set()  

<!--[if !supportLists]-->25. <!--[endif]-->def getArticleLinks(pageUrl):  

<!--[if !supportLists]-->26. <!--[endif]-->    #设置代理IP  

<!--[if !supportLists]-->27. <!--[endif]-->    #代理IP可以上http://zhimaruanjian.com/获取  

<!--[if !supportLists]-->28. <!--[endif]-->    proxy_handler=urllib.request.ProxyHandler({'post':'210.136.17.78:8080'})  

<!--[if !supportLists]-->29. <!--[endif]-->    proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  

<!--[if !supportLists]-->30. <!--[endif]-->    opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  

<!--[if !supportLists]-->31. <!--[endif]-->    urllib.request.install_opener(opener)  

<!--[if !supportLists]-->32. <!--[endif]-->    #获取网页信息  

<!--[if !supportLists]-->33. <!--[endif]-->    req=request.Request(pageUrl,headers=headers1 or headers2 or headers3)  

<!--[if !supportLists]-->34. <!--[endif]-->    html=urlopen(req)  

<!--[if !supportLists]-->35. <!--[endif]-->    bsObj=BeautifulSoup(html.read(),"html.parser")  

<!--[if !supportLists]-->36. <!--[endif]-->    global articles  

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

<!--[if !supportLists]-->38. <!--[endif]-->    #return bsObj.findAll("a")  

<!--[if !supportLists]-->39. <!--[endif]-->    #for articlelist in bsObj.findAll("span",{"class":"link_title"}):  

<!--[if !supportLists]-->40. <!--[endif]-->    for articlelist in bsObj.findAll("span",{"class":"link_title"}):#正则表达式匹配每一篇文章链接  

<!--[if !supportLists]-->41. <!--[endif]-->        #print(articlelist)  

<!--[if !supportLists]-->42. <!--[endif]-->        if 'href' in articlelist.a.attrs:  

<!--[if !supportLists]-->43. <!--[endif]-->            if articlelist.a.attrs["href"not in articles:  

<!--[if !supportLists]-->44. <!--[endif]-->                #遇到了新界面  

<!--[if !supportLists]-->45. <!--[endif]-->                newArticle=articlelist.a.attrs["href"]  

<!--[if !supportLists]-->46. <!--[endif]-->                #print(newArticle)  

<!--[if !supportLists]-->47. <!--[endif]-->                articles.add(newArticle)  

<!--[if !supportLists]-->48. <!--[endif]-->#articlelinks=getArticleLinks("http://blog.csdn.net/hw140701")  

<!--[if !supportLists]-->49. <!--[endif]-->#for list in articlelinks:  

<!--[if !supportLists]-->50. <!--[endif]-->    #print(list.attrs["href"])  

<!--[if !supportLists]-->51. <!--[endif]-->    #print(list.a.attrs["href"])  

<!--[if !supportLists]-->52. <!--[endif]-->  

<!--[if !supportLists]-->53. <!--[endif]-->#写入文本  

<!--[if !supportLists]-->54. <!--[endif]-->#def data_out(data):  

<!--[if !supportLists]-->55. <!--[endif]-->   # with open("E:/CSDN.txt","a+") as out:  

<!--[if !supportLists]-->56. <!--[endif]-->       # out.write('\n')  

<!--[if !supportLists]-->57. <!--[endif]-->       # out.write(data,)  

<!--[if !supportLists]-->58. <!--[endif]-->  

<!--[if !supportLists]-->59. <!--[endif]-->  

<!--[if !supportLists]-->60. <!--[endif]-->#得到CSDN博客每一篇文章的文字内容  

<!--[if !supportLists]-->61. <!--[endif]-->def getArticleText(articleUrl):  

<!--[if !supportLists]-->62. <!--[endif]-->    #设置代理IP  

<!--[if !supportLists]-->63. <!--[endif]-->    #代理IP可以上http://zhimaruanjian.com/获取  

<!--[if !supportLists]-->64. <!--[endif]-->    proxy_handler=urllib.request.ProxyHandler({'https':'111.76.129.200:808'})  

<!--[if !supportLists]-->65. <!--[endif]-->    proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  

<!--[if !supportLists]-->66. <!--[endif]-->    opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  

<!--[if !supportLists]-->67. <!--[endif]-->    urllib.request.install_opener(opener)  

<!--[if !supportLists]-->68. <!--[endif]-->    #获取网页信息  

<!--[if !supportLists]-->69. <!--[endif]-->    req=request.Request(articleUrl,headers=headers1 or headers2 or headers3)  

<!--[if !supportLists]-->70. <!--[endif]-->    html=urlopen(req)  

<!--[if !supportLists]-->71. <!--[endif]-->    bsObj=BeautifulSoup(html.read(),"html.parser")  

<!--[if !supportLists]-->72. <!--[endif]-->    #获取文章的文字内容  

<!--[if !supportLists]-->73. <!--[endif]-->    for textlist in bsObj.findAll("span",style=re.compile("font-size:([0-9]+)px")):#正则表达式匹配文字内容标签  

<!--[if !supportLists]-->74. <!--[endif]-->        print(textlist.get_text())  

<!--[if !supportLists]-->75. <!--[endif]-->        #data_out(textlist.get_text())  

<!--[if !supportLists]-->76. <!--[endif]-->  

<!--[if !supportLists]-->77. <!--[endif]-->#得到CSDN博客某个博客主页上所有分页的链接,根据分页链接得到每一篇文章的链接并爬取博客每篇文章的文字  

<!--[if !supportLists]-->78. <!--[endif]-->pages=set()  

<!--[if !supportLists]-->79. <!--[endif]-->def getPageLinks(bokezhuye):  

<!--[if !supportLists]-->80. <!--[endif]-->    #设置代理IP  

<!--[if !supportLists]-->81. <!--[endif]-->    #代理IP可以上http://zhimaruanjian.com/获取  

<!--[if !supportLists]-->82. <!--[endif]-->     proxy_handler=urllib.request.ProxyHandler({'post':'121.22.252.85:8000'})  

<!--[if !supportLists]-->83. <!--[endif]-->     proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()  

<!--[if !supportLists]-->84. <!--[endif]-->     opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)  

<!--[if !supportLists]-->85. <!--[endif]-->     urllib.request.install_opener(opener)  

<!--[if !supportLists]-->86. <!--[endif]-->    #获取网页信息  

<!--[if !supportLists]-->87. <!--[endif]-->     req=request.Request(bokezhuye,headers=headers1 or headers2 or headers3)  

<!--[if !supportLists]-->88. <!--[endif]-->     html=urlopen(req)  

<!--[if !supportLists]-->89. <!--[endif]-->     bsObj=BeautifulSoup(html.read(),"html.parser")  

<!--[if !supportLists]-->90. <!--[endif]-->     #获取当前页面(第一页)的所有文章的链接  

<!--[if !supportLists]-->91. <!--[endif]-->     getArticleLinks(bokezhuye)  

<!--[if !supportLists]-->92. <!--[endif]-->     #去除重复的链接  

<!--[if !supportLists]-->93. <!--[endif]-->     global pages  

<!--[if !supportLists]-->94. <!--[endif]-->     for pagelist in bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/list)(/[0-9]+)*$")):#正则表达式匹配分页的链接  

<!--[if !supportLists]-->95. <!--[endif]-->         if 'href' in pagelist.attrs:  

<!--[if !supportLists]-->96. <!--[endif]-->             if pagelist.attrs["href"not in pages:  

<!--[if !supportLists]-->97. <!--[endif]-->                 #遇到了新的界面  

<!--[if !supportLists]-->98. <!--[endif]-->                 newPage=pagelist.attrs["href"]  

<!--[if !supportLists]-->99. <!--[endif]-->                 #print(newPage)  

<!--[if !supportLists]-->100. <!--[endif]-->                 pages.add(newPage)  

<!--[if !supportLists]-->101. <!--[endif]-->                 #获取接下来的每一个页面上的每一篇文章的链接  

<!--[if !supportLists]-->102. <!--[endif]-->                 newPageLink="http://blog.csdn.net/"+newPage  

<!--[if !supportLists]-->103. <!--[endif]-->                 getArticleLinks(newPageLink)  

<!--[if !supportLists]-->104. <!--[endif]-->                 #爬取每一篇文章的文字内容  

<!--[if !supportLists]-->105. <!--[endif]-->                 for articlelist in articles:  

<!--[if !supportLists]-->106. <!--[endif]-->                     newarticlelist="http://blog.csdn.net/"+articlelist  

<!--[if !supportLists]-->107. <!--[endif]-->                     print(newarticlelist)  

<!--[if !supportLists]-->108. <!--[endif]-->                     getArticleText(newarticlelist)  

<!--[if !supportLists]-->109. <!--[endif]-->#getArticleLinks("http://blog.csdn.net/hw140701")  

<!--[if !supportLists]-->110. <!--[endif]-->getPageLinks("http://blog.csdn.net/hw140701")  

<!--[if !supportLists]-->111. <!--[endif]-->#getArticleText("http://blog.csdn.net/hw140701/article/details/55104018")  

 

 

 

 

 

结果



  

 

在其中有时候会出现乱码,这是由于有空格的存在,暂时还有找到方法解决。

另外在有的时候会出现服务器没有响应的错误,如下:



  

  • 大小: 39.2 KB
  • 大小: 38.2 KB
  • 大小: 40 KB
  • 大小: 48.5 KB
  • 大小: 38.6 KB
  • 大小: 5.2 KB
分享到:
评论

相关推荐

    Python爬虫案例2:爬取前程无忧网站数据

    在本Python爬虫案例中,我们将探讨如何使用Python来爬取前程无忧网站的数据。前程无忧(51Job)是中国领先的招聘网站之一,提供大量的职位信息,这为我们提供了丰富的数据源来学习和实践网络爬虫技术。 首先,我们...

    抓取CSDN博客文章的简单爬虫python源码

    【标题】:“抓取CSDN博客文章的简单爬虫python源码” 在这个主题中,我们将探讨如何使用Python编写一个简单的爬虫程序来抓取CSDN博客的文章内容。CSDN(Chinese Software Developer Network)是中国的一个大型...

    Python爬虫案例1:爬取淘宝网页数据

    在IT行业中,Python爬虫是一种常见的数据获取技术,尤其在大数据分析、市场研究和网络情报等领域广泛应用。本案例将深入探讨如何使用Python编写一个爬虫程序来抓取淘宝网站上的商品信息,例如芒果、草莓和鸭舌帽等...

    Python爬虫入门:如何爬取招聘网站并进行分析

    Python爬虫入门知识点详细解析: 一、Python爬虫概念与应用 网络爬虫是按照一定的规则,自动抓取互联网信息的程序或脚本。它可以模拟用户浏览网页的行为,对网页内容进行提取、保存。Python爬虫由于其代码简洁、库...

    小白学 Python 爬虫(25):爬取股票信息

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):...

    python 爬虫实战案例:爬取网易云音乐评价 源码

    本实战案例将展示如何使用Python编写一个简单的网络爬虫,用于爬取网易云音乐上的歌曲评价。案例将涉及发送HTTP请求、解析网页内容以及数据提取的基本技术。 适用人群 编程初学者:希望通过实际项目学习网络爬虫的...

    python爬虫,爬取贴吧

    python爬虫,爬取贴吧python爬虫,爬取贴吧python爬虫,爬取贴吧python爬虫,爬取贴吧python爬虫,爬取贴吧python爬虫,爬取贴吧python爬虫,爬取贴吧python爬虫,爬取贴吧python爬虫,爬取贴吧python爬虫,爬取贴吧...

    Python爬虫:爬取网页内容

    python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例python爬虫案例...

    Python自动办公- Python爬虫~已爬取目标网站所有文章,后续如何只获取新文章 Python源码

    Python自动办公- Python爬虫~已爬取目标网站所有文章,后续如何只获取新文章 Python源码 Python自动办公- Python爬虫~已爬取目标网站所有文章,后续如何只获取新文章 Python源码 Python自动办公- Python爬虫~已爬取...

    基于Python爬虫的股票信息爬取保存到文件

    在本项目中,"基于Python爬虫的股票信息爬取保存到文件" 是一个课程设计,目的是通过编程从网络上抓取股票数据并将其存储到本地文件中。这个设计使用了Python语言,特别是Python的爬虫技术,展示了如何从股票信息...

    csdn博客小爬虫python

    【标题】"csdn博客小爬虫python"指的是使用Python编程语言编写的一个小型网络爬虫程序,该程序设计用于抓取特定CSDN(China Software Developer Network)博客账号下的所有博客文章,并将其保存到本地的"data"文件夹...

    基于python爬虫对百度贴吧进行爬取的课程设计.zip

    11. **多线程与异步**:当需要爬取大量页面时,可使用Python的多线程或多进程提高效率。另外,还可以使用异步IO(如asyncio库)实现并发爬取。 12. **爬虫伦理与法律法规**:了解并遵守《互联网信息服务管理办法》...

    基于Python的企查查爬虫,爬取完整的公司数据+源代码+文档说明

    基于Python的企查查爬虫,爬取完整的公司数据 -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! &lt;项目介绍&gt; 1、该资源内项目代码都经过...

    用python爬取网页并导出为word文档.docx

    本篇内容将介绍如何利用Python爬虫抓取网页内容,并将其存储到MongoDB数据库中,形成可管理的文档型数据。 首先,Python中的`requests`库是用于发送HTTP请求的工具,它能够帮助我们获取网页的HTML源码。例如,在...

    基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存

    该项目是基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存到本地 项目需求 1:爬取网易,搜狐,凤凰和澎湃新闻网站的文章及评论 2:新闻...

    Python实战项目:爬取上交所和深交所所有股票的名称和交易信息.zip

    Python实战项目:爬取上交所和深交所所有股票的名称和交易信息。 功能简介 目标:获取上交所和深交所所有股票的名称和交易信息 输出:保存到文件中 技术路线:requests--bs4--re 原理分析 步骤1:从东方财富网获取...

    Python爬虫程序源代码爬取豆瓣TOP250排行榜数据电影名称评分导演演员等信息

    知识领域: 数据爬取、数据分析、Python编程技术关键词: Python、网络爬虫、数据抓取、数据处理内容关键词: 豆瓣电影、排行榜、数据提取、数据分析用途: 提供一个Python编写的爬虫工具,用于抓取豆瓣电影TOP250的...

    Python爬虫-爬取目标城市酒店数据

    通过python爬虫采集城市的酒店数据 内容概要:使用python采集酒店数据 适用人群:做酒店数据市场调研,数据分析报告的人群 使用场景及目标:需要依靠python3环境,执行爬虫脚本 其他说明:需要使用开发者工具捕捉...

    python爬虫-爬取火车票.zip

    Python爬虫技术是数据获取的重要工具,特别是在网络信息丰富的今天,爬取火车票数据能帮助我们分析火车票的定价、余票、时段等信息。在这个项目中,我们将深入探讨如何利用Python实现火车票数据的爬取。 首先,我们...

    Python爬虫源码—爬取猫途鹰官方旅游网站信息

    在IT行业中,Python爬虫是一种常见的数据获取技术,尤其在大数据分析、市场研究以及网络信息监控等领域中广泛应用。本项目是关于使用Python爬虫来抓取猫途鹰(TripAdvisor)官方网站上的旅游信息,包括酒店和景点的...

Global site tag (gtag.js) - Google Analytics