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. “==”与"equals(object)"的区别

    一.对于基本数据类型而言只能用“==”,不能用equals来进行比较,若使用equals来进行比较,则不能通过编译 二.在非字符串的对象的比较中: “==”与“equals()”比较的均是对象在堆内存 ...

  2. 苹果iPhone X上搭载的那颗A11仿生芯片,到底牛在哪?

    苹果iPhone X上搭载的那颗A11仿生芯片,到底牛在哪? 上周,苹果公司在刚刚落成投入使用的“飞船”新总部(Apple Park)举行2017年秋季新品发布会,整场发布会基本被iPhone X抢尽 ...

  3. 关于Class对象、类加载机制、虚拟机运行时的内存布局的全面解析和推测

    简介: 本文是对Java的类加载机制,Class对象,反射原理等相关概念的理解.验证和Java虚拟机中内存布局的一些推测.本文重点讲述了如何理解Class对象以及Class对象的作用. 欢迎探讨,如有 ...

  4. jQuery中的常用内容总结(三)

    jQuery中的常用内容总结(三) 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7571998.html 内容提要 选择器(第一节) 选择器的扩展方法(第一节) ...

  5. Ubuntu 普通用户提升到root权限

    方法一.修改passwd文件 1.编辑passwd文件 sudo vim /etc/passwd 2.找到你想提权的用户(比如test),将用户名后面的数字改成0 找到用户test test:x::: ...

  6. RobotFramework自动化测试框架-移动手机自动化测试Click A Point关键字的使用

    Click A Point关键字用来模拟点击APP界面上的一个点,该关键字接收两个三个参数[ x=0 | y=0 | duration=100 ],x和y代表的是点的坐标位置,duration代表的是 ...

  7. 一个强迫症的Git 选择

    选择 1,经常性的commit or 干净的历史 在本地(私有)的开发分支中,选择经常性的commit,以便于实时记录修改,回退等操作.eg.develop,feature... 实现方式: comm ...

  8. 学习如何看懂SQL Server执行计划(三)——连接查询篇

    三.连接查询部分 --------------------嵌套循环-------------------- /* UserInfo表数据少.Coupon表数据多嵌套循环可以理解为就是两层For循环,外 ...

  9. 张高兴的 UWP 开发笔记:手机状态栏 StatusBar

    UWP 有关应用标题栏 TitleBar 的文章比较多,但介绍 StatusBar 的却没几篇,在这里随便写写.状态栏 StatusBar 用法比较简单,花点心思稍微设计一下,对应用会是个很好的点缀. ...

  10. eclipse创建一个文件夹

    如何给eclipse创建一个文件夹,便于项目的管理:有时我们的eclipse中会有很多项目的,有的是公司的如Project1,Project2,Project3....还有的呢, 也可能是自己平时做的 ...