半自动抓取知乎用户的微博地址(python)(2)

上次说到静态网页和动态网页的事儿,在网上看了许久,发现动态网页的解析对我来说太难了(毕竟还没学过),那有没有替代的方法呢?我想起了浏览器的开发者工具(F12),里面的审查元素可以看到很多内容,包括动态网页的部分,我尝试在其中搜索了一下后面15个人的信息,发现能搜到,那我只要把这个复制下来就好了啊~


果断复制HTML代码,然后就粘贴进一个txt文件就好了。


接下来得更新一下原有的模块:

(1)ReadUsername.py

import re
#导入模块

def readUsername(filename=''):
    f=open(filename).read()
    pattern=re.compile(r'/people/+[\w\d-]*')
    finduser=re.findall(pattern,f)
    #搜索所有含有'/people/username'的标签
    user=list(set(finduser))
    #去除finduser中的重复元素
    return user
    #获取用户信息页面标记

这个模块的主要修改包括:1)去掉了BeautifulSoup库,因为发现根本不用;2)匹配的规则有些变化;3)正则表达式匹配出的'/people/用户名'会有好几个相同的,所以用了list(set())去除重复项并返回一个列表。


(2)ZhihuSpider.py

import urllib2
import re
from bs4 import BeautifulSoup
#导入模块

def getWeibo(user):
    userURL='http://www.zhihu.com%s'%user
    username=user.split('/')[2]
    #获取username
    try:
        resp=urllib2.urlopen(userURL)
    except urllib2.URLError,e:#异常处理
        print e.reason
    else:
        contents=resp.read()
        soup=BeautifulSoup(contents,'lxml')
        #获取网页
        nickname_=soup.select('span[class="name"]')
        if nickname_:
            nickname=str(nickname_).split('>')[1].split('<')[0]
        else:
            nickname=''
        nickname=eval("u'"+nickname+"'")#用于输出中文
        #获取用户名称
        pattern1=re.compile(r'http://weibo.com/u/+\d+')
        pattern2=re.compile(r'http://weibo.com/+[a-zA-Z0-9]*')
        result = re.findall(pattern1,contents)+re.findall(pattern2,contents)
        #必须先匹配pattern1,否则会返回'http://weibo.com/u'
        if result:
            weiboURL=result[0]
        else:
            weiboURL=''
        #若有微博地址则返回地址,若无则返回空白
        return '%s,%s,%s\r\n'%(username,nickname,weiboURL)
        #返回“username,用户名称,微博地址”
这个模块的变化主要是由于 ReadUsername提取出来的内容的变化,所以提取username的方式略做改动,另外也由于这个原因,所以要重新构造一下userURL。


(3)WeiboLog.py

un=readUsername('G:\\ZhihuSpider\\F12.txt')
#读取txt中的用户信息
wblog=open('G:\\ZhihuSpider\\WeiboLog.txt','a')
count=0
for name in un:
    wb=getWeibo(name)
    try:
        wbUTF=wb.encode('utf-8')
    except AttributeError:#异常处理
        pass
    else:
        print wbUTF
        wblog.write(wbUTF)
        count+=1#计数用
wblog.close()
#将解析出的结果存入文件
print 'Successed! %d added.'%count

主程序的变化主要是:1)提取的文件文件名改了;2)encode的部分加入了异常处理,主要是因为getWeibo有时候会返回Not Found(就是上一个模块的异常处理部分),而Not Found是NoneType,不能encode,会出现AttributeError,所以要引入异常处理。至于为什么会有Not Found的存在,我也不太清楚……3)加入print wbUTF的原因是为了不再静默地运行,爬取了哪些一目了然了~


结果如下,人数增加到了52个,顺带连边上的用户也一起爬了~


如果要继续深入下去,我想我会把写入WeiboLog.txt的模式改为w(复写),引入时间戳,每次单独生成一个txt文件,便于日后管理和合并,另外就是看看还有什么地方能做性能优化,毕竟爬起速度还是挺慢的……

总的来说,这次小小的实践令我受益匪浅,我觉得这种思考的感觉特别有意思,再接再厉~

上篇地址:http://blog.csdn.net/silencegtx/article/details/49517703










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值