zoukankan      html  css  js  c++  java
  • 使用requests爬虫简单获取知乎问题信息

    爬虫几乎已经成为python学习大军中最为庞大的一支,没有之一。

    我非常赞同以爬虫的目的来学习python,或者用python来实现爬虫。

    可是,为什么学了python之后,依旧写不了爬虫呢?

    最主要的原因,你没有理解python爬虫的套路!

    没有案例的回答都是骗流量,这一次就来爬一爬本提问的一些信息:

    什么是爬虫的套路?

    爬虫通俗来说就是抓取网页数据,比如说大家都喜欢的妹子图、小视频呀,还有电子书、文字评论、商品详情等等。

    只要网页上有的,都可以通过爬虫爬取下来。

    一般而言,python爬虫需要以下几步:

    1. 找到需要爬取内容的网页URL
    2. 打开该网页的检查页面(即查看HTML代码,按F12快捷键即可进入)
    3. 在HTML代码中找到你要提取的数据
    4. 写python代码进行网页请求、解析
    5. 存储数据

    在默认你已经有python基础的前提下,来说一说如何写代码进行网页请求、解析。

    网页请求意思是把网页的HTML源码下载下来,以知乎首页为例,一般长这样:

    网页的信息包含在源码里,比如图中的标题“首页-知乎”。

    好了,接下来我们一步步按照套路把本问题的信息都爬下来!

    一、找到需要爬取网页的URL

    这个很容易,该问题的url:https://www.zhihu.com/question/21358581

    我们需要爬取四个信息:

    • 问题描述
    • 问题补充
    • 关注者数
    • 被浏览数

    二、打开该网页的检查页面

    推荐使用chrome浏览器实践,会和本文操作同步。

    打开本问题的网页:

    按F12键进入开发者页面:

    三、在HTML代码中找到你要提取的数据

    点击开发者页面左上角的‘选择元素’箭头:

    然后再点击网页上的问题描述,这时候开发者界面上出现HTML源码:

    你想要的问题描述文字,就藏在html源码里:

    我们要爬取的第一个信息已经找到,按照上面步骤,可以找到其它三个信息在html中的位置。

    如果你不懂什么是html?为甚么爬信息需要看html?请先看这篇回答:

    如何入门 Python 爬虫?​www.zhihu.com图标

    四、写python代码进行网页请求、解析

    这一步可能是大家最最关心的,因为涉及到python代码。

    其实这里对python的要求也仅限于你需要会数据类型、变量、运算符、函数、模块之类的简单语法。

    因为我们会用到好几个第三方库,帮助我们完成网页请求、解析的工作,你需要做的是知道这些库的使用方法。

    如果你对这个过程仍感迷惑,仍推荐先看这篇回答:

    如何入门 Python 爬虫?​www.zhihu.com图标

    Part 1

    这里用到的用于网页请求的库是requests,一个非常流行的http请求库。

    这里请求的是什么?不是原谅、也不是理解,而是网页的html信息。

    服务器收到请求后,会返回相应的网页对象。

    Requests库会自动解码来自服务器的内容,大多数 unicode 字符集都能被无缝地解码。

    这一切requests都能妥妥地搞定。

    我们来尝试下:

    import requests
    headers = {'User-Agent':你的浏览器headers}
    # 传入url和请求头
    r = requests.get('https://www.zhihu.com/question/21358581',headers=headers)
    # 响应的内容
    print(r.text)
    

    我们会接收到服务器返回的页面,requests解析后,呈现下面这样子:

    这就是我们需要的html源码呀!

    接下来要做的就是从html中抽取我们需要的四个信息。

    Part 2

    通过网页请求,我们获取到响应的html文档,我们需要的东西都在这个文档里。

    但是怎么去抽取信息呢?

    XPath 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。

    这里用到另一个有用的库xpath,xpath库可以让你轻松的使用XPath语言查找信息。

    既然XPath是在XML文档中才能起作用,然而我们刚刚获取的html只是文本字符串。

    所以需要把html文档转换为XPath可以解析的对象:lxml.etree._Element(xml/html文件树中的一个节点)。

    接着上面代码:

    # 将html文档转换为XPath可以解析的
    s = etree.HTML(r.text)
    

    Part 3

    这下我们可以使用xpath库来进行信息的提取了。

    xpath的使用方法这里不赘述了,大家可以网上搜搜资料,个半小时也能学会。

    这里介绍一种简单的方法,你在开发者页面中找到对应信息的源码后,直接右键复制xpath地址:

    但复制的xpath很有可能会导致获取的信息为空,所以我这里用标签的属性来获取对应文本。

    接上面代码:

    # 获取问题内容
    q_content = s.xpath('//*[@class="QuestionHeader-title"]/text()')[0]
    # 获取问题描述
    q_describe = s.xpath('//*[@class="RichText ztext"]/text()')[0]
    # 获取关注数和浏览量,这两个属性一样
    q_number = s.xpath('//*[@class="NumberBoard-itemValue"]/text()')
    concern_num = q_number[0]
    browing_num = q_number[1]
    # 打印
    print('问题:',q_content,'
    ','描述:',q_describe,'
    ','关注数:',concern_num,'
    ','浏览量:',browing_num)
    

    最终呈现的结果:

    image

    全部代码:

    import requests
    from lxml import etree
    headers = {'User-Agent':你的浏览器headers}
    r = requests.get('https://www.zhihu.com/question/21358581',headers=headers)
    s = etree.HTML(r.text)
    # 获取问题内容
    q_content = s.xpath('//*[@class="QuestionHeader-title"]/text()')[0]
    # 获取问题描述
    q_describe = s.xpath('//*[@class="RichText ztext"]/text()')[0]
    # 获取关注数和浏览量,这两个属性一样
    q_number = s.xpath('//*[@class="NumberBoard-itemValue"]/text()')
    concern_num = q_number[0]
    browing_num = q_number[1]
    # 打印
    print('问题:',q_content,'
    ','描述:',q_describe,'
    ','关注数:',concern_num,'
    ','浏览量:',browing_num)
    

    结论

    好了,关于这个问题的信息已经通过python爬下来。

    初学的小伙伴自己尝试再多爬些内容,练习requests和xpath的使用,爬虫也就能入门了。

  • 相关阅读:
    jni 调用
    [2016-04-19 15:46:03
    java正则表达式
    proguaid 混淆代码
    nable to execute dex: Multiple dex files define Lcom/chinaCEB/cebActivity/R
    素质与修养
    纪律
    Android百度地图开发 百度地图得到当前位置
    定义一些常亮
    Android 有些机型hint不显示
  • 原文地址:https://www.cnblogs.com/zhuwjwh/p/12325698.html
Copyright © 2011-2022 走看看