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. sleep,yield,wait,notify,notifyAll

    1.wait,notify,notifyAll是Object的方法.他们必须在同步块中使用,并且当前线程必须已经获取了锁.wait方法,用来释放同步块对象上的锁,并且等待其他的线程唤醒(notify) ...

  2. Hive基础(2)---(启动HiveServer2)Hive严格模式

    启动方式 1, hive  命令行模式,直接输入/hive/bin/hive的执行程序,或者输入 hive –service cli 用于linux平台命令行查询,查询语句基本跟mysql查询语句类似 ...

  3. Codeforces 845 C. Two TVs 思路:简单贪心算法

    题目: 题目原文链接:http://codeforces.com/contest/845/problem/C 题意:现在我们有一个电视清单,有两个电视,电视清单上有每一个节目的开始时间和结束时间. 电 ...

  4. Intellij idea史上最简单的教程之Linux下安装与破解Intellij idea2017

    一.前言 这一节我们介绍在Linux下如何安装与破解Intellij idea2017.现在有很多公司开发环境都是Linux,所以掌握在Linux环境下使用Idea办公也是咱们必须得掌握的技能. 记住 ...

  5. asp.net mvc 自动化测试工具

    好久不写文章了,一直忙在项目中. 前一阵发现公司一个项目,体积巨大.业务很复杂.基于历史原因,项目基于mvc 2迁移过来,视图大多还是aspx  作为视图承载. 控制器中的方法  更是一个比一个多. ...

  6. wxPython中菜单、按钮学习

    ---恢复内容开始--- wx.Window 是一个基类,许多构件从它继承.包括 wx.Frame 构件.技术上这意味着,我们可以在所有的 子类中使用 wx.Window 的方法.我们这里介绍它的几种 ...

  7. flex的三个属性:

    (1)flex-grow:指的是相对于其他的子元素的扩展比率:默认值为0:数字 (2)flex-basis:指的是子元素的具体长度:可以为长度(rem,px,em)也可以为百分比: (3)flex-s ...

  8. DevOps之主机

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. 主机(Host) 关于主机,知识与技能的层次(知道.理解.运用),理论与实践的方面(原理.技术 ...

  9. Mac使用nginx+rtmp服务器

    一.安装Homebrow 已经安装了brow的可以直接跳过这一步.执行命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...

  10. Scrapy框架--Requests对象

    Scrapy使用request对象来爬取web站点. request对象由spiders对象产生,经由Scheduler传送到Downloader,Downloader执行request并返回resp ...