Python爬虫Csdn系列III

Python爬虫Csdn系列III

By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢。

说明:

在上一篇博客中,我们已经能够获取一个用户所有文章的链接了,那么这一节自然就是要将这些博客下载下来咯。

分析:

有了链接下载文章自然是不难。但是,获取的数据该怎么处理?每一篇文章都带有格式换行这些信息,自然,我们存储它们也是要存储其对应的html格式的数据的(注意,我们编辑的带有格式的博客或者其他文本都是以html代码格式存储的)。如何存?使用数据库,每篇文章字数都挺大的,没必要用数据库,还是存储文件更方便。

这里我将下载的每篇博客都取出文章的div部分,然后给这个部分添加必要的html头部及其尾部,将其封装成一个完整的html文本,最后再保存成html格式的文件。这里要注意的就是在html中一定要添加<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />这句话,否则显示的会是乱码。

核心代码在前两篇文章已经提到了,难度也不是很大。

代码:

#-*- coding:utf-8 -*-
import sys
import os
import codecs
import urllib
import urllib2
import cookielib
import MySQLdb
import re
from bs4 import BeautifulSoup
from article import CsdnArticle

reload(sys)
sys.setdefaultencoding('utf-8')

class CsdnCrawler(object):
	def __init__(self, author = 'whiterbear'):
		self.author = author
		self.domain = 'http://blog.csdn.net/'
		self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'}
		self.articles = []

	#给定url,得到所有的文章lists
	def getArticleLists(self, url= None):
		req = urllib2.Request(url, headers=self.headers)
		response = urllib2.urlopen(req)
		soup = BeautifulSoup(''.join(response.read()))
		listitem =  soup.find(id='article_list').find_all(attrs={'class':r'list_item article_item'})
		href_regex = r'href="(.*?)"'
		for i,item in enumerate(listitem):
			enitem = item.find(attrs={'class':'link_title'}).contents[0].contents[0]
			href = re.search(href_regex,str(item.find(attrs={'class':'link_title'}).contents[0])).group(1)
			art = CsdnArticle()
			art.author = self.author
			art.title = enitem.lstrip()
			art.href = (self.domain + href[1:]).lstrip()
			self.articles.append(art)

	def getPageLists(self, url= None):
		url = url if url else 'http://blog.csdn.net/%s?viewmode=list'%self.author
		req = urllib2.Request(url, headers=self.headers)
		response = urllib2.urlopen(req)
		soup = BeautifulSoup(''.join(response.read()))
		num_regex = '[1-9]\d*'
		pagelist = soup.find(id='papelist')
		self.getArticleLists(url)
		if pagelist:
			pagenum = int(re.findall(num_regex, pagelist.contents[1].contents[0])[1])
			for i in range(2, pagenum + 1):
				self.getArticleLists(self.domain + self.author + '/article/list/%s'%i)

	def getAllArticles(self):
		#我们创建一个该作者的文件夹来存放作者的文章
		if not os.path.exists(self.author):
			os.mkdir(self.author)
		for subarticle in self.articles:
			articleurl = subarticle.href
			#依次打开每一篇文章并下载
			req = urllib2.Request(articleurl, headers=self.headers)
			response = urllib2.urlopen(req)
			soup = BeautifulSoup(''.join(response.read()))
			article_content = soup.find(id='article_content')
			title = subarticle.title.rstrip().encode('utf-8')
			#将提取的内容封装成html格式的字符串
			article = u'<html><head><title>%s</title><meta http-equiv="Content-Type" 			content="text/html; charset=utf-8" /></head><body>%s</body></html>' % (title, article_content)

			fobj = codecs.open(u'%s/%s.htm'%(self.author, title),'w','utf-8')
			fobj.writelines(article.encode('utf-8'))
			fobj.close()

def main():
	csdn = CsdnCrawler(author='whiterbear')#'pongba',可以将填入你想下载的博主的博客
	csdn.getPageLists()
	csdn.getAllArticles()

if __name__ == '__main__':
	main()

结果:

生成了该博主命名的文件夹,文件夹中包含该博主的所有文章。如下图:

随便打开一个文章,显示的效果是这样的:(显示的效果很赞。)

感悟:

1> 中文编码问题。虽然已经了解了几种编码问题的解决方式,但是还是常常被这个问题给卡住。

2> 保持代码的正交性。虽然我还没做过大项目,但是已经能够感受到,如果两个模块的正交性提高,即一个模块的改动并不会影响到另一个模块的正常运行。这样子能够迫使你去思考一种清晰的框架,而不会写了一团糟的代码。

3> 常见的错觉,总觉得这个很简单啊,今天就可以做完啊,结果总是遇到这样那样的问题,还是缺少经验。

