python爬取csdn的博客内容

首先说明爬虫的大体结构可以通用,不过针对字符串的匹配是不能通用的,比如你用爬取csdn的代码想去爬取博客园就是不行的了,因为爬取的字符是根据对应的html内容设置的。

使用python构建爬虫程序有一个简单的套路,我总结为3步走:

1.re.compile设置查找的字符串样式

2.page = urllib.urlopen打开网页,page.read读取网页内容

3.re.search/re.findall查找到给定字符串样式的具体内容

下面我给出一个查找csdn博客中文章的URL的例子:

首先随便打开一个博客(比如我随即找了一个博客:http://blog.csdn.net/mynameishuangshuai),查看一下源码,慢慢去找一下关于带有href标签的段落,发现了下面这一段(或者你用windows的浏览器也可以直接用鼠标去点文章标题就可以看到了)


这个是我找到的,点一下蓝色的uri就可以跳转到具体的文章内容上面了,所以我们的目标就是从这个网页中提取到这个uri

1.使用正则表达式设置字符串样式

pattern = re.compile('<span class="link_title"><a href="(.*?)">', re.S)

2.获取这个网页的html

page = urllib.urlopen(pageURL)
html = page.read()
3.找到样式对应的字符串

items = re.findall(pattern, html)
这样就是很简单的爬虫步骤,其实我所做的爬取内容大部分都要套用这个模式,除此之外还有很小的一部分内容是写入文件。
目前的功能是在调用脚本时输入一个你要获取的博客的url,就可以完全提取这个人的所有文章,比如

python spider.py http://blog.csdn.net/

myiloveuuu

就可以提取到myiloveuuu这个用户的所有文章了

具体代码如下

#-*- coding:utf-8 -*-

import urllib
import urllib2
import re
import os
import sys

class Spider:
	def __init__(self, blogURL):
		self.num = 0
		self.blogURLHead = 'http://blog.csdn.net'
		self.siteURL = blogURL
		self.basePath = './GetContent'
		if os.path.exists(self.basePath) == False:
			os.mkdir(self.basePath)
	
	#获取有几页博客
	def getPageNum(self):
		pattern = re.compile('<span>(.*?)</span><strong>1</strong>')
		page = urllib.urlopen(self.siteURL)
		html = page.read()
		content = re.findall(pattern, html)
		contentList = content[0].split()
		string = contentList[-1]
		pageNum = filter(str.isdigit, string)

		return pageNum

	#找到所有的标题
	def getAllTitleURL(self, pageURL):
		pattern = re.compile('<span class="link_title"><a href="(.*?)">', re.S)
		page = urllib.urlopen(pageURL)
		html = page.read()
		items = re.findall(pattern, html)
		return items
	
	#获取一篇文章的内容
	def getBrief(self, pageURL):
		pattern = re.compile('<div id="article_content"(.*?)</div>', re.S)
		page = urllib.urlopen(pageURL)
		html = page.read()
		result = re.search(pattern, html)
		content = result.group(0)
		return content.strip()

	#保存文章
	def saveBrief(self, content, fileName, pageURL):
		conList = pageURL.split('/')
		dirPath = conList[1]
		dirPath = self.basePath + '/' + dirPath
		if os.path.exists(dirPath) == False:
			os.mkdir(dirPath)
		fileName = dirPath + '/' + fileName
		f = open(fileName, "w+")
		f.write(content)

	#查找对应的文章的标题
	def findPageTitle(self, pageURI, pageURL):
		keyInfo = "<span class=\"link_title\"><a href=\"" + pageURI + "\">(.*?)</a>"
		pattern = re.compile(keyInfo, re.S);
		page = urllib.urlopen(pageURL)
		html = page.read()
		title = re.findall(pattern, html)
		titlePattern = re.compile(r'<[^>]+>', re.S)
		result = titlePattern.sub('', title[0])
		return result.strip()

	def subHtmlLabel(self, context):
#[^>]表示匹配除去‘>’符号外的所有其他符号,+表示这类符号出现次数不限,即该字符串匹配'<任意内容>'
		pattern = re.compile(r'<[^>]+>', re.S)
		result = pattern.sub('', context)
		return result

	def savePerPageInfo(self, pageURL):
		contents = self.getAllTitleURL(pageURL)
		for item in contents:
			self.num += 1
			perPageURL = self.blogURLHead + item
			pageTitle = self.findPageTitle(item, perPageURL)
			brief = self.getBrief(perPageURL)
			result = self.subHtmlLabel(brief)
			self.saveBrief(result, pageTitle, item)


	def savePageInfo(self):
		pageNum = self.getPageNum()
		for i in range(1, int(pageNum)+1):
			pageURL = self.siteURL + "/article/list/" + str(i)
			self.savePerPageInfo(pageURL)


spider = Spider(sys.argv[1])
spider.savePageInfo()



  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值