文档章节

开源中国推荐博客爬虫

ismdeep
 ismdeep
发布于 2016/04/16 23:04
字数 465
阅读 158
收藏 12

话不多说,直接上代码。

# coding: utf-8

import urllib
import urllib2
import re
import MySQLdb

req_header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36'}

####################################################################################
conn = MySQLdb.connect(host="localhost",user="root",passwd="root",db="osc_recommend_blog",port=3306)
cur  = conn.cursor()
cur.execute("set names utf8")

def is_exist(id):
	sql = "select * from blog where id='%s'"%(id)
	cur.execute(sql)
	result = cur.fetchall()
	if len(result) > 0:
		return True
	else:
		return False

def add_blog(id='',url='',title='',user_id='',user_name='',user_url='',content='',post_time='1970-01-01 00:00:00'):
	title = MySQLdb.escape_string(title)
	user_name = MySQLdb.escape_string(user_name)
	content = MySQLdb.escape_string(content)
	sql = "insert into blog(id,url,title,user_id,user_name,user_url,content,post_time) values('%s','%s','%s','%s','%s','%s','%s','%s')"%(id,url,title,user_id,user_name,user_url,content,post_time)
	try:
		cur.execute(sql)
	except:
		content = ""
		sql = "insert into blog(id,url,title,user_id,user_name,user_url,content,post_time) values('%s','%s','%s','%s','%s','%s','%s','%s')"%(id,url,title,user_id,user_name,user_url,content,post_time)
		cur.execute(sql)

####################################################################################

def get_blog_id (url):
	while url.find('/') >= 0:
		url = url[url.find('/')+1:]
	return url

def get_blog_fromerr(url):
	content = get_content(url)
	pattern = re.compile('<script>location.href=.*?;</script>',re.S)
	fromerrs = re.findall(pattern,content)
	ans = fromerrs[0]
	ans = ans[ans.find("<script>location.href=\"")+len("<script>location.href=\""):]
	ans = ans[:ans.find("\";</script>")]
	return ans

def get_content(url):
	req = urllib2.Request(url, None, req_header)
	resp = urllib2.urlopen(req,None,30)
	content = resp.read()
	return content

def get_blog_content(content):
	pattern = re.compile("<div class='BlogContent'>.*?<div class='BlogShare'>", re.S)
	blog_content = re.findall(pattern, content)[0]
	blog_content = blog_content[:len(blog_content)-len("<div class='BlogShare'>")]
	return blog_content

def get_blog_post_time(blog_html):
	pattern = re.compile("<div class='BlogStat'>.*?发表于.*?前((.*?))&nbsp;&nbsp;",re.S)
	post_time = re.findall(pattern, blog_html)[0]
	ans = post_time[0]
	ans = ans[1:]
	ans = ans[:len(ans)-1]
	ans += ":00"
	return ans

def get_page(page_id):
	url = 'http://www.oschina.net/blog/more?p=%d'%(page_id)
	print '                    %s'%(url)
	content = get_content(url)
	pattern = re.compile("<ul class='BlogList'>.*?</ul>",re.S)
	content = re.findall(pattern,content)[0]
	pattern = re.compile("<li>.*?</li>", re.S)
	blog_list = re.findall(pattern, content)
	for item in blog_list:
		#print item
		pattern = re.compile("<h3><a href=\"(.*?)\" target=\'_blank\'>(.*?)</a></h3>", re.S)
		tmp = re.findall(pattern, item)[0]
		url = tmp[0]
		title = tmp[1]
		blog_id = get_blog_id(url)
		if not is_exist (blog_id):
			print "%50s +"%(url)
			pattern = re.compile("<a href=\"(.*?)\" class='u' target='_blank'><img src=\".*?\" align=\".*?\" alt=\".*?\" title=\"(.*?)\" class=\".*?\" user=\"(.*?)\"/></a>",re.S)
			tmp = re.findall(pattern, item)[0]
			user_url = tmp[0]
			user_name = tmp[1]
			user_id = tmp[2]
			blog_html = get_content(url + get_blog_fromerr(url))
			try:
				blog_content = get_blog_content(blog_html)
			except:
				continue
			blog_posttime = get_blog_post_time(blog_html)
			add_blog(id=blog_id,url=url,title=title,user_id=user_id,user_name=user_name,user_url=user_url,content=blog_content,post_time=blog_posttime)
		else:
			print "%50s"%(url)
		print '------------------------------------------'

if __name__=="__main__":
	for i in range(1,26):
		get_page(i)

© 著作权归作者所有

ismdeep
粉丝 17
博文 21
码字总数 6067
作品 1
上饶
程序员
私信 提问
OSChina 技术周刊第二十七期 —— 每周技术精粹

每周技术抢先看,总有你想要的! 移动开发 【博客】编程第一个Apple Watch 程序创建项目 【博客】如何通过使用 fiddler 对安卓系统设备抓包总结 前端开发 【软件】CSS 动画加载效果 Loaders....

OSC编辑部
2015/03/29
130
0
年薪20万Python工程师进阶(1):Python 资源 + 经典练手项目

Python 越来越火爆,最近自己也在学习。整理下一些 Python 资料,和练手的项目。希望对你学习 Python 有所帮助。 1、入门阶段 1 Python 官网 Python 官网 The Python Tutorialdocs.python.o...

程序员八阿哥
2018/05/11
0
0
OSChina 技术周刊第27期 —— Git@OSC 支持 SVN

每周技术抢先看,总有你想要的! 没错没错,本周最热门 —— Git@OSC 支持 SVN 了!!! 移动开发 【博客】如何通过使用 fiddler 对安卓系统设备抓包总结 【博客】编程第一个 Apple Watch 程...

OSC编辑部
2015/03/29
1K
0
开源头条公测版上线 —— 开发者专属的头条

一直以来都有不少用户表示,开源中国每天产出的资讯数量太少,哪怕是攒了一周的资讯,不一会儿也就看完了,意犹未尽而心难平,如同进入贤者时刻一般。 本着“为开发者服务”的使命,既然开发...

oschina
07/02
11.1K
33
嘿哥们,全国最大的“同性交友”APP了解一下?

嗯,是这样的,开源中国社区成立于2008年8月,旨在为中国的IT技术人员提供一个全面的、快捷更新的用来检索开源软件以及交流使用开源经验的平台。 当然,为了用户能够随时随地在社区中聊天、交...

oschina
2018/06/23
11.4K
28

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
12
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
4
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.3K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部