上次说到静态网页和动态网页的事儿,在网上看了许久,发现动态网页的解析对我来说太难了(毕竟还没学过),那有没有替代的方法呢?我想起了浏览器的开发者工具(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