zoukankan      html  css  js  c++  java
  • Python 学习笔记:获取网络数据

    Retrieving Data over HTTP


    Python 内置了 sockets 可以实现与网络连接并通过 Python 提取数据的功能。

    socket 是可以提供双向连接的,我们可以对同一个 socket 进行读写操作。比方说,A 对 socket 写入信息,并且将其发送给 socket 连接另一端 B;那么 B 读取 socket 的内容就可以得到 A 的信息。但是这样会有一个问题,比如说, A端并没有发送任何信息,而 B 端一直在尝试读取 socket 的内容,那么 A 端和 B 端只能陷入漫长的等待。所以就引入了通信协议。协议通过规定谁先发送,谁后响应等来规避上述的问题。

    import socket
    mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    mysock.connect(('fakeserver.com', 80)) # connect to server
    cmd = 'GET http://fakeserver.com/fake.txt HTTP/1.0
    
    '.encode()
    # send GET command followed by a blank line
    mysock.send(cmd) 
    
    while True: # receive data and print out
        data = mysock.recv(512)
        if (len(data) < 1):
            break
        print(data.decode())
    mysock.close()
    

    Retrieving Data with urllib


    利用 socket 我们可以与网站服务器,邮件服务器等建立连接。但是在建立连接之前,我们需要查询文档了解通信协议,然后根据协议编写程序。所以相较于 socket 这种黑魔法,我们可以利用更为简单的 Python Package。

    利用 urllib.urlopen() 打开网页后,我们就可以读取数据,像读取本地文件一样。

    import urllib.request
    
    fhand = urllib.request.urlopen('http://fakeserver.com/fake.txt')
    for line in fhand:
        #convert UTF-8 to unicode string and print out
        print(line.decode().strip()) 
    

    因为 urllib 使用简洁方便,所以也常用与网络爬虫。网络爬虫除了要网页读取数据以外还需要在 HTML 格式中解释出可用数据,所以除了 urllib 还有另一常用利器就是 BeautifulSoup

    import urllib.request, urllib.parse, urllib.error
    from bs4 import BeautifulSoup
    import ssl
    
    # Ignore SSL certificate errors
    ctx = ssl.create_default_context()
    ctx.check_hostname = False
    ctx.verify_mode = ssl.CERT_NONE
    
    html = urllib.request.urlopen('http://fakeserver.com/fake.html', context=ctx).read()
    soup = BeautifulSoup(html, 'html.parser')
    tags = soup('a')
    # Retrieve all of the anchor tags
    for tag in tags:
        print(tag.get('href', None))
    

    Retrieving Data from XML


    在网络交换数据,我们常用的格式有两种,一是 XML; 二是 JSON。

    XML 长得就像是 HTML 的近亲,可以看做是树的一种。利用 Python Package ElementTree 我们可以将 XML 文件转换为树,这样可以方便我们后续提取有效的数据。

    import xml.etree.ElementTree as ET
    data =  '''
                <person>
                <name>Jack</name>
                <phone>+123456789</phone>
                <email office="yes"/>
                </person> 
            '''
    tree = ET.fromstring(data) # convert xml into a tree
    print('Name:', tree.find('name').text)
    print('Attr:', tree.find('email').get('office'))
    

    Retrieving Data from JSON


    JSON 结构相较于 XML 来说更为简单,所以他的功能就没有那么强大。但是 JSON 有一个优势就是可以直接映射到 Python 的 dictionaries 和 lists 中,非常实用。

    我们可以直接利用 Python Package json 来解释 JSON。

    import json
    data =  '''
                {
                    "name" : "Jack",
                    "phone" : {
                        "type" : "intl",
                        "number" : "+123456789"
                    },
                    "email" : {
                        "office" : "yes"
                    }
                }
            '''
    info = json.loads(data)  # convert json into a dictianary
    print('Name:', info['name'])
    print('Attr:', info['email']['office'])
    
    作者:Yuki
    本文版权归作者和博客园所有,欢迎转载,转载请标明出处(附上博客链接)。 如果您觉得本篇博文对您有所收获,请点击右下角的 [推荐],谢谢!

    关注我的公众号,不定期更新学习心得
  • 相关阅读:
    Maven的settings.xml配置详解
    Activiti创建表(三)
    解决报错:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized
    解决报错(Could not create connection to database server.)
    Activiti插件安装(二)
    2018年四川理工学院软件工程考试大纲(软件工程概述)
    通过myclipse建立一个简单的Hibernate项目(PS:在单元测试中实现数据的向表的插入)
    MySQL如何永久解决由dos编码格式导致MySQ的显示乱码
    nyoj 209 + poj 2492 A Bug's Life (并查集)
    nyoj 208 + poj 1456 Supermarket (贪心)
  • 原文地址:https://www.cnblogs.com/yukiwu/p/14627670.html
Copyright © 2011-2022 走看看