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
- bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/list)(/[0-9]+)*$")):#正则表达式匹配分页的链接
bsObj为BeautifulSoup对象
2.2分页上每一篇文章链接源码分析
得到每一个分页的链接后,对每一个分页上的文章链接源码进行分析,其源码如下

通过分析,所以我们采取以下的方法进行匹配
[python] view plain copy
- bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/details)(/[0-9]+)*$"))
或者
[python] view plain copy
- bsObj.findAll("span",{"class":"link_title"})
2.3每一篇文章中文字内容源码分析
通过对每一篇文章中的网站源码进行分析,发现其内容位于源码中的以下位置

所以通过下列代码进行匹配
[python] view plain copy
- bsObj.findAll("span",style=re.compile("font-size:([0-9]+)px"))
3.全部代码以及结果
现附上全部代码,注释部分可能有错,可以根据此代码自行修改,去爬取某CSDN博客中的任意元素
[python] view plain copy
- #__author__ = 'Administrat
- #coding=utf-8
- import io
- import os
- import sys
- import urllib
- from urllib.request import urlopen
- from urllib import request
- from bs4 import BeautifulSoup
- import datetime
- import random
- import re
- import requests
- import socket
- socket.setdefaulttimeout(5000)#设置全局超时函数
- sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
- headers1={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
- 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'}
- headers3={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'}
- #得到CSDN博客某一个分页的所有文章的链接
- articles=set()
- def getArticleLinks(pageUrl):
- #设置代理IP
- #代理IP可以上http://zhimaruanjian.com/获取
- proxy_handler=urllib.request.ProxyHandler({'post':'210.136.17.78:8080'})
- proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()
- opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)
- urllib.request.install_opener(opener)
- #获取网页信息
- req=request.Request(pageUrl,headers=headers1 or headers2 or headers3)
- html=urlopen(req)
- bsObj=BeautifulSoup(html.read(),"html.parser")
- global articles
- #return bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/details)(/[0-9]+)*$"))
- #return bsObj.findAll("a")
- #for articlelist in bsObj.findAll("span",{"class":"link_title"}):
- for articlelist in bsObj.findAll("span",{"class":"link_title"}):#正则表达式匹配每一篇文章链接
- #print(articlelist)
- if 'href' in articlelist.a.attrs:
- if articlelist.a.attrs["href"] not in articles:
- #遇到了新界面
- newArticle=articlelist.a.attrs["href"]
- #print(newArticle)
- articles.add(newArticle)
- #articlelinks=getArticleLinks("http://blog.csdn.net/hw140701")
- #for list in articlelinks:
- #print(list.attrs["href"])
- #print(list.a.attrs["href"])
- #写入文本
- #def data_out(data):
- # with open("E:/CSDN.txt","a+") as out:
- # out.write('\n')
- # out.write(data,)
- #得到CSDN博客每一篇文章的文字内容
- def getArticleText(articleUrl):
- #设置代理IP
- #代理IP可以上http://zhimaruanjian.com/获取
- proxy_handler=urllib.request.ProxyHandler({'https':'111.76.129.200:808'})
- proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()
- opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)
- urllib.request.install_opener(opener)
- #获取网页信息
- req=request.Request(articleUrl,headers=headers1 or headers2 or headers3)
- html=urlopen(req)
- bsObj=BeautifulSoup(html.read(),"html.parser")
- #获取文章的文字内容
- for textlist in bsObj.findAll("span",style=re.compile("font-size:([0-9]+)px")):#正则表达式匹配文字内容标签
- print(textlist.get_text())
- #data_out(textlist.get_text())
- #得到CSDN博客某个博客主页上所有分页的链接,根据分页链接得到每一篇文章的链接并爬取博客每篇文章的文字
- pages=set()
- def getPageLinks(bokezhuye):
- #设置代理IP
- #代理IP可以上http://zhimaruanjian.com/获取
- proxy_handler=urllib.request.ProxyHandler({'post':'121.22.252.85:8000'})
- proxy_auth_handler=urllib.request.ProxyBasicAuthHandler()
- opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler)
- urllib.request.install_opener(opener)
- #获取网页信息
- req=request.Request(bokezhuye,headers=headers1 or headers2 or headers3)
- html=urlopen(req)
- bsObj=BeautifulSoup(html.read(),"html.parser")
- #获取当前页面(第一页)的所有文章的链接
- getArticleLinks(bokezhuye)
- #去除重复的链接
- global pages
- for pagelist in bsObj.findAll("a",href=re.compile("^/([A-Za-z0-9]+)(/article)(/list)(/[0-9]+)*$")):#正则表达式匹配分页的链接
- if 'href' in pagelist.attrs:
- if pagelist.attrs["href"] not in pages:
- #遇到了新的界面
- newPage=pagelist.attrs["href"]
- #print(newPage)
- pages.add(newPage)
- #获取接下来的每一个页面上的每一篇文章的链接
- newPageLink="http://blog.csdn.net/"+newPage
- getArticleLinks(newPageLink)
- #爬取每一篇文章的文字内容
- for articlelist in articles:
- newarticlelist="http://blog.csdn.net/"+articlelist
- print(newarticlelist)
- getArticleText(newarticlelist)
- #getArticleLinks("http://blog.csdn.net/hw140701")
- getPageLinks("http://blog.csdn.net/hw140701")
- #getArticleText("http://blog.csdn.net/hw140701/article/details/55104018")
结果

