注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

百度文章爬虫(完整版)  

2011-09-28 18:08:00|  分类: Web技术-Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一 代码

#coding:gb2312

import urllib2,urllib,re,os
import sqlite3,cookielib,time
'''
    百度爬虫类
    @author:FC_LAMP
'''
class SpiderBaiDu:
   #变量
    sqlit = None
    cur   = None
    baseurl = 'http://hi.baidu.com'
    total  = 0
    #处理单引号
    def qutoSin(self,string):

        return string.replace("'","")

 

    #登陆百度空间
    '''
      user 为用户名
      pwd  为password
    '''
    def LoginBaiDu(self,user,pwd):
        
        #设置
        cookie = cookielib.CookieJar()
        cookieProc = urllib2.HTTPCookieProcessor(cookie)
        opener = urllib2.build_opener(cookieProc)
        urllib2.install_opener(opener)

        #请求
        header = {'User-Agent':'Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2'}
        post = {
            'username':user,
            'password':pwd,
            'tpl':'mn',
            'u':'http://www.baidu.com/',
            'psp_tt':0,
            'mem_pass':'on'
            }
        post = urllib.urlencode(post)
        
        req = urllib2.Request(
            url='https://passport.baidu.com/?login',
            data=post,
            headers = header
            )
        res = urllib2.urlopen(req).read(500)
        
        if 'passCookie' in res:
            flag = True
        else:
            flag = 'Login Fail:%s'%user
            
        return flag


    #创建数据库
    '''
        dbFile 为数据库文件
    '''
    def created_db(self,dbFile):
        #
        dbFile = dbFile.replace("\\","/")
        self.sqlit = sqlite3.connect(dbFile)
        self.cur = self.sqlit.cursor()
        sql = """
            CREATE TABLE IF NOT EXISTS `article`
            (
                 a_id char(24) PRIMARY KEY,
                 title varchar(255),
                 created_time datetime,
                 category varchar(255),
                 orgurl varchar(255),
                 content text
            )
            """
        self.cur.execute(sql)
        self.sqlit.commit()
     
        
        
    #分析页面
    '''
        url 为要分析页面的起始URL
        debug 当为True时,将会打印出调试信息
    '''
    def parse_html(self,url,debug=False):
        
        while True:
            c = urllib2.urlopen(url).read()
            
            #标题,时间
            #正则编义(注意后面的修饰)
            p = re.compile(
                    r'<div.*?id="?m_blog"?.*?<div.*?class="?tit"?>(.*?)<\/div>.*?<div.*?class="?date"?>(.*?)<\/div>',
                    re.S|re.I
                    )
            m = p.search(c)
            if m==None:
                break
            title = m.group(1).strip()
            date  = m.group(2).strip()
            date  = date.split(' ')
            date  = date[0]+' '+date[1]
            
            #内容
            s = re.compile(
                    r'<div\s*?id="?blog_text"?\s*?class="?cnt"?\s*?>(.*?)<\/div>',
                    re.S|re.I
                )
            m = s.search(c)
         
            content = m.group(1).strip()

            #类别
            s = re.compile(
                    '类别:(.*?)<\/a>',
                    re.S|re.I|re.U
                )
            m = s.search(c)
            category = m.group(1).strip()

            #源链接
            orgurl = re.compile(
                    'myref.*?=.*?encodeURIComponent\("(.*?)"\)',
                    re.S|re.I|re.U
                )
            orgurl = orgurl.search(c)
            orgurl = orgurl.group(1).strip()
            aid = os.path.split(orgurl)
            aid = aid[1].split('%2E')[0]
            
       


            #通过元组
            sql = 'insert into `article`(a_id,title,created_time,category,orgurl,content)'
            values = "values('%s','%s','%s','%s','%s','%s')"%(aid,self.qutoSin(title),date,self.qutoSin(category),orgurl,self.qutoSin(content))
            sql+=values
            
            #插入数据库
            self.cur.execute(sql)
            self.sqlit.commit()
            self.total +=1

            #下一篇
            nexturl = re.compile(
                    'var\s*?post\s*?=\s*?\[true,\'.*?\',\'.*?\',(.*?)]',#注意这里最后一个]没手动加转义符\
                     re.S|re.I|re.U
                )
            nexturl = nexturl.search(c)
            if nexturl==None:
                break
            nexturl = self.qutoSin(nexturl.group(1).strip()).replace("\\",'')
            nexturl = self.baseurl+nexturl
            url = nexturl
            #输出调试信息
            if debug:
                print(title)
                print(date)
                print('nextUrl:'+url+'\n')
           #睡上一秒

           time.sleep(1)  

 

二 例子

我们可以单独把SpiderBaiDu()类放一个模块,在使用时就很方便,下面这个例子是一个不登陆爬取的例子。

#coding:gb2312
import spider,time#导入模块

if __name__ == '__main__':

    st = time.time()
    print('解析中......')

    spider = spider.SpiderBaiDu()

   #若要登陆加上:spider.LoginBaiDu(xxxx,xxxxx)

    spider.created_db(r"D:\test2.db3")
    url = 'http://hi.baidu.com/fc_lamp/xxxxxxx.html'#起始URL
    try:
        spider.parse_html(url,debug=True)
    except Exception as e:
        print('Error:',e)

    et = time.time()
    c = et - st
    print('程序运行耗时:%0.2fs'%c)
    print('总共爬取了 %d 篇文章'%spider.total)

 

三 结果

1过程:

百度文章爬虫(完整版) - fc-lamp - fc-lamp的博客

2 数据文件:

  百度文章爬虫(完整版) - fc-lamp - fc-lamp的博客

 

#参考资料
#关于python里正则使用 参看 1http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

ps :爬虫慎用~~~

     关于文章中图片如何真实保存下来,请参看: 《批量下载百度空间文章(包括文章中图片的下载)》

  评论这张
 
阅读(2715)| 评论(22)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017