Retrieving Data over HTTP
Python 内置了 sockets 可以实现与网络连接并通过 Python 提取数据的功能。
socket 是可以提供双向连接的,我们可以对同一个 socket 进行读写操作。比方说,A 对 socket 写入信息,并且将其发送给 socket 连接另一端 B;那么 B 读取 socket 的内容就可以得到 A 的信息。但是这样会有一个问题,比如说, A端并没有发送任何信息,而 B 端一直在尝试读取 socket 的内容,那么 A 端和 B 端只能陷入漫长的等待。所以就引入了通信协议。协议通过规定谁先发送,谁后响应等来规避上述的问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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()
打开网页后,我们就可以读取数据,像读取本地文件一样。
1
2
3
4
5
6
|
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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 文件转换为树,这样可以方便我们后续提取有效的数据。
1
2
3
4
5
6
7
8
9
10
11
|
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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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
出处:https://www.cnblogs.com/yukiwu/
以上就是python如何获取网络数据的详细内容,更多关于python获取网络数据的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/yukiwu/p/14627670.html