4> 其他:保持代码的整洁,尝试迭代,从小的代码开始一点点往上累计新的代码,时刻保持两个版本(其中一个含有大量输出来帮你确定每一步发生了什么)。

下个系列可能就要开始做微博的爬虫了,会涉及到相关的数据处理和分析,希望能顺利点。

时间: 2024-10-13 05:57:37

Python爬虫Csdn系列III的相关文章

python爬虫Pragmatic系列III

python爬虫Pragmatic系列III 说明: 在上一篇博客中,我们已经学会了从赶集网上的一家公司中提取出有关的信息,并存储到Excel中. 本次目标: 在本节中,我们将批量下载赶集首页上所有的公司界面(注意不是赶集网上所有的公司页面,我们可以把这个留给之后的任务),并批量的处理所有公司的有关信息,并保存到Excel中. 注意: 在上一篇博客中,我们使用的只是匹配赶集网上其中一家公司界面的中信息,而且不幸的是,很多的其他的公司的联系店主模块中的信息数量并不是固定的,即有的是10个li,而有

Python爬虫Csdn系列I

Python爬虫Csdn系列I By 白熊花田(http://blog.csdn.net/whiterbear) 说明: 我会在这个系列介绍如何利用python写一个csdn爬虫,并将给定的Csdn用户的博客的所有文章保存起来.嗯,实用性貌似不是很大,写着玩,这个系列后,会有更好玩的更高级的爬虫出现. 原因: 本来想学cookie的,后来发现爬取csdn的文章伪装成浏览器去访问就行了. 本次目标: 爬取csdn某用户的文章列表.这里以我的blog为例,仅仅打开第一列文章列表,不做任何分析,只是验

Python爬虫Csdn系列II

Python爬虫Csdn系列II By 白熊花田(http://blog.csdn.net/whiterbear) 转载需注明出处,谢谢. 说明: 在上一篇文章中,我们已经知道了只要将程序伪装成浏览器就能访问csdn网页.在这篇文章中,我们将设法获取某个csdn用户的所有文章的链接. 分析: 打开一个某一个的csdn用户的的专栏,可以选择目录视图(如:http://blog.csdn.net/whiterbear?viewmode=contents)和摘要视图(比如:http://blog.cs

Python爬虫学习系列教程

Python爬虫学习系列教程 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. Python版本:2.7 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库

python爬虫CSDN文章抓取

CSDN原则上不让非人浏览访问,正常爬虫无法从这里爬取文章,需要进行模拟人为浏览器访问. 使用:输入带文章的CSDN链接自动生成正文的HTML,文件名为标题名 #!/usr/bin/env python # coding=utf-8 ######################################### #> File Name: CSDN_article.py #> Author: nealgavin #> Mail: [email protected] #> Cre

python爬虫Pragmatic系列IV

python爬虫Pragmatic系列IV 说明: 在上一篇博客中,我们已经做到了从赶集网上单个首页中抓取所有的链接,并下载下来,分析后存入Excel中. 本次目标: 在本节中,我们将使用python多线程技术从赶集网上抓取链接并分析,注意,我们这次能够抓获的链接数目可以远远大于上一篇博客中抓获的. 分析: 用爬虫统计信息那自然数据越多越好,为了获取更多的数据,我们先研究下如何打开上千个赶集网上公司链接. 打开首页(http://bj.ganji.com/danbaobaoxian/o1/),在

《Python爬虫学习系列教程》学习笔记

转自:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. 一.Python入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫

Python爬虫开发系列之一》开发IDE安装

中国有句古话说:工欲善其事,必先利其器! 在我最开始学 Python 的时候,因为没有去探索好用的工具,吃了很多苦头.磕磕绊绊走过来之后才知道,好的工具给效率带来的提升不是从 1 到 1.1 倍速,而是从 1 到 10 倍速. 所以说编写和运行程序之前我们必须要先把开发环境配置好,只有配置好了环境并且有了更方便的开发工具我们才能更加高效地用程序实现相应的功能达到事半工倍的效果,然而很多情况下我们可能在最开始就卡在环境配置上,如果这个过程花费了太多时间,想必学习的兴趣就下降了大半,所以本章专门开发

Python爬虫开发系列之三》Requests请求库的使用

Requests是一个实用.简单.强大的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.Requests 能够完全满足如今网络的需求.接下来我们从最基本的get post 请求开始 到高级特性一步一个脚印去学习.学习是个渐进的过程,只有脚踏实地不断的去练习才能掌握这些重要的知识点. 一.发送请求 get /post 按照规例首先要导入Requests模块>>> import requests r=requests.get('https://www.baidu.c