python爬虫实战之爬取知乎帖子

python爬虫 专栏收录该内容
1 篇文章 0 订阅

 刚开始学习python爬虫,参考代码:https://github.com/lijaha/web-spider/blob/master/Get_ZhiHu_question.py

 相关教程http://www.cnblogs.com/xin-xin/p/4297852.html


  首先要把网页的信息爬取下来,再接着分析。。。。

   代码如下:(爬取https://www.zhihu.com/question/24728633的代码保存为html.txt)

#_*_ coding: utf-8 _*_

import urllib
import urllib2
import re

url = 'https://www.zhihu.com/question/24728633'
request = urllib2.Request(url)
respones = urllib2.urlopen(request)
html = respones.read()
file = open("html.txt","w+")
file.write(html)
print html


接着要对网页进行分析,,,,,,


1.提取帖子问题

   html代码也就是下面的部分

  

<h2 class="zm-item-title zm-editable-content">

大数据听着很牛,实际上也很牛吗?

</h2>

于是正则表达式是

pattern = re.compile('<h2 class="zm-item-title.*?>(.*?)</h2>',re.S)

2.提取问题描述

   html代码:

 

<div id="zh-question-detail" class="zm-item-rich-text" data-resourceid="2073494" data-action="/question/detail">

<div class="zm-editable-content">就是收集很多用户数据,用机器进行处理嘛,干嘛整天吵得这么high。传统行业的数据,收集和分析慢,互联网时代特别是移动互联网时代,数据收集和分析都变得更快更智能,仅此而已吧。</div>

 
正则表达式:

pattern = re.compile('<div id="zh-question-detail.*?>.*?<div class="zm-editable.*?>(.*?)</div>.*?</div>',re.S)
仅有<div class="zm-editable.*?>不能区别出问题描述与回答的差别。

3.提取回答

  html代码

 

<div class="zm-item-rich-text js-collapse-body" data-resourceid="2073494" data-action="/answer/content" data-author-name="Xiaoyu Ma" data-entry-url="/question/24728633/answer/28768001">


<div class="zh-summary summary clearfix" style="display:none;">

简单说,一顿饭吃一碗,是正常人;一顿饭能吃300碗呢。不就是吃饭嘛。是嘛。。是吗。。。小规模的数据分析,会有很大噪音。比如你不能因为看到1个人买了黄瓜又买了KY就说两者有什么关联,但是如果几百万个用户都显示了这样的关联,那就能说明一些问题(?)…

<a href="/question/24728633/answer/28768001" class="toggle-expand">显示全部</a>

</div>


<div class="zm-editable-content clearfix">
简单说,一顿饭吃一碗,是正常人;一顿饭能吃300碗呢。不就是吃饭嘛。是嘛。。是吗。。。<br><br>小规模的数据分析,会有很大噪音。比如你不能因为看到1个人买了黄瓜又买了KY就说两者有什么关联,但是如果几百万个用户都显示了这样的关联,那就能说明一些问题(?)了。可是数据量一旦上了规模,传统的系统就没办法很好的处理了。<br>比如说你的电商网站每天有几十G的用户点击数据,你希望知道定了鲜花的用户是否也会购买避孕套,然后让决定是否给杜蕾斯做推荐。你决定分析上个季度的用户数据来作决策,不过这些数据结构松散,没有索引,你家的Oracle把磁盘转的吱吱响,转了两天终于给出结果说根据这个季度的历史浏览统计,我们发现鲜花和避孕套有很大的正相关性,因此这个关联推荐是有效的。你回头跟老板商量,他披头对你一通骂,2货,情人节是昨天!<br>阿里亚马逊ebay这些,成千上万种货物,每天成TB的甚至PB的数据量,要对大量不同的货品种类作分析和推荐,近实时地更新给用户看;推特和Facebook这些,根据用户发布的信息和行为模式,快速地分析整合数据给出精确广告投放是这些公司生存的根本。<br><br>等移动互联网或者物联网更普及,数据量只会更大,结构更随意,分析更困难。能从中找到有意思的信息,用传统手段就更难了。

</div>

正则表达式:

pattern = re.compile('<div class="zm-item-rich-text.*?>.*?</div>.*?<div class="zm-editable-content.*?>(.*?)</div>',re.S)



代码:

# _*_ coding:utf-8 _*_

import urllib
import urllib2
import re

class Tool:
    RemoveImg = re.compile('<img.*?>| {7}|')
    #匹配图片标签
    RemoveAddr = re.compile('<a.*?>|</a>')#匹配链接标签
    ReplaceLine = re.compile('<tr>|<div>|</div></p>')#匹配换行符的标签
    ReplaceTD = re.compile('<td>') #匹配制表符
    ReplacePara = re.compile('<p.*?>')#匹配段落开头
    ReplaceBR = re.compile('<br><br>|<br>')#匹配换行和双换行
    RemoveTag = re.compile('<.*?>')#匹配其余的标签
    def replace(self,x):
        x = re.sub(self.RemoveImg,"",x)#删除图片
        x = re.sub(self.RemoveAddr,"",x)#删除链接
        x = re.sub(self.ReplaceLine,"\n",x)#替换换行符
        x = re.sub(self.ReplaceTD,"\t",x)#将制表符替换
        x = re.sub(self.ReplacePara,"\n  ",x)#段落开头替换
        x = re.sub(self.ReplaceBR,"\n",x)
        x = re.sub(self.RemoveTag,"",x)#删除其余标签
        return x.strip()
class zhihu:
    def __init__(self,url):
        self.url = url
        self.tool = Tool()
        self.file=None
    #获取网页代码
    def gethtml(self):
        url = self.url
        request = urllib2.Request(url)
        respones = urllib2.urlopen(request)
        html = respones.read()
        return html
    #获取帖子标题
    def gettitle(self,html):
        pattern = re.compile('<h2 class="zm-item-title.*?>(.*?)</h2>',re.S)
        title = re.search(pattern,html)
        if title:
            return title.group(1).strip()
        else:
            return None
    #获取题目描述
    def getquestion(self,html):
        pattern = re.compile('<div id="zh-question-detail.*?>.*?<div class="zm-editable.*?>(.*?)</div>.*?</div>',re.S)
        detail = re.search(pattern,html)
        if detail:
            return detail.group(1).strip()
        else:
            return None
    #获取回答
    def getanswer(self,html):
        pattern = re.compile('<div class="zm-item-rich-text.*?>.*?</div>.*?<div class="zm-editable-content.*?>(.*?)</div>',re.S)
        items = re.findall(pattern,html)
        contents = []
        i=0
        for item in items:
            content = "\n"+self.tool.replace(item)+"\n"
            contents.append(content)
           # print item
            i+=1
        return contents
    #获取赞同数
    def getvote(self,html):
        pattern = re.compile('<div class="zm-votebar.*?>.*?<button class="up.*?>.*?<span class="count.*?>(.*?)</span>',re.S)
        items=re.findall(pattern,html)
        votes=[]
        for item in items:
            item = "\n"+self.tool.replace(item)+"\n"
            votes.append(item)
        return votes
   
    def filename(self,title):
        if title:
            self.file=open(title+".txt","w+")
        else:
            print "文件创建出错!"

    def writefile(self,question,detail,votes):
        if detail:
            statement="\n"+"本次的问题的描述为:"+"\n"+self.tool.replace(detail)+"\n"
            self.file.write(statement)
           # print statement
        else:
            print "写入问题描述出错!"
        if question:
            i=1
            j=0
            for que in question:
                label = "\n"+"第"+str(i)+"个回答:"+"\n"+"本回答的点赞数为:"+str(votes[j])+"\n"
                self.file.write(label)
                self.file.write(que)
                i+=1
                j+=1
        else:
            print "写入回答错误!"

    def start(self):
        html = self.gethtml()
        print "已获得源代码,正在处理......"
        title = self.gettitle(html)
        print "本次获取的问题是:"+title
        detail = self.getquestion(html)
        question = self.getanswer(html)
        votes = self.getvote(html)
       # print votes
        print "正在创建存储文件......"
        self.filename(title)
        print "文件创建完成,文件名为:"+title+".txt"
        self.writefile(question,detail,votes)
print "欢迎使用知乎回答抓取,请输入知乎的帖子编号:"
url= 'https://www.zhihu.com/question/'+raw_input("https://www.zhihu.com/question/")

question = zhihu(url)
question.start()





 

 


  • 1
    点赞
  • 3
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值