time微博「sptime微博」( 四 )


通过前面的观察 , 我们已经了解到微博博文存在的标签有什么特点了 , 利用XPath技术 , 将这个页面里所有有这个特点的标签全部提取出来已经不是难事了 。
在这再次提醒 , 微博分为转发微博和原创微博、时间表示方式 。另外 , 由于我们的研究课题仅对微博文本感兴趣 , 所以配图不考虑 。
def startparsing(self, parsingtime=datetime.datetime.now()):
basepath = sys.path[0] + '/Weibo_raw/' + self.uidfor filename in os.listdir(basepath):
if filename.startswith('.'):
continue
path = basepath + '/' + filename
f = open(path, 'r')
html = f.read()
selector = etree.HTML(html)
weiboitems = selector.xpath('//div[@class="0ba6-1569-528c-7519 c"][@id]')for item in weiboitems:
weibo = Weibo()
weibo.id = item.xpath('./@id')[0]
cmt = item.xpath('./div/span[@class="1569-528c-7519-1598 cmt"]')if len(cmt) != 0:
weibo.isrepost = True
weibo.content = cmt[0].text
else:
weibo.isrepost = False
ctt = item.xpath('./div/span[@class="528c-7519-1598-e9fe ctt"]')[0]
if ctt.text is not None:
weibo.content += ctt.text
for a in ctt.xpath('./a'):
if a.text is not None:
weibo.content += a.text
if a.tail is not None:
weibo.content += a.tail
if len(cmt) != 0:
reason = cmt[1].text.split(u'\xa0')
if len(reason) != 1:
weibo.repostreason = reason[0]
ct = item.xpath('./div/span[@class="7519-1598-e9fe-416c ct"]')[0]
time = ct.text.split(u'\xa0')[0]
weibo.time = self.gettime(self, time, parsingtime)self.weibos.append(weibo.__dict__)
f.close()
*** 传递的参数parsingtime的设置初衷是 , 开发前期爬取和解析可能不是同时进行的(并不是严格的“同时”) , 微博时间显示是基于访问时间的 , 比如爬取时间是10:00 , 这时爬取到一条微博显示是5分钟前发布的 , 但如果解析时间是10:30 , 那么解析时间将错误 , 所以应该讲解析时间设置为10:00 。到后期爬虫基本开发完毕 , 爬取工作和解析工作开始时间差距降低 , 时间差将是爬取过程时长 , 基本可以忽略 。
解析结果保存在一个列表里 , 最后将这个列表以json格式保存到文件系统里 , 删除过渡文件夹 , 完成 。
def save(self):
f = open(sys.path[0] + '/Weibo_parsed/' + self.uid + '.txt', 'w')jsonstr = json.dumps(self.weibos, indent=4, ensure_ascii=False)f.write(jsonstr)
f.close()
2.爬取关键词
同样的 , 收集必要的信息 。在微博手机版搜索页面敲入”python” , 观察url , 研究其规律 。虽然之一页并无规律 , 但是第二页我们发现了规律 , 而且这个规律可以返回应用于之一页之一页
第二页
应用后之一页
观察url可以发现 , 对于关键词的搜索 , url中的变量只有keyword和page(事实上 , hideSearchFrame对我们的搜索结果和爬虫都没有影响) , 所以在代码中我们就可以对这两个变量进行控制 。
另外 , 如果关键词是中文 , 那么url就需要对中文字符进行转换 , 如我们在搜索框敲入”开心”并搜索 , 发现url如下显示搜索开心
但复制出来却为
;keyword=%E5%BC%80%E5%BF%83page=1幸好 , python的urllib库有qoute *** 处理中文转换的功能(如果是英文则不做转换) , 所以在拼接url前使用这个 *** 处理一下参数 。
另外 , 考虑到关键词搜索属于数据收集阶段使用的 ***  , 所以在此只提供单线程下载网页 , 如有多线程需要 , 大家可以按照多线程爬取用户微博的 *** 自己改写 。最后 , 对下载下来的网页进行提取并保存(我知道这样的模块设计有点奇怪 , 打算重(xin)构(qing)时(hao)时再改 , 就先这样吧) 。
def keywordcrawling(self, keyword):
realkeyword = urllib.quote(keyword)# Handle the keyword in Chinese.
try:
os.mkdir(sys.path[0] + '/keywords')
except Exception, e:
print str(e)
weibos = []
try:
highpoints = re.compile(u'[\U00010000-\U0010ffff]')# Handle emoji, but it seems doesn't work.
except re.error:
highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')pagenum = 0
isneeded = False
while not isneeded:
html = self.getpage(';page=1' % realkeyword)isneeded = self.ispageneeded(html)
if isneeded:
selector = etree.HTML(html)

推荐阅读