python3.6基础上requests+xpath爬取知乎发现小部分数据,存在MongoDB中

1.      准备工作

1.1安装requests1

在python的安装目录下的Scripts文件夹下打开命令提示符,使用pip install requests安装

1.2安装lxml

使用xpath解析需要安装lxml库,与上面方法相同,pip install lxml

1.3安装MongoDB

下载好msi文件后,双击开始安装

 


然后一直点next,点install。

如果安装目录下,没有data和log文件夹,新建data和log文件夹,在data下新建db文件夹,在log下新建mongod.log文件

在bin目录下打开命令提示符,运行MongoDB,mongod --dbpath “D:\workspace\MongoDB\server\4.0\data\db


2代码

import pymongo,requests
from lxml import etree
class zhihu_crawler:
    def __init__(self):
        pass
    #获取网页
    def get_html(self):
        url = 'https://www.zhihu.com/explore'
        headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)  \
                AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
            }
        try:
            #使用requests获取目标网页内容
            req = requests.get(url = url , headers = headers)
            return(req.text)
        except:
            print('failed to get html')
    #解析获取到的网页
    def parse_html(self,text):
        #构建一个可以被xpath解析的对象
        html = etree.HTML(text)
        #获取问题
        result = []
        try:
            #//div:表示匹配所有div标签
            #[@class="explore-feed feed-item"]:表示匹配class属性值为explore-feed feed-item的标签
            items = html.xpath('//div[@class="explore-feed feed-item"]')
            #items是一个问题列表,所以遍历没一个问题单独获取数据
            for item in items:
                one = {}  #新建一个空字典存放每条问题的数据
                content = etree.HTML(etree.tostring(item))
                #获取问题,/text():获取当前标签的文本值
                title = content.xpath('//a[@class="question_link"]/text()')
                #获取作者名,/@data-author-name:获取当前标签的data-author-name属性值
                author = content.xpath('//div[@class="zm-item-rich-text expandable js-collapse-body"]/@data-author-name')
                #获取答案开头
                summary = content.xpath('//div[@class="zh-summary summary clearfix"]/text()')
                #依次将数据放到每条答案的字典中
                one.update(title = title[0])
                one.update(author = author[0])
                #获取答案发现是列表,处理一下成字符串
                constr = ""
                for i in summary:
                    constr = constr+i
                one.update(summary=constr)
                #将一条答案的数据添加到列表中
                result.append(one)
            return(result)
        except:
            print("failed to parse html")
    #存放数据到MongoDB
    def save_db(self,data):
        #连接数据库
        client = pymongo.MongoClient(host = 'localhost' , port = 27017)
        #新建或指定使用的数据库
        db = client.test
        #指定使用的集合,格式:数据库名.集合名
        collection = db.zhihu
        #插入数据,多条数据用insert_many(列表),单条数据用insert_one(单条数据)
        result = collection.insert_many(data)
        
test = zhihu_crawler()
html = test.get_html()
data = test.parse_html(html)
test.save_db(data)
        






  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值