Python 3爬虫、数据清洗与可视化实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.3 使用requests库请求网站

2.3.1 安装requests库

首先在PyCharm中安装requests库,为此打开PyCharm,单击“File”(文件)菜单,选择“Default Settings”(默认设置)命令,如图2-6所示。

图2-6

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

图2-7

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

图2-8

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

图2-9

2.3.2 爬虫的基本原理

(1)网页请求的过程

● Request(请求)

每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。

● Response(响应)

服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容展示出来,就是我们所熟悉的网页请求,如图2-10所示。

图2-10

(2)网页请求的方式

GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方式,响应速度快。

POST:相比GET方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。

所以,在写爬虫前要先确定向谁发送请求,用什么方式发送。

2.3.3 使用GET方式抓取数据

复制任意一条首页首条新闻的标题,在源码页面按【Ctrl+F】组合键调出搜索框,将标题粘贴在搜索框中,然后按【Enter】键。

如图2-10所示,标题可以在源码中搜索到,请求对象是www.cntour.cn,请求方式是GET(所有在源码中的数据请求方式都是GET),如图2-11所示。

图2-11

确定好请求对象和方式后,在PyCharm中输入以下代码。

        import requests                    # 导入requests包
        url='http://www.cntour.cn/'
        strhtml=requests.get(url)          # GET方式,获取网页数据
        print(strhtml.text)

运行结果如图2-12所示。

图2-12

加载库使用的语句是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,此时内容为空,如图2-13所示。

图2-13

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

图2-14

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

图2-15

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

图2-16

找到数据所在之处并且明确请求方式之后,接下来开始撰写爬虫。

首先,将Headers中的URL复制出来,并赋值给url,代码如下。

        url = ' http://fanyi.youdao.com/translate? smartresult=dict&smartresult=rule'

POST的请求获取数据的方式不同于GET, POST请求数据必须构建请求头才可以。Form Data中的请求参数如图2-17所示,将其复制并构建一个新字典。

图2-17

      Form_data= {'i': ’我爱中国’, 'from':'AUTO', 'to': 'AUTO', 'smartresult':
  'dict', 'client':'fanyideskweb',
                    'salt':'1512399450582', 'sign':' 78181ebbdcb38de9b4a3f4cd1d
  38816b', 'doctype':'json',
                    'version':'2.1', 'keyfrom':'fanyi.web',
                    'action':'FY_BY_CLICKBUTTION', 'typoResult':'false'}

接下来使用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):
            url='http://fanyi.youdao.com/translate? smartresult=dict&smartresult
    =rule'
            Form_data = {'i':word, 'from':'AUTO', 'to': 'AUTO', 'smartresult': 'dict',
    'client':'fanyideskweb',
                      'salt':'1512399450582', 'sign':'78181ebbdcb38de9b4a3f4cd1d3
    8816b', 'doctype':'json',
                      'version': '2.1', 'keyfrom':'fanyi.web', 'action':'FY_BY_
    CLICKBUTTION', 'typoResult':'false'}
            # 请求表单数据
            response = requests.post(url, data=payload)
            # 将JSON格式字符串转字典
            content = json.loads(response.text)
            # 打印翻译后的数据
            print(content['translateResult'][0][0]['tgt'])
        if __name__ == '__main__':
            get_translate_date(’我爱数据’)