在其中有时候会出现乱码,这是由于有空格的存在,暂时还有找到方法解决。
另外在有的时候会出现服务器没有响应的错误,如下:

Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量的更多相关文章
- 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...
- Python爬虫实战之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的任意帖子进行抓取 指定是否只抓取楼主发帖 ...
- Python爬虫实例:爬取B站《工作细胞》短评——异步加载信息的爬取
很多网页的信息都是通过异步加载的,本文就举例讨论下此类网页的抓取. <工作细胞>最近比较火,bilibili 上目前的短评已经有17000多条. 先看分析下页面 右边 li 标签中的就是短 ...
- Python爬虫实例:爬取猫眼电影——破解字体反爬
字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的字体文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容的. 现在貌似不少网 ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...
- python爬虫-基础入门-爬取整个网站《3》
python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...
- python爬虫-基础入门-爬取整个网站《2》
python爬虫-基础入门-爬取整个网站<2> 描述: 开场白已在<python爬虫-基础入门-爬取整个网站<1>>中描述过了,这里不在描述,只附上 python3 ...
- python爬虫-基础入门-爬取整个网站《1》
python爬虫-基础入门-爬取整个网站<1> 描述: 使用环境:python2.7.15 ,开发工具:pycharm,现爬取一个网站页面(http://www.baidu.com)所有数 ...
- Python 爬虫入门之爬取妹子图
Python 爬虫入门之爬取妹子图 来源:李英杰 链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...
- Python爬虫教程-17-ajax爬取实例(豆瓣电影)
Python爬虫教程-17-ajax爬取实例(豆瓣电影) ajax: 简单的说,就是一段js代码,通过这段代码,可以让页面发送异步的请求,或者向服务器发送一个东西,即和服务器进行交互 对于ajax: ...
随机推荐
- mybatis运行时错误Illegal argument exception argument type mismatch
使用注解时遇到该错误 使用XML应该也会有相应的错误 解决办法:查看是不是Dao接口的参数列表没有加@Param注解 参数过多时需要该注解指明参数
- Coin Change (II)(完全背包)
Coin Change (II) Time Limit: 1000MS Mem ...
- Codeforces Round #309 (Div. 2)D
C. Kyoya and Colored Balls time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Java比较器
导语 本节内容,比较器Comparable是核心内容. 主要内容 重新认识Arrays类 两种比较器的使用 具体内容 Arrays类 在之前一直使用的"java.util.Arrays.so ...
- margin:0px auto和text-align:center区别
(1)margin:0px auto :作用于块级元素,对块级元素进行居中 (2)text-align:center:作用于内联元素,必须放在要居中的内联元素所在的块级元素. 例: (1) <d ...
- apache一个IP一个端口对应多个域名
一个IP一个端口对应多个域名: NameVirtualHost XXX.XXX.XXX.XXX:80 <VirtualHost XXX.XXX.XXX.XXX:80> ServerAdmi ...
- Java历程-初学篇 Day09 冒泡排序
冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...
- 远程连接MySQL,防火墙阻止访问,解决方法
远程连接MySQL,防火墙阻止访问,解决方法 xp/2003添加防火墙例外端口 打开防火墙,选择例外选项卡,添加端口 名称:mysqlport 端口号:3306 选中TCP win7添加防火墙例外 ...
- 轻松几句搞定【Javascript中的this指向】问题
this关键字在JavaScript中扮演了至关重要的角色,每次它的出现都伴随着它的指向问题,这也是很多初学者容易出错的地方. 不过,这篇文章将会带你一次性搞定this指向的问题,望能给大家提供帮助! ...
- 使用Hexo+Github一步步搭建属于自己的博客(基础)
前言:电脑系统为window 10专业版,64位 相关步骤: 1.安装Node.js和配置好Node.js环境,打开cmd命令行,成功界面如下 2.安装Git和配置好Git环境,安装成功的象征就是在电 ...