欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python如何获取网络数据

程序员文章站 2022-03-05 13:57:12
retrieving data over httppython 内置了 sockets 可以实现与网络连接并通过 python 提取数据的功能。socket 是可以提供双向连接的,我们可以对同一个 s...

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\r\n\r\n'.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
出处:

以上就是python如何获取网络数据的详细内容,更多关于python获取网络数据的资料请关注其它相关文章!