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('我爱中国')

 

posted @ 2019-06-17 17:04  taoziya  阅读(694)  评论(0)    收藏  举报