• Python3爬虫(2)_利用urllib.urlopen发送数据获得反馈信息


    一、urlopen的url参数 Agent

     url不仅可以是一个字符串,例如:https://baike.baidu.com/。url也可以是一个Request对象,这就需要我们先定义一个Request对象,然后将这个Request对象作为urlopen的参数使用,

    代码:

    1 from urllib import request
    2 
    3 if __name__ == "__main__":
    4     req = request.Request("https://baike.baidu.com//")
    5     response = request.urlopen(req)
    6     html = response.read()
    7     html = html.decode("utf-8")
    8     print(html)

    运行之后,结果就不做展示了。

    urlopen()返回的对象,可以使用read()进行读取,同样也可以使用geturl()方法、info()方法、getcode()方法。

    • geturl()返回的是一个url的字符串;

    • info()返回的是一些meta标记的元信息,包括一些服务器的信息;

    • getcode()返回的是HTTP的状态码,如果返回200表示请求成功。

    下面更新代码,进行下面的测试:

    from urllib import request
    
    if __name__=="__main__":
        re=request.Request("http://baike.baidu.com")
        response=request.urlopen(re)
        print("geturl打印信息:%s"%(response.geturl()))
        print('**********************************************')
        print("info打印信息:%s"%(response.info()))
        print('**********************************************')
        print("getcode打印信息:%s"%(response.getcode()))

    二、urlopen的data参数

        我们可以使用data参数,向服务器发送数据。根据HTTP规范,GET用于信息获取,POST是向服务器提交数据的一种请求,再换句话说:

        从客户端向服务器提交数据使用POST;

        从服务器获得数据到客户端使用GET(GET也可以提交,暂不考虑)。

        如果没有设置urlopen()函数的data参数,HTTP请求采用GET方式,也就是我们从服务器获取信息,如果我们设置data参数,HTTP请求采用POST方式,也就是我们向服务器传递数据。

        data参数有自己的格式,它是一个基于application/x-www.form-urlencoded的格式,具体格式我们不用了解, 因为我们可以使用urllib.parse.urlencode()函数将字符串自动转换成上面所说的格式。

    三、发送data实例

    遇到一些问题,我也暂时使用有道翻译,以后有好的方法更新这部分关于百度百科的爬取。

    向有道翻译发送数据,得到网页反馈:

    1.打开界面

    2.鼠标右键检查元素

    3.选择网络/network

    4.在搜索输入框 输入查找内容,“network”界面出现了大量内容。

    5.得到下方内容:

    编写新程序:

    from urllib import request
    from urllib import parse
    import json
    
    if __name__ == "__main__":
        Request_URL = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
        Form_Data = {}
        Form_Data['i'] = 'Web'
        Form_Data['from'] = 'AUTO'
        Form_Data['to'] = 'AUTO'
        Form_Data['smartresult'] = 'dict'
        Form_Data['client'] = 'fanyideskweb'
        Form_Data['salt'] = '1524700622507'
        Form_Data['sign'] = 'c8c86253bcfb23d8405ab58cc0d2b5fa'
        Form_Data['doctype'] = 'json'
        Form_Data['xmlVersion'] = '2.1'
        Form_Data['keyfrom'] = 'fanyi.web'
        Form_Data['action'] = 'FY_BY_CLICKBUTTON'
        data = parse.urlencode(Form_Data).encode('utf-8')
        response = request.urlopen(Request_URL,data)
        html = response.read().decode('utf-8')
        translate_results = json.loads(html)
        translate_results = translate_results['translateResult'][0][0]['tgt']
        print("翻译的结果是:%s" % translate_results)

    报错:

    RESTART: C:UsersDELLAppDataLocalProgramsPythonPython36urllib_test01.py
    Traceback (most recent call last):
    File "C:UsersDELLAppDataLocalProgramsPythonPython36urllib_test01.py", line 23, in <module>
    translate_results = translate_results['translateResult'][0][0]['tgt']
    KeyError: 'translateResult'

    这是因为data['salt']是时间戳,data['sign']是时间戳和翻译内容加密后生成的,因为不知道网站的加密方法,

    在这里选择调整uri和data,并根据http://bbs.fishc.com/thread-98973-1-1.html这里的帖子做出调整:

    import os,urllib.request
    import urllib.parse
    import json
    a = 5
    while a > 0:
            txt = input('输入要翻译的内容:')
            if txt == '0':
                    break
                    
            else:
                    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&sessionFrom=https://www.baidu.com/link'
                    data = {
                    'from':'AUTO',
                    'to':'AUTO',
                    'smartresult':'dict',
                    'client':'fanyideskweb',
                    'salt':'1524700622507',
                    'sign':'c8c86253bcfb23d8405ab58cc0d2b5fa',
                    'doctype':'json',
                    'version':'2.1',
                    'keyfrom':'fanyi.web',
                    'action':'FY_BY_CL1CKBUTTON',
                    'typoResult':'false'}
    
                    data['i'] = 'Web'
    
                    data = urllib.parse.urlencode(data).encode('utf - 8')
                    wy = urllib.request.urlopen(url,data)
                    html = wy.read().decode('utf - 8')
                    print(html)
    
                    ta = json.loads(html)
                    print('翻译结果: %s '% (ta['translateResult'][0][0]['tgt']))
                    a = a - 1

    结果为:

          JSON是一种轻量级的数据交换格式,我们需要在爬取到的内容中找到JSON格式的数据,再将得到的JSON格式的翻译结果进行解析。

         总而言之,这部分的内容我终于结束了,debug太耗费时间了!

  • 相关阅读:
    RCNN,Fast RCNN,Faster RCNN 的前生今世:(4) SSD
    RCNN,Fast RCNN,Faster RCNN 的前生今世:(0) DMP
    nachos3.4 threads管理 (c++)
    逻辑回归与多分类逻辑回归
    [LeetCode]String to Integer (atoi)
    [LeetCode]Reverse Integer
    [LeetCode]ZigZag Conversion
    [LeetCode]Longest Palindromic Substring
    [LeetCode]Median of Two Sorted Arrays
    平面点的旋转公式
  • 原文地址:https://www.cnblogs.com/WittPeng/p/8948018.html
Copyright © 2020-2023  润新知