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. 数据的分类-JavaScript数据类型

    JavaScript数据类型 1.数据类型是什么? 我们接触的绝大多数程序语言来说,把数据都进行了分类,包括数字.字符.逻辑真假:int,long,string,boolean....等等:我们都知道 ...

  2. [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value 解决方法

    在MySQL数据库中的mysql.user表中使用insert语句添加新用户时,可能会出现以下错误: ERROR 1364 (HY000): Field 'ssl_cipher' doesn't ha ...

  3. 【转】 Python调用(运行)外部程序

    在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32pro ...

  4. Vue实现商城里面多个商品计算,全选,删除

    <!--包含 全选/不全选 批量删除 全部金额计算 数量加减--> 简陋的CSS代码 .main{ width: 100%;}.title{ width: 100%; height: 40 ...

  5. Oracle 定时查询数据插入新表中(job+存储过程)

    create table EGMAS_COUNT_DATA(TIMES       date not null, COUNT NUMBER(30) not null, SYSTEM_NAME VARC ...

  6. 怎样让PDM图形列表显示name和code等需要的信息

    1. 工具(TOOLS)-〉显示参数设置(DISPLAY PREFERENCES) 2. 在弹出来的框中选中Content-〉Table 3. 点右下角那个Advanced 按钮 4. 在弹出的框个选 ...

  7. 【记录】Spring项目转化为Spring Web项目

    前言 在将Spring项目转化为Spring Mvc项目时出现了点问题,总是无法成功部署,查阅资料也并没有找到一个完美的解决方案,最后是参考在idea中创建maven web app项目后的目录才成功 ...

  8. 创建mongodb副本集操作实例

    一:概念 相关概念及图片引用自这里 mongodb副本集: 副本集是一组服务器,其中一个是主服务器,用于处理客户请求:还有多个备份服务器,用于保存主服务器的数据副本.如果主服务器崩溃了,备份服务器自动 ...

  9. typescript 的 polyfill 学习1-Class 继承篇

    Class 继承 js 是多范式的编程语言,同样也是支持面向对象编程的,类 是面向对象中是很重要的概念. 区别于传统的java,c#基于模板的类,js是基于原型的. 类继承一般是通过原型链的方式来实现 ...

  10. 数据库中有的字段为null时,反馈到页面上是什么也不显示?如何用一个【无】字来代替呢?

    <asp:ListView ID="listViewCustomer" DataSourceID="ods_Customer" runat="s ...