2.3 使用requests库请求网站
2.3.1 安装requests库
首先在PyCharm中安装requests库,,为此打开PyCharm,单击“File“(文件)菜单,选择“ Settings”(设置)命令,如图所示。

选择“Project Interpreter”(项目编译器)命令,确认当前选择的编译器,然后单击右上角的加号,如图所示。

在搜索框输入:requests(注意,一定要输入完成,不然容易出错),勾选“Install to user's site packages directory”(安装到用户的站点库目录)选项,如果不勾选该选项则会安装在临时目录中。然后单击左下角的“Install Packages”(安装库)按钮。如图所示。

安装完成后,会在Install Package上显示“Package 'requests”installed successfully"(库的请求已成功安装),如图所示;如果安装不成功将会显示提示信息。

2.3.2 爬虫的基本原理
⑴ 网页请求的过程
- Request(请求)
每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。
- Response(响应)
服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容战术出来,就是我们所熟悉的网页请求,如图所示。

⑵ 网页请求的方式
GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方法,响应速度快。
POST:相比GET方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。
所以,在写爬虫前要先确定向谁发送请求,用什么方式发送。
2.3.3 使用GET方式抓取数据
复制任意一条首页首条新闻的标题,在源码页面按【Ctrl+F】组合键调出搜素框,将标题粘贴在搜索框中,然后按【Enter】键。
如图所示,标题可以在源码中搜索到,请求对象是www.cntour.cn,请求方式是GET(所有在源码中的数据请求方式都是GET),如图所示。

确定好请求对象和方式后,在PyCharm中输入以下代码。
import requests # 导入requests包 url = 'http://www.cntour.cn/' strhtml = requests.get(url) # GET方式,获取网页数据 print(strhtml.text)
运行结果如图所示。

加载库使用的语句是import+库的名字。在上述过程中,加载requets库的语句是:import requests 。
import requests
用GET方式获取数据需要调用requests库中的get方法,使用方法是在requests后输入英文点号,如下所示。
requests.get
将获取到的数据存到strhtml变量中,代码如下。
strhtml = requests.get(url)
这个时候strhtml是一个URL对象,它代表整个网页,但此时只需要网页中的源码,下面的语句表示网页源码。
strhtml.text
2.3.4 使用POST方式抓取数据
首先输入有道翻译的网址:http://fanyi.youdao.com/,进入有道翻译页面。
按快捷键F12,进入开发者模式,单击Network,此时内容为空,如图所示。

在有道翻译中输入“我爱中国”,单击“翻译”按钮,如图所示。

在开发者模式中,依次单击“Network”按钮和“XHR”按钮,找到翻译数据,如图所示。

单击Headers,发现请求数据的方式为POST。如图所示。

找到数据所在之处并且明确请求方式之后,接下来开始撰写爬虫。
首先,将Headers中的URL复制出来,并赋值给url,代码如下。
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
POST的请求获取数据的方式不同于GET,POST请求数据必须构建请求头才可以。From Data中的请求参数如图所示,将复制并构建一个新字典。
From_data = {'i': '我爱中国','from': 'AUTO','to': 'AUTO','smartresult': 'dict','client': 'fanyideskweb',
'salt': '15607567224566','sign': '93aa0f523cfe67eabb7466faa802a9f5','ts': '1560756722456',
'bv': '8c1d961492d2126df817a1dafe4e9e56','doctype': 'json','version': '2.1','keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'}

接下来使用requests.post方法请求表单数据,代码如下。
import requests response = requests.post(url,data = payload)
将字符串格式的数据转换成JSON格式数据,并根据数据结构,提取数据,并将翻译结果打印出来,代码如下。
import json content = json.loads(response.text) print(content['translateResult'][0][0]['tgt'])
使用requests.post方法抓取有道翻译结果的完整代码如下。
import requests import json def get_translate_date(word=None): # 删除链接中的translate后的_o url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' From_data = { 'i': word, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': '15607567224566', 'sign': '93aa0f523cfe67eabb7466faa802a9f5', 'ts': '1560756722456', 'bv': '8c1d961492d2126df817a1dafe4e9e56', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTlME' } # 请求表单数据 response = requests.post(url,From_data) # 将JSON格式字符串转字典 content = json.loads(response.text) # 打印翻译后的数据 print(content['translateResult'][0][0]['tgt']) if __name__ == '__main__': get_translate_date('我爱中国')
浙公网安备 33010602011771号