UtopiaXC Blog - 教程
type: channel
link: https://blog.utopiaxc.com/tag/%E6%95%99%E7%A8%8B/
items: 如何优雅地写一个简单Python爬虫：Requests库入门操作

如何优雅地写一个简单Python爬虫：Requests库入门操作
type: item
date: 2020-04-26T18:25:00+08:00
description: 在互联网和W3C极大发展的今天，B/S（浏览器/服务器）模式已经成为了人们接触互联网最直接简单的方式。 而随着Node.js、React、Vue.js等等开源框架的发展，现在我能能通过浏览器前端做到更多事情。而得益于标记语言（HTML，XML等）和解释型语言（JavaScript，Python等）的性质， 我们看到前端页面的内容基本都是这些语言通过浏览器解释渲染后形成的效果。 也就是说，你想在浏览器里看到前端页面，那么你的浏览器必需接收到这个页面的源码。 换言之，你得到了页面的源码，你就得到了这个页面上的一切内容。爬虫正是通过爬取网站前端源码来实现对页面进行分析的工具。一、浏览网页时浏览器和服务器究竟在做着什么交易？我们知道，浏览器是负责解释渲染的，那么他必须先拿到前端的源码才能开始它的工作。 所以，当我们访问一个网址的时候（这时候还会发生一些其他交易，与爬虫无关留作以后开坑）， 服务器会将对应的前端页面直接（单纯的HTML页面）或经过编译（例如php后端）的源码文档发送到你的浏览器。 当你的浏览器拿到这些源码的时候，他就会着手将这些渲染成好看的前端页面。所以，既然我们想分析一个网站的内容，那何不擒贼先擒王，直接将源码抢过来分析不就成了么，这也正式爬虫的目的。二、啥？Requests是啥？既然知道了爬虫存在的意义，那么我们先来了解一下如何用Python写出一个小爬虫。 在Python中，内置的urllib库给我们提供了很多访问网站的方法，比如urllib.urlopen()等。但是，这个库并不好用，甚至还有些麻烦，一些高级的功能也无法实现。 那这个时候，就要请出我们今天的主角登场：requests库。它不仅优化了原有urllib的方法， 还添加了很多更加实用的方法。有了它，我们就能更加快乐地爬取网站了。首先，让我们安装它。老办法，当然是要用pip工具。pip install requests然后？还有然后么？用就行了。三、一个极尽简单的小爬虫# coding:utf-8 import requests # 导入requests包 response = requests.get(https://app.utopiaxc.com) # 构建一个简单的请求，这里是我的另一个网站 print(response.text) # 将获取的网站源码打印出来这是一个极度简单的小爬虫。我们可以看到，其实他的核心只有由一给函数构成，即response = requests.get(https://app.utopiaxc.com)这句话实际上是requests利用了get方法从我的服务器请求了这个页面，然后利用print()将其打印出来。 我们可以看到，下面的运行结果中和之前我们在浏览器中查看的源代码一摸一样。使用Chrome查看的源码使用爬虫爬取的源码四、请求不到？那就高级一点当然，出于某些目的，比如反爬虫，又或者是限制浏览器等，这么简单的爬虫并不能足以让我们访问一切网站。 那么，我们此时就要稍微拿出一点诚意，假装让浏览器感觉我们是浏览器用户，混入敌军之中。在我们访问网站的时候，我们的浏览器会发送一个header，这个header中包含了很多信息，比如用户代理 （UserAgent）、比如地址（Host），比如语言（Accept-Language）等等。 而这其中的UserAgent便是识别浏览器型号的关键，因此，我们只需要提交一个假的UserAgent便可以蒙混过关。 至于怎么伪装，大家可以用我下面代码中给出的UserAgent（Chrome），也可以利用F12查看自己浏览器的UserAgent。# coding:utf-8 import requests # 导入requests包 # 请求头字典，一般只需要UserAgent，具体情况具体分析 headers = { 'UserAgent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/81.0.4044.122 Safari/537.36' } # 构建一个拥有UserAgent的请求，这里是我的另一个网站 response = requests.get(https://app.utopiaxc.com, headers=headers) print(response.text) # 将获取的网站源码打印出来五、GET? POST?大家可以看到，我刚才使用的均是get方法，那么get方法到底是什么呢？ 而post方法又是什么呢？我们不进行过多深究，可以简单地理解为，get方法就是向服务器请求获取一个页面， 这个页面的全部地址和表单信息都包含在ur…