运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中

原文地址:运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中

依赖包:

1.jieba

2.pymongo

3.HTMLParser

# -*- coding: utf-8 -*-
"""
@author: jiangfuqiang
"""

from HTMLParser import  HTMLParser
import re
import time
from datetime import  date
import pymongo
import urllib2
import sys
import traceback
import jieba

default_encoding = ‘utf-8‘
if sys.getdefaultencoding() != default_encoding:
    reload(sys)
    sys.setdefaultencoding(default_encoding)
isExist = False

class FetchCnblog(HTMLParser):
    def __init__(self, id):
        HTMLParser.__init__(self)
        self.result = []
        self.data = {}
        self.isTitleLink = False
        self.id = id
        self.isSummary = False
        self.isPostItem = False
        self.isArticleView = False

    def handle_data(self, data):
        if self.isTitleLink and self.isPostItem:
            self.data[‘title‘] = data
            self.isTitleLink = False
        elif self.isSummary and self.isPostItem:
            data = data.strip()
            if data:
                self.data[‘desc‘] = data

    def handle_starttag(self, tag, attrs):
        if tag == ‘a‘:
            for key, value in attrs:
                if key == ‘class‘:
                    if value == ‘titlelnk‘:
                        self.isTitleLink = True
                    elif value == ‘gray‘ and self.isArticleView:
                        self.isArticleView = False
                        for key, value in attrs:
                            if key == ‘href‘:
                                self.data[‘readmoreLink‘] = value
                                reg = ‘d+‘
                                result = re.search(reg,value)
                                self.isPostItem = False

                                if result:
                                    self.data[‘id‘] = int(result.group())
                                else:
                                    self.data = {}
                                    return
                                if self.data[‘id‘] <= self.id:
                                    self.data = {}
                                    isExist = True
                                    return
                                else:
                                    self.data[‘srouce‘] = "www.cnblogs.com"
                                    self.data[‘source_key‘] = ‘cnblogs‘
                                    self.data[‘fetchTime‘] = str(date.today())
                                    self.data[‘keyword‘] = ",".join(jieba.cut(self.data[‘title‘]))
                                    self.result.append(self.data)
                                    self.data = {}

        elif tag == ‘p‘:
            for key, value in attrs:
                if key == ‘class‘ and value == ‘post_item_summary‘:
                    self.isSummary = True
        elif tag == ‘img‘:
            for key, value in attrs:
                if key == ‘class‘ and value == ‘pfs‘:
                    for key, value in attrs:
                        if key == ‘src‘:
                            self.data[‘imgSrc‘] = value

        elif tag == ‘div‘:
            for key, value in attrs:
                if key == ‘class‘ and value == ‘post_item_foot‘:
                    self.isSummary = False
                elif key == ‘class‘ and value == ‘post_item‘:
                    self.isPostItem = True
        elif tag == ‘span‘:
            for key , value in attrs:
                if key == ‘class‘ and value == ‘article_view‘:
                    self.isArticleView = True

    def getResult(self):

        return self.result

if __name__ == "__main__":
    con = pymongo.Connection(‘localhost‘, 27017)
    db = con.blog
    fetchblog = db.fetch_blog
    record = db.record
    url = "http://www.cnblogs.com/sitehome/p/%d"
    count = 1
    flag = False
    headers={
             ‘User-Agent‘:‘Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US。 rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6‘}
    reco = record.find_one({"type":‘cnblogs‘})
    id = 0
    if reco:
        id = reco[‘maxId‘]
    while isExist == False:
        try:
            req = urllib2.Request(url%count,headers=headers)
            request = urllib2.urlopen(req)
            data = request.read()
            fj = FetchCnblog(id)
            fj.feed(data)
            result = fj.getResult()
            if len(result) < 1:
                isExist = True
            else:
                if flag == False:
                    flag = True
                    dic = result[0]
                    id = int(dic[‘id‘])
                    record.update({"type":‘cnblogs‘},{"$set":{‘maxId‘:id}},True,False)
                result.reverse()
                for doc in result:
                    fetchblog.insert(doc)
                print "page is %d"%count
                count += 1

                time.sleep(5)
        except Exception, e:
            traceback.print_exc()
            print "parse error",e

程序假设在linux,mac下运行。在可在crontab -e中设置定时任务,假设在windows运行,则自己再在程序里加个定时器就可以
时间: 2024-10-12 17:51:39

运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中的相关文章

运用python抓取博客园首页的全部数据,并且定时持续抓取新发布的内容存入mongodb中

原文地址:运用python抓取博客园首页的全部数据,并且定时持续抓取新发布的内容存入mongodb中 依赖包: 1.jieba 2.pymongo 3.HTMLParser # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ from HTMLParser import HTMLParser import re import time from datetime import date im

.NET Core 实现定时抓取博客园首页文章信息并发送到邮箱

前言 大家好,我是晓晨.许久没有更新博客了,今天给大家带来一篇干货型文章,一个每隔5分钟抓取博客园首页文章信息并在第二天的上午9点发送到你的邮箱的小工具.比如我在2018年2月14日,9点来到公司我就会收到一封邮件,是2018年2月13日的博客园首页的文章信息.写这个小工具的初衷是,一直有看博客的习惯,但是最近由于各种原因吧,可能几天都不会看一下博客,要是中途错过了什么好文可是十分心疼的哈哈.所以做了个工具,每天归档发到邮箱,妈妈再也不会担心我错过好的文章了.为什么只抓取首页?因为博客园首页文章

【Python3 爬虫】爬取博客园首页所有文章

首先,我们确定博客园首页地址为:https://www.cnblogs.com/ 我们打开可以看到有各种各样的文章在首页,如下图: 我们以上图标记的文章为例子吧!打开网页源码,搜索Docker,搜索结果如下图: 从上图后红色标记部分可以看出,我们使用正则表达式即可匹配该网址,我们匹配到该网址之后,将该网址对应的内容下载到到底进行存储. 实现代码 import urllib.request import re """ 爬取cnblogs首页所有的文章 ""&

python+scrapy分析博客园首页4000篇优质博客(图解)

1.侵删 本文数据是获取的博客园首页的4000条数据,为了不对博客园服务器造成压力,所以源码不会公开,在此,敬请博客园官方团队放心. 获取到的数据从2019-7-11到2019-9-12,此数据也不会公开. 由于会涉及到一些博主的数据,所以有博主不愿公开数据,联系我及时删除. 2.先上数据分析结果 写文最多的博主top6 ---->(最勤劳的博主)?(′?`*) 黑白影-->发文54篇 周国通-->发文38篇 宜信技术-->发文30篇 削微寒-->发文28篇 泰斗贤若如--&

Python BeautifulSoup 抓取博客园首页精华

#coding:utf-8'''Created on 2015?-4-5 @author: Administrator'''from bs4 import BeautifulSoupimport urllib2import sysreload(sys)sys.setdefaultencoding('utf-8') '''爬虫函数'''def GetCnBlog(cnt):    url='http://www.cnblogs.com/sitehome/p/'    if cnt<1 or cnt

python爬取博客园首页文章

先上代码,比较长. 1 # -*- coding=utf-8 -*- 2 __author__ = 'lhyz' 3 4 import urllib 5 import re 6 import socket 7 import time 8 import os 9 10 #使用当前时间创建文件夹 11 ISOTIMEFORMAT='%Y-%m-%d-%X' 12 times=time.strftime( ISOTIMEFORMAT, time.localtime() ) 13 dir='./%s'%

利用Abot 抓取博客园新闻数据

1. 引言 相比于Java而言,基于C#的开源爬虫就少了很多.入行这么多年也从未接触过爬虫.出于兴趣今天给大家介绍一个C# 的爬虫工具Abot. 需要使用可以通过Nuget获取.Abot本身就支持多线程的爬取, 内部使用CsQuery来解析爬取到的Html文档.熟悉jQuery的同学肯定能快速上手CsQuery, 它就是一个C#版本的jQuery. 这里以爬取博客园当天的新闻数据为例,看看如何使用Abot. 2. 博客园新闻页面 http://news.cnblogs.com/ 这是博客园的新闻

Python爬虫入门教程:博客园首页推荐博客排行的秘密

1. 前言 虽然博客园注册已经有五年多了,但是最近才正式开始在这里写博客.(进了博客园才知道这里面个个都是人才,说话又好听,超喜欢这里...)但是由于写的内容都是软件测试相关,热度一直不是很高.看到首页的推荐博客排行时,心里痒痒的,想想看看这些大佬究竟是写了什么文章这么受欢迎,可以被推荐.所以用Python抓取了这100位推荐博客,简单分析了每个博客的文章分类,阅读排行榜,评论排行榜及推荐排行榜,最后统计汇总并生成词云.正好这也算是一篇非常好的Python爬虫入门教程了. 2. 环境准备 2.1

简单爬虫-抓取博客园文章列表

原文:简单爬虫-抓取博客园文章列表 如果使用对方网站数据,而又没有响应的接口,或者使用接口不够灵活的情况下,使用爬虫在合适不过了.爬虫有几种,对方网站展示形式有几种都是用分析,每个网站展示有相似的地方,有不同的地方. 大部分使用httpRequst就能完成,不管是否添加了口令.随即码.请求参数.提交方式get或者post.地址来源.多次响应等等.但是有些网站使用ajax如果是返回json或固定格式的也好处理,如果是很复杂的,可以使用webbrower控件进行抓取,最后正则解析,获取所需要的数据即