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")
结果
在其中有时候会出现乱码,这是由于有空格的存在,暂时还有找到方法解决。
另外在有的时候会出现服务器没有响应的错误,如下:
转载于:https://www.cnblogs.com/zhimaHTTP/p/7746129.html
Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量...相关推荐
- 【Python爬虫_1】爬取巴比特社区前5页列表和内容;
import requests from bs4 import BeautifulSoup import json import time"""需求:爬取巴比特论坛的前5 ...
- python爬虫小项目: 爬取百度贴吧帖子
本文同样是基于静觅系列的python3.x版,具体步骤请前往静觅系列学习 关于encode()与decode()的问题:可以参照xanderzhang 及921800467的专栏 可完成静觅系列相同功 ...
- Python爬虫系列之爬取某奢侈品小程序店铺商品数据
Python爬虫系列之爬取某奢侈品小程序店铺商品数据 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发> 点击这里联系我们 < 微信请扫描下方二维码 代码仅供学 ...
- Python爬虫系列之爬取某优选微信小程序全国店铺商品数据
Python爬虫系列之爬取某优选微信小程序全国商品数据 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发 > 点击这里联系我们 < 微信请扫描下方二维码 代码仅 ...
- Python爬虫系列之爬取某社区团微信小程序店铺商品数据
Python爬虫系列之爬取某社区团微信小程序店铺商品数据 如有问题QQ请> 点击这里联系我们 < 微信请扫描下方二维码 代码仅供学习交流,请勿用于非法用途 数据库仅用于去重使用,数据主要存 ...
- 【Python爬虫】从零开始爬取Sci-Hub上的论文(串行爬取)
[Python爬虫]从零开始爬取Sci-Hub上的论文(串行爬取) 维护日志 项目简介 步骤与实践 STEP1 获取目标内容的列表 STEP2 利用开发者工具进行网页调研 2.1 提取文章链接和分页链 ...
- [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )
上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...
- Python爬虫实战之爬取网站全部图片(一)
Python爬虫实战之爬取网站全部图片(二) Python爬虫实战之通过ajax获得图片地址实现全站图片下载(三) 一.获得图片地址 和 图片名称 1.进入网址之后 按F12 打开开发人员工具点击e ...
- Python爬虫入门 | 5 爬取小猪短租租房信息
小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 小猪短租(成都)页面:http://cd.xiaozhu.com/ 1.爬取租房标题 ...
- python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程
python爬虫 requests+bs4爬取猫眼电影 傻瓜版教程 前言 一丶整体思路 二丶遇到的问题 三丶分析URL 四丶解析页面 五丶写入文件 六丶完整代码 七丶最后 前言 大家好我是墨绿 头顶总 ...
最新文章
- 第一个MapReduce程序
- Python入门基础教程 Working with Python – Introductory Level
- ToDictionary的用法
- JAVA C++ 左花括号{该另起一行写还是写在行尾的思考
- 基本算法学习(一)之希尔排序(JS)
- POJ1564 Sum It Up(DFS)
- 天胶指数发布 对话国际农民丰收节贸易会海垦集团走出去
- java win10 32,Win10 同时安装64位和32位的JDK
- 华为在哪发布的鸿蒙,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
- Redis 一些高级用法
- 贪吃蛇小游戏源码再回顾
- Hadoop3 Hive Spark完整安装与实践
- 如何在golang代码里面解析容器镜像
- 单用户修改root密码--centos6.2
- 95-32-010-ChannelPipeline-ChannelPipeline简介
- [学习笔记]后缀平衡树
- 编译器C-Free V352注册算法分析
- FB新应用可借助人工智能回答照片内容提问
- ASP.NET中IsPostBack详解
- 【人工智能】想要入坑机器学习?这是MIT在读博士的AI心得
热门文章
- python外星人入侵游戏代码大全-Python外星人入侵游戏开发—重构键盘鼠标响应代码...
- 零基础学python多久可以工作-零基础学习python,要多久才可以学好并且找到工作?...
- python爬虫教程入门-Python爬虫系列 - 入门教学
- python下载安装教程3.8.0-Python3.8下载
- python画椭圆-python绘制圆和椭圆
- 学会python编程容易吗-Python 适合初学编程的人学吗?
- python爬虫抓取图片-怎么用爬虫批量抓取网页中的图片?
- 用python画皮卡丘代码-利用Python绘制萌萌哒的皮卡丘
- python如何导入txt数据集-终于找到python入门到实践数据集
- python点的作用-一分钟了解Python中“*”的作用