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实现代码行数统计示例分享
Feb 10 Python
Python最基本的数据类型以及对元组的介绍
Apr 14 Python
一个Python最简单的接口自动化框架
Jan 02 Python
Python实现分段线性插值
Dec 17 Python
python读取有密码的zip压缩文件实例
Feb 08 Python
scrapy-redis的安装部署步骤讲解
Feb 27 Python
python实现中文文本分句的例子
Jul 15 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
python爬虫请求头设置代码
Jul 28 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 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文件读写操作相关函数总结
2014/11/18 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
php通过执行CutyCapt命令实现网页截图的方法
2016/09/30 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
Python操作MongoDB数据库的方法示例
2018/01/04 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
wxpython绘制圆角窗体
2019/11/18 Python
解决安装pyqt5之后无法打开spyder的问题
2019/12/13 Python
python 实现图片裁剪小工具
2021/02/02 Python
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
新闻专业个人自我评价
2013/09/21 职场文书
新郎父亲婚宴答谢词
2014/01/11 职场文书
会计学自我鉴定
2014/02/06 职场文书
现场施工员岗位职责
2015/04/11 职场文书
超级礼物观后感
2015/06/15 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
如何书写邀请函?
2019/06/24 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP