Python 获取web网络信息-1

笔记格式

  1. 套接字不同域的通信原理:AF_INET, AF_UNIX
  2. 常见的套接字socket的分类:SOCK_STREAM, SOCK_DGRAM
  3. 一个最简单的抓取网络信息的python程序
  4. 如何通过HTTP协议抓取imag图片?
  5. 如何用urllib检索网络信息?
  6. BeautifulSoup

1. 套接字的域问题

  1. AF_INET域与AF_UNIX域socket通信原理对比
    https://www.bbsmax.com/A/QV5ZeRr2Jy/

  2. AF_INET域socket通信过程
    典型的TCP/IP四层模型的通信过程。发送方、接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口上,发送数据时,指定对方的IP端口,经过Internet,可以根据此IP端口最终找到接收方;接收数据时,可以从数据包中获取到发送方的IP端口。


    AF_INET.png
  1. AF_UNIX域socket通信过程
    典型的本地IPC,类似于管道,依赖路径名标识发送方和接收方。类似本地通信。

BTW:进程间通信IPC (InterProcess Communication)
https://www.jianshu.com/p/c1015f5ffa74

AF_UNIX.png

2. 常见的socket(套接字)分类

  1. socket是什么
    1.1 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
    1.2 建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
    1.3 socket是应用层和传输层间的桥梁,简单说就是包装应用层信息,并且把这些信息传到传输层那边。
socket
socket2
socket3
socket4
  1. SOCK_STREAM
    2.1 是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送。
    2.2 SOCK_STREAM是基于TCP的,数据传输比较有保障。
    2.3 SOCK_STREAM 是数据流,一般是tcp/ip协议的编程
  1. SOCK_DGRAM
    3.1 是无保障的面向消息的socket,主要用于在网络上发广播信息。
    3.2 SOCK_DGRAM是基于UDP的,专门用于局域网,基于广播
    3.3 SOCK_DGRAM分是数据抱,是udp协议网络编程

  2. 基于传输层差异,4种类型的Socket:
    (1)基于TCP的Socket:提供给应用层可靠的流式数据服务,使用TCP的Socket应用程序协议:BGP,HTTP,FTP,TELNET等。优点:基于数据传输的可靠性。
    (2)基于UDP的Socket:适用于数据传输可靠性要求不高的场合。基于UDP的Socket应用程序或协议有:RIP,SNMP,L2TP等。
    (3)基于RawIp的Socket:非连接,不可靠的数据传输。特点:能使应用程序直接访问网络层。基于RawIp的Socket有ping ,tracert,ospf等。
    (4)基于链路层的Socket。为IS-IS协议提供的Socket接口。使IS-IS协议可通过Socket直接访问链路层。非连接,不可靠通信服务。

3. 一个最简单的抓取网络信息的python程序

  1. 首先要调用python的专用库socket
  2. 定义socket的作用域和报文方式
  3. 定义host(web server)和IP端口
  4. 做一些简单操作 get 就是获取信息,定义通信协议HTTP。
  5. 取信息时encode,信息拿回来再decode。
import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(20)
    if (len(data) < 1):
        break
    print(data.decode(),end='')

mysock.close()

3.2

encode & decode


sokcet

4. 如何通过HTTP协议抓取imag图片

  1. 一般网络信息用的是HTTP(port 80), HTTPS(port 443)。前一个是不加密不安全链接,后一个是加密链接。

  2. 拿回来的信息需要减去报头并且解码(重新编码)。
    2.1 首先,虽然每次都是要求5120个字符,但是返回的并不确定(网络网速限制),所以要记录起止点(count,len)。根据这些起止点分割成一段一段的报文,然后再剪去报头。这个报头是协议HTTP中定义的这一串 “\r\n\r\n”
    2.2 为什么每次返回信息长度不定?这是因为HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

HTTP-packets

2.3 自己跟着写一遍我终于知道这代码啥意思了.....附上比代码长的个人注释。

import socket
import time

host = 'data.pr4e.org'
port = 80
mysock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
mysock.connect((host,port))
mysock.sendall(b'GET http://data.pr4e.org/cover3.jpg HTTP/1.0\r\n\r\n')
count = 0
picture = b""

while True:
    data = mysock.recv(5120)  # get one packet of data
    if (len(data)<1):break
    time.sleep(0.25)
    count = count + len(data) #how many length of data we have been received
    print(len(data),count)  # use len(data) to check how long this packet is.
    picture = picture + data  # adding all the received packets to be a picture file (binary)

mysock.close()

# Look for the end of the header (2 CRLF)
pos =  picture.find(b"\r\n\r\n") #using these four charaters to seperate the whole picture into small packets
print('Header length', pos)
print(picture[:pos].decode())

# Skip past the header and save the picture data
picture = picture[pos+4:]      #it is to remove these four charaters "\r\n\r\n"
fhand = open("stuff.jpg", "wb")     #create a picture enconding file
fhand.write(picture)            # transform the data into the file
fhand.close()

5. 如何用urllib检索网络信息?

这个库好方便又好简单,我决定忘记抛弃上面的socket。直接抓取URL中的内容,返回decode一下就可以了。

import urllib.request

fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
for line in fhand:
    print(line.decode().strip())

6. BeautifulSoup是什么

为了方便点,不用每次都放到路径里,可以在anaconda安装。

conda install -c anaconda beautifulsoup4 

参考资料:

  1. 菜鸟教程
    http://www.runoob.com/python3/python3-socket.html

  2. roland_sun
    Unix域套接字(Unix Domain Socket)介绍
    http://blog.csdn.net/roland_sun/article/details/50266565

  3. 百度/wiki

  4. http://blog.csdn.net/map_lixiupeng/article/details/41696933

  5. py4e的笔记整理,看起来好难,做起来还挺简单的。

  6. 华山大师兄
    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html

  7. HTTP 协议格式 和 HTTP Header
    https://my.oschina.net/manmao/blog/549123

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 运输层协议概述 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是...
    srtianxia阅读 2,384评论 0 2
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,031评论 6 174
  • Socket创建函数 socket.socket(socket_family, socket_type, prot...
    JianMing阅读 6,002评论 1 13
  • 一、网络各个协议:TCP/IP、SOCKET、HTTP等 网络七层由下往上分别为物理层、数据链路层、网络层、传输层...
    杯水救车薪阅读 2,253评论 0 17
  • 整个春节期间啥也没干,要么在睡觉,要么就在那看书,要么就是陪大伯做些杂事,要么就是在群聊天。 书也没看多少,一天看...
    我是哼哼哈嘿阅读 202评论 2 0