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中请使用isinstance()判断变量类型
Aug 25 Python
Python中使用PIPE操作Linux管道
Feb 04 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
python实现图片批量压缩程序
Jul 23 Python
Python构建图像分类识别器的方法
Jan 12 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
python3 深浅copy对比详解
Aug 12 Python
python实现批量转换图片为黑白
Jun 16 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
Aug 03 Python
Python unittest生成测试报告过程解析
Sep 08 Python
python实现局部图像放大
Nov 17 Python
python字符串的一些常见实用操作
Apr 06 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日期时间函数的高级应用技巧
2009/05/16 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
Javascript中 toFixed四舍六入方法
2017/08/21 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
详解Angular6学习笔记之主从组件
2018/09/05 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
Python中统计函数运行耗时的方法
2015/05/05 Python
在Python中移动目录结构的方法
2016/01/31 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
python抽取指定url页面的title方法
2018/05/11 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
2019/07/04 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
pytorch实现线性拟合方式
2020/01/15 Python
python 通过文件夹导入包的操作
2020/06/01 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Python 代码调试技巧示例代码
2020/08/11 Python
信息管理专业推荐信
2013/10/29 职场文书
会计出纳岗位职责
2013/12/25 职场文书
总经理秘书工作职责
2013/12/26 职场文书
售房协议书
2014/08/19 职场文书
法人委托书范本格式
2014/09/15 职场文书
公司委托书格式范本
2014/09/16 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
正确使用MySQL update语句
2021/05/26 MySQL
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers