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]+)*$")):#正则表达式匹配分页的链接

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"}):#正则表达式匹配每一篇文章链接
  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")):#正则表达式匹配文字内容标签
  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]+)*$")):#正则表达式匹配分页的链接
  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博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量的更多相关文章

  1. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

  2. Python爬虫实战之爬取百度贴吧帖子

    大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的任意帖子进行抓取 指定是否只抓取楼主发帖 ...

  3. Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取

    很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...

  4. Python爬虫实例:爬取猫眼电影——破解字体反爬

    字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...

  5. Python爬虫实例:爬取豆瓣Top250

    入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...

  6. python爬虫-基础入门-爬取整个网站《3》

    python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...

  7. python爬虫-基础入门-爬取整个网站《2》

    python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...

  8. python爬虫-基础入门-爬取整个网站《1》

    python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...

  9. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  10. Python爬虫教程-17-ajax爬取实例(豆瓣电影)

    Python爬虫教程-17-ajax爬取实例(豆瓣电影) ajax: 简单的说,就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: ...

随机推荐

  1. 变量的声明和定义以及extern的用法

    变量的声明和定义以及extern的用法                                          变量的声明不同于变量的定义,这一点往往容易让人混淆. l         变量 ...

  2. 简易RPC框架-心跳与重连机制

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. 创建 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(76)

    前面我们安装部署了 Rex-Ray,并且成功配置 VirtualBox backend,今天演示如何创建和使用 Rex-Ray volume. 在 docker1 或 docker2 上执行如下命令创 ...

  4. 关于修改extmail附件大小限制的位置

    一.修改extmail的webmail.cf文件, SYS_MESSAGE_SIZE_LIMIT = 5242880 注意:以位为单位为5M字节. SYS_MESSAGE_SIZE_LIMIT = x ...

  5. Message Queuing(MSMQ)

    一.前言 MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...

  6. 【转】Python装饰器与面向切面编程

    原文请参考: http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html 今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切 ...

  7. SQL SERVER 数据库级联删除

    --SQL SERVER 2008R2 级联删除:主子表设置外键关联,当主表数据删除的时候会自动删除子表中对应的数据 --创建主表 create table test_main( ID ,) PRIM ...

  8. 【解决方案】M2Crypto不支持python3

    问题现象:python3的环境下,导入M2Crypto模块报错 "ModuleNotFoundError: No module named 'M2Crypto",通过pip ins ...

  9. git学习整理(1)git clone 理解

    1.git clone 的理解 git clone默认会把远程仓库整个给clone下来 ,只能clone远程库的master分支并在本地默认创建一个master分支 ,无法clone所有分支,若想要其 ...

  10. 吾八哥学Python(五):Python基本数学运算

    今天我们学习Python里的基本数学运算方法,还是通过例子来练习吧! 加减乘除求余 #加法 print(12+34) #减法 print(30-10.0) #乘法 print(3*5) #除法 pri ...