三、使用 requests 库请求网站
(一)安装 requests 库
首先在 PyCharm 中安装 requests 库,为此打开 PyCharm,单击“文件”菜单,选择“新项目设置”命令,如图 3-2-4 所示。
图 3-2-4 新项目设置
选择“新项目的设置”,在弹出的“设置”窗口选择“Python 解释器”选项,确认 Python解释器与安装的 Python 版本一致,如图 3-2-5 所示。
图 3-2-5 设置对话框
点击标签栏加号,在搜索框输入:requests(注意:一定要输入完整,不然容易出错),然后单击左下角的“安装软件包”,如图 3-2-6 所示。在 PyCharm 中加载库的操作步骤如本例步骤。
图 3-2-6 安装软件包
安装完成后,如图 3-2-7 所示,提示“已成功安装软件包”,如果安装不成功也会显示提示信息。
图 3-2-7 已成功安装软件包
(二)爬虫的基本原理
网页请求的过程分为两个环节:
(1)request(请求):每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。
(2)response(响应):服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容展示出来,这就是我们所熟悉的网页请求。
网页请求的方式也分为两种:
① GET:最常见的方式,一般用于获取或者查询资源信息,这也是大多数网站使用的方式,响应速度快。
② POST:相比 GET 方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。
因此,爬取数据前要先确定向谁发送请求,用什么方式发送。
(三)使用 GET 方式抓取数据
复制任意一条首页首条新闻的标题,在源码页面按【Ctrl+F】组合键调出搜索框,将标题粘贴在搜索框中,按【Enter】键。标题可以在源码中搜索到,请求对象是 www.cntour.cn,请求方式是 GET(所有在源码中的数据请求方式都是 GET),如图 3-2-8 所示。
图 3-2-8 使用 GET 方式抓取数据
确定好请求对象和方式后,在 PyCharm 中输入以下代码:

加载库使用的语句是 import+库的名字。在上述过程中,加载 requests 库的语句如下:
● import requests
用 GET 方式获取数据需要调用 requests 库中的 get 方法,使用方法是在 requests 后输入
英文点号,如下所示:
● requests.get
将获取到的数据存到 strhtml 变量中,代码如下:
● strhtml = request.get(url)
这个时候 strhtml 是一个 URL 对象,它代表整个网页,但此时只需要网页中的源码,下
面的语句表示网页源码:
● strhtml.text
运行结果如图 3-2-9 所示。
图 3-2-9 运行结果
(四)使用 POST 方式抓取数据
首先输入有道翻译的网址:http://fanyi.youdao.com/,进入有道翻译页面。按快捷键 F12,进入开发者模式,单击“网络”,此时内容为空,如图 3-2-10 所示。
图 3-2-10 网络
在有道翻译中输入“我爱中国”,单击“翻译”按钮,如图 3-2-11 所示
图 3-2-11 翻译“我爱中国
在开发者模式中,依次单击“网络”按钮和“XHR”标签,找到翻译数据后预览,如图3-2-12 所示。
图 3-2-12 翻译数据
单击“标头”,发现请求数据的方法为 POST,如图 3-2-13 所示。
图 3-2-13 标头
找到数据所在之处并且明确请求方式之后,接下来开始写爬虫。首先,将 headers 中的
URL 复制出来,并赋值给 url,代码如下:
● url=’https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule’
POST 请求获取数据的方式不同于 GET,POST 请求数据必须构建请求头才可以。form
data 中的请求参数如图 3-2-14 所示。
图 3-2-14 请求参数
将其复制并构建一个新字典:
接下来使用 requests.post 方法请求表单数据,代码如下:
使用 requests.post 方法抓取有道翻译结果的完整代码如下:
