python实现博客文章爬虫示例


Posted in Python onFebruary 26, 2014
#!/usr/bin/python
#-*-coding:utf-8-*-
# JCrawler
# Author: Jam <810441377@qq.com>
import time
import urllib2
from bs4 import BeautifulSoup
# 目标站点
TargetHost = "http://adirectory.blog.com"
# User Agent
UserAgent  = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36'
# 链接采集规则
# 目录链接采集规则
CategoryFind    = [{'findMode':'find','findTag':'div','rule':{'id':'cat-nav'}},
                   {'findMode':'findAll','findTag':'a','rule':{}}]
# 文章链接采集规则
ArticleListFind = [{'findMode':'find','findTag':'div','rule':{'id':'content'}},
                   {'findMode':'findAll','findTag':'h2','rule':{'class':'title'}},
                   {'findMode':'findAll','findTag':'a','rule':{}}]
# 分页URL规则
PageUrl  = 'page/#page/'
PageStart = 1
PageStep  = 1
PageStopHtml = '404: Page Not Found'
def GetHtmlText(url):
    request  = urllib2.Request(url)
    request.add_header('Accept', "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp")
    request.add_header('Accept-Encoding', "*")
    request.add_header('User-Agent', UserAgent)
    return urllib2.urlopen(request).read()
def ArrToStr(varArr):
    returnStr = ""
    for s in varArr:
        returnStr += str(s)
    return returnStr

def GetHtmlFind(htmltext, findRule):
    findReturn = BeautifulSoup(htmltext)
    returnText = ""
    for f in findRule:
        if returnText != "":
            findReturn = BeautifulSoup(returnText)
        if f['findMode'] == 'find':
            findReturn = findReturn.find(f['findTag'], f['rule'])
        if f['findMode'] == 'findAll':
            findReturn = findReturn.findAll(f['findTag'], f['rule'])
        returnText = ArrToStr(findReturn)
    return findReturn
def GetCategory():
    categorys = [];
    htmltext = GetHtmlText(TargetHost)
    findReturn = GetHtmlFind(htmltext, CategoryFind)
    for tag in findReturn:
        print "[G]->Category:" + tag.string + "|Url:" + tag['href']
        categorys.append({'name': tag.string, 'url': tag['href']})
    return categorys;
def GetArticleList(categoryUrl):
    articles = []
    page = PageStart
    #pageUrl = PageUrl
    while True:
        htmltext = ""
        pageUrl  = PageUrl.replace("#page", str(page))
        print "[G]->PageUrl:" + categoryUrl + pageUrl
        while True:
            try:
                htmltext = GetHtmlText(categoryUrl + pageUrl)
                break
            except urllib2.HTTPError,e:
                print "[E]->HTTP Error:" + str(e.code)
                if e.code == 404:
                    htmltext = PageStopHtml
                    break
                if e.code == 504:
                    print "[E]->HTTP Error 504: Gateway Time-out, Wait"
                    time.sleep(5)
                else:
                    break
        if htmltext.find(PageStopHtml) >= 0:
            print "End Page."
            break
        else:
            findReturn = GetHtmlFind(htmltext, ArticleListFind)
            for tag in findReturn:
                if tag.string != None and tag['href'].find(TargetHost) >= 0:
                    print "[G]->Article:" + tag.string + "|Url:" + tag['href']
                    articles.append({'name': tag.string, 'url': tag['href']})
            page += 1
    return articles;
print "[G]->GetCategory"
Mycategorys = GetCategory();
print "[G]->GetCategory->Success."
time.sleep(3)
for category in Mycategorys:
   print "[G]->GetArticleList:" + category['name']
   GetArticleList(category['url'])
Python 相关文章推荐
python通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
Python语言实现机器学习的K-近邻算法
Jun 11 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
利用Python命令行传递实例化对象的方法
Nov 02 Python
Python常用库推荐
Dec 04 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
python数据结构之列表和元组的详解
Sep 23 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
Python多继承原理与用法示例
Aug 23 Python
python实现查找所有程序的安装信息
Feb 18 Python
python处理中文编码和判断编码示例
Feb 26 #Python
python实现网页链接提取的方法分享
Feb 25 #Python
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 #Python
python实现socket客户端和服务端简单示例
Feb 24 #Python
python抓取网页内容示例分享
Feb 24 #Python
使用python装饰器验证配置文件示例
Feb 24 #Python
python通过urllib2爬网页上种子下载示例
Feb 24 #Python
You might like
PHP.MVC的模板标签系统(一)
2006/09/05 PHP
一个php作的文本留言本的例子(五)
2006/10/09 PHP
PHP读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
js中运算符&amp;&amp; 和 || 的使用记录
2014/08/21 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
vue $mount 和 el的区别说明
2020/09/11 Javascript
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
2019/04/29 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
大专自我鉴定范文
2013/10/01 职场文书
思想汇报格式
2014/01/05 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
敬老模范事迹
2014/05/21 职场文书
团日活动总结怎么写
2014/06/25 职场文书
体育专业求职信
2014/07/16 职场文书
辞职信标准格式
2015/02/27 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS