零基础自学用Python 3开发网络爬虫(五): 使用第三方模块快速抓取与解析

February 18, 2015 | 14:33

在前面的四篇文章中, 我们一直采用 python 3 自带的 urllib  模块来抓取网页, 然后用 re 模块来处理抓取到的数据. 这次我们使用 Requests 库来代替 urllib, 用 BeautifulSoup 来代替 re 模块.

对于这两个模块来说, 学习使用它们的最好方法是看官方文档, 这两个模块的官方文档都有中文版(翻译的不是很完整).

在 Windows 下如果安装了 Python3, 那么在 cmd 下直接可以通过 pip 来安装这两个模块, 命令如下:

在 Ubuntu 下安装方法如下:

然后我们运行 Python3, 试一下是否能把这两个模块 import 进来, 就知道是否安装成功了:

 

Requests Module

Requests 是 Python 界大名鼎鼎的一个网络库, 其设计哲学是为人类而设计, 所以他提供的功能都非常的人性化. 他的方便对我而言主要有两大点:

  • 对 GET 和 POST 方法的封装做的很好, 自动处理了编码等问题;
  • 默认开启了 Cookies 处理, 在处理需要登录的问题上面非常方便.

Requests 的方便之处不止这两点, 还提供了诸如标准登录接口之类的功能, 我们暂时用不上.

总而言之, 对于使用过 urllib 的我们来说, 用 requests 会感觉我们之前生活在石器时代. 第三方库的强大就在于这里, 这也是 Python 这么火的重要原因.

 

BeautifulSoup Module

BeautifulSoup 大大方便了我们对抓取的 HTML 数据的解析, 可以用tag, class, id来定位我们想要的东西, 可以直接提取出正文信息, 可以全文搜索, 同样也支持正则表达式, 相当给力.

 

小试牛刀

我们随便抓取一个页面, 然后用 soup 来解析一下试试他的威力:

我们十分轻松的获得了全文内容以及所有链接.

 

重访知乎

在上一篇文章中, 我尝试使用 urllib 和 re 获取了知乎登录页面的 _xsrf 参数, 这次我们通过这两个新的模块再试一次.

打开浏览器隐身模式, 打开知乎网, 来到登录界面, 查看源代码, 搜索 xsrf 字样, 得到如下一行:

于是我们只要两行代码就能搞定:

第三方库就是这么好用!

 

( 转载请注明: Jecvay Notes )

多达 21 条吐槽

  • 686788
    2015/02/25

    推荐下Python3入门书籍或资料呗

  • SsSs
    2015/03/10

    requests 的cookie 怎么 用?

    • 2015/03/11

      不用去使用, 他会自动帮你处理 cookies 的. 你只要用 get 和 post 方法发送请求即可.

      • SsSs
        2015/03/11

        谢谢,可否再请教你一个问题?我之前抓取某个网站上的一些MP3音频时用的是 urllib.request.urlretrieve。例如 urllib.request.urlretrieve(mp3url,'/duihua/%s/%s.mp3' % (title,mp3title))请问在requests 里有其他方法吗?或者说除了用urllib.request.urlretrieve 下载 还有其他方法吗?

        • 2015/03/11

          urlretrieve 我没有用过也, requests可以直接getx = reqeusts.get(url)然后将 x.content 保存为文件就好了.

  • wwwwwwwq
    2015/03/18

    隐身模式,不用去清cookie。。给跪了。。。

  • wors
    2015/04/04

    这样就可以了吗?登录知乎的过程呢?

  • Neagle
    2015/04/27

    find_all 返回的是一个列表,这里使用(x['href']) 是什么意思呢 谢谢,我也是初学Python。

  • UTOPIA
    2015/06/01

    请问楼主爬虫写到这一步,都学了那些相关的知识,有没有相关的参考资料可以推荐一下?

  • 2015/08/31

    不错,值得收藏分享!

  • 2015/12/15

    这个字体看起来不错

  • 2016/04/15

    >>> import requests
    >>> from bs4 import BeautifulSoup
    >>> response = requests.get("http://jecvay.com")
    >>> soup = BeautifulSoup(response.text)

    Warning (from warnings module):
    File "C:UsersBobbyLiAppDataLocalProgramsPythonPython35-32libsite-packagesbs4__init__.py", line 166
    markup_type=markup_type))
    UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

    To get rid of this warning, change this:

    BeautifulSoup([your markup])

    to this:

    BeautifulSoup([your markup], "html.parser")
    大神 看下这个怎么回事?

    • 2016/04/18

      soup = BeautifulSoup(response.text, 'lxml')

    • 111
      2016/05/10

      提示说得很清楚,改成soup = BeautifulSoup(response.text, "html.parser")就行了

  • 2016/04/15

    >>> for x in soup.findAll("a"):
    ... print(x['href'])
    不用... 有 :

  • 萌新
    2016/07/24

    请问 这个系列还会继续更新吗?会讲Requests+Beautiful的一些例子吗?

  • post is kirara
    2016/09/01

    >>> soup = BeautifulSoup(requests.get("http://www.zhihu.com").text, "html.parser")>>> print(soup.find("input", {"name":"_xsrf"})['value'])Traceback (most recent call last): File "", line 1, in print(soup.find("input", {"name":"_xsrf"})['value'])TypeError: 'NoneType' object is not subscriptable>>> 这是怎么回事呢

说几句