码迷,mamicode.com
首页 > 编程语言 > 详细

python提取百度经验<标题,发布时间,平均流量,总流量,具体的链接>

时间:2015-07-16 13:25:30      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:

之前想研究下怎么抓网页数据.然后就有了下面的练习了.

如有BUG.也纯属正常. 只是练习.请勿投入产品使用.

技术分享技术分享

#!/usr/bin/python
# -*- coding: utf-8 -*-
#Filenaem: tqjinyan.py

import os,sys,time,urllib2,re
import cookielib
import multiprocessing
import datetime,time

#定义存储完整的数据字典
#keyword: 具体短链接地址,发布时间,标题,平均每天浏览量,更新时间,总浏览量,链接地址
userJinYanAll={}

#提取用户总共有多少经验
def tiquNumber(url):
    regex = re.compile(r&pn=(\d{1,10})")
    web=urllib2.urlopen(url).read()
    num= regex.findall(web)
    if not len(num):
        num.append(1)
    num=map(int,num)
    num.sort()
    return num[-1]

#拼接每一页的链接,返回链接的列表
def retJinYanYe(url,num):
    # print ‘准备获取分页页面...‘
    yesNumLianjie=[]
    for i in range(0,num+1,7):
        yesNumLianjie.append(url+"&pn="+str(i))
    return yesNumLianjie

#返回分页经验
def retNumTitle(jylist):
    numjisu=0
    for url in jylist:
        numjisu+=1
        #定义正则,链接,发布时间,标题
        regex_href = re.compile(r<p class="tit"><a href="(.{1,200})" title=")
        regex_time=re.compile(<span class="exp-time">(.{1,12})</span>)
        regex_title=re.compile(" title="(.{1,80})" target="_blank">)
        #定义字典关键词
        regex_keyword=re.compile(e/(.{1,50}).html)
        #获取web分页中的数据
        web=urllib2.urlopen(url).read()
        #获取链接,发布时间,标题
        href=regex_href.findall(web)
        exp_time=regex_time.findall(web)
        title=regex_title.findall(web)
        #进行循环添加至列表的字典中
        # print url
        for i in range(0,len(title)):
            #定义一个空列表,用于添加至列表字典中
            userlist=[]
            keyword = regex_keyword.findall(href[i])
            # print keyword
            userlist.append(href[i])
            userlist.append(exp_time[i])
            userlist.append(title[i])
            # print keyword
            userJinYanAll[keyword[0]]=userlist
        # printstdout(‘\r正在获取第  %i  页的经验信息...‘ % numjisu)


        # print userJinYanAll

#根据地址,使用cookie浏览具体页面,返回浏览量,更新时间
def retLiuLanNum(keyword,url,i):
    loginUrl=http://jingyan.baidu.com+url
    #以cookie来访问具体的网页
    # cj = cookielib.CookieJar()
    # opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    # urllib2.install_opener(opener)
    # resp = urllib2.urlopen(loginUrl)
    req=urllib2.Request(loginUrl,data="")
    f=urllib2.urlopen(req).read()
    regex_liulannum = re.compile(r<span class="views">(\d{1,10})</span>)
    regex_updateTime=re.compile(r<time>(.{1,20})</time>)
    viewsNum=regex_liulannum.findall(f)
    updateTime=regex_updateTime.findall(f)
    #平均流量
    if int(viewsNum[0])!=0:
        jianGeDay=pingJunNum(keyword,updateTime[0],viewsNum[0])
        pjNum=int(viewsNum[0])/int(jianGeDay)/1.00
        if pjNum<1:
            userJinYanAll[keyword].append(-)
        else:
            userJinYanAll[keyword].append(str(pjNum))
        # print pjNum
    else:
        userJinYanAll[keyword].append(-)
    # print pingJunNum(keyword,updateTime,viewsNum)
    # sys.exit()
    # print viewsNum,updateTime
    userJinYanAll[keyword].append(updateTime[0])
    userJinYanAll[keyword].append(viewsNum[0])
    userJinYanAll[keyword].append(loginUrl)
    # print userJinYanAll
    # sys.exit()
#下面这句.因为格式需要<换成两行,如需测试.自行优化下格式.
print str(i)+"\t\t"+userJinYanAll[keyword][1]+"\t"+userJinYanAll[keyword][5]+
      "\t"+userJinYanAll[keyword][3]+"\t"+userJinYanAll[keyword][2]+"\t"+userJinYanAll[keyword][6] def getcookie(): loginUrl=http://jingyan.baidu.com/article/ed2a5d1f1938f909f7be174f.html cj = cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) resp=urllib2.urlopen(loginUrl) f = urllib2.urlopen(url= loginUrl) def menu(url): try: #获取用户姝经验分页 # print ‘提取经验总数量...‘ numYe=tiquNumber(url) #根据分页链接获取每页上面的链接 jylist=retJinYanYe(url,numYe) # print ‘总共有:%s页经验.‘%len(jylist) # print ‘根据分页信息获取具体链接..‘ # print jylist retNumTitle(jylist) # for t in jylist: #根据链接生成字典数据 # retNumTitle(t) # print ‘共有:%s篇经验.‘%len(userJinYanAll) # print ‘获取Cookie信息中...‘ getcookie() # print ‘获取每篇经验具体的经验信息,此时间比较久,请耐心等待...‘ # print ‘----------输出具体的经验列表----------‘ # print ‘序列\t发布时间\t总浏量\t平均每天的浏览量\t\t标题\t\t\t具体链接‘ i=0 for k,v in userJinYanAll.items(): i+=1 retLiuLanNum(k,v[0],i) # print "%s:%s"%(k,v) # for k,v in userJinYanAll.items(): # print k,v # print v[4]+"\t"+v[2]+"\t"+v[1]+"\t"+v[3]+"\t"+v[5] # print ‘-‘*50 # print userJinYanAll return userJinYanAll # userjianyanpaixu=sorted(userJinYanAll.iteritems(),key=lambda asd:asd[1],reverse=True) # for k,v in userjianyanpaixu.items(): # i+=1 # print str(i)+"\t\t"+userjianyanpaixu[1]+"\t"+userjianyanpaixu[5]+"\t"+userjianyanpaixu[3]+
     #    "\t"+userjianyanpaixu[2]+"\t"+userjianyanpaixu[6]
# # print userJinYanAll except KeyboardInterrupt,e: return e # print "QUIT" def printstdout(printname): sys.stdout.write("\r%s"%printname) sys.stdout.flush() def pingJunNum(keyword,update,num): # print keyword,update,num updatetime=datetime.datetime.strptime(update,%Y-%m-%d %H:%M) newde=datetime.datetime.now() chadate= newde-updatetime return str(chadate).split( )[0] def sys_input(): url_baidu=http://jingyan.baidu.com/user/npublic/expList?un= raw_str=urllib2.quote(raw_input(请输入用户百度经验ID: )) url=url_baidu+raw_str menu(url) # userjianyanpaixu=sorted(userJinYanAll.iteritems(),key=lambda asd:asd[1],reverse=True) # print userjianyanpaixu # for i in userjianyanpaixu: # print i[1] def sys_input_wap(baidujyid): url_baidu=http://jingyan.baidu.com/user/npublic/expList?un= # raw_str=urllib2.quote(baidujyid) url=url_baidu+baidujyid returntest(url) # return url def returntest(url): web=urllib2.urlopen(url).read() return web if __name__=="__main__": sys_input()

=======================================================

||                  好吧. 代码如上. 或许有BUG.并且没有进行重构.优化.                                 ||
||            已知问题.百度会有相关IP访问频率屏蔽.所以不适合商用.仅测试.                          ||

=======================================================

 

python提取百度经验<标题,发布时间,平均流量,总流量,具体的链接>

标签:

原文地址:http://www.cnblogs.com/drgcaosheng/p/4650693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!