一文带你了解Python Socket 编程

大家好,我是皮皮。

前言

Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口号一般大于1024),协议有很多种,一般我们经常用到的就是TCP,IP,UDP。下面我们来详细了解下Socket吧。

一、导入Socket模块

因为要操作套接字,所以需要用到套接字模块,系统中自带的就很不错,下面我们来导入:

import socket

二、Socket基本用法

1.建立一个简单的Socket连接

#创建Tcp/Ip套接字
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式Socket
#创建Udp/Ip套接字
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报式Socket
socket.AF_UNIX  #只能够用于单一的Unix系统进程间通信
socket.AF_INET6  #只能够用于IPv6通信
socket.SOCK_RAW  #原始套接字,可以处理ICMP、ARP等网络报文,其它的不行
socket.SOCK_SEQPACKET  #可靠的连续数据包服务

2.协议对应端口

应用程序    FTP   TFTP  TELNET  SMTP  DNS   HTTP  SSH   MYSQL  POP3   MONGO
  端口     21,20  69     23     25    53    80    22    3306   110   27017
  协议      TCP   UDP    TCP    TCP   UDP   TCP   TCP    TCP   TCP    TCP

3.Socket函数

#创建Socket连接,比Connect更高级,可以自动解析不是数字的host地址,兼容IPv4IPv6
socket.create_connection(address=('localhost',4320),timeout=4,source_address=('localhost',4320))  #前后两个端口号一定要是一致,不然会报错

#构建一对已连接的套接字对象,新创建的套接字都是不可继承的
socket.socketpair(family=socket.AF_INET,type=socket.SOCK_STREAM,proto=0)

#从文件描述符获取到socket连接对象
socket.fromfd(fd=ab.fileno(),family=socket.AF_INET,type=socket.SOCK_STREAM,proto=0)

#套接字对象的类型
socket.SocketType

#返回套接字的5元组列表地址 ,支持IPV4/IPV6解析
socket.getaddrinfo(host='localhost',port=3453,family=socket.AF_INET,type=socket.SOCK_STREAM,proto=socket.IPPROTO_TCP,flags=0)
output:
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('127.0.0.1', 3453))]

#获取主机名
socket.gethostname()
socket.getfqdn()
socket.getfqdn(socket.gethostname())

#将主机名转化为IP地址
socket.gethostbyname('www.baidu.com') #不支持IPV6解析
socket.gethostbyname_ex('www.baidu.com') #返回三元组,(主机名,相同地址的其它可用主机名的列表,IPv4 地址列表)

#网络ip地址
socket.gethostbyname(socket.getfqdn(socket.gethostname()))

#将ip地址转化为主机名,返回三元组(主机名,相同地址的其它可用主机名的列表,IPv4地址列表),支持IPV4/IPV6
socket.gethostbyaddr('192.168.1.4')

#解析主机名或者IP地址
socket.getnameinfo(('192.168.1.4',5434),0)

#判断是否支持IPV6
socket.has_ipv6

#返回服务所使用的端口号
socket.getservbyname('https','tcp') #第一个参数为服务协议:Https,Http;第二个为传输协议:Tcp Udp

#返回端口所对应的服务
socket.getservbyport(443,'tcp')

#设置主机名(仅限于Unix)
socket.sethostname(name)

#返回网卡信息的列表(仅限于Unix)
socket.if_nameindex()

#32位字节存储Ip地址(序列化)
socket.inet_aton('127.0.0.1')

#将32位字节转化为Ip地址(反序列化)
socket.inet_ntoa(b'\x7f\x00\x00\x01')
一文带你了解Python Socket 编程

4.套接字函数

1).服务器端函数

s.bind((host,port)) #将地址绑定到套接字,以(host,port)的元祖形式
s.listen(num)  #建立最多num个连接,最好别太大
s.accept()     #等待并接受客户端的连接,返回新的套接字对象和(host,port)元祖

2).客户端函数

s.connect((host,port)) #建立与服务器的连接,以(host,port)的元祖形式
s.connect_ex((host,port)) #和上面的功能差不多,只是出错了不抛异常,只是返回出错码

3).通用函数


s.recv(size,flag)       #接收最多size个大小的数据,flag可以忽略,返回值为数据是字符串形式
s.send(str,flag)        #发送str数据,返回值是要发送的字节数量,可能数据未全部发送
s.sendall(str,flag)     #发送全部str数据,成功返回None,失败则抛出异常
s.recv(size,flag)       #接受最多size个数据,并以字符串形式返回
s.recvfrom(str,flag)    #与recv相同,但是返回值是(接收数据的字符串,发送数据的套接字地址)的元祖形式
s.sendto(str,flag,address) #连接到当前套接字的远程地址。返回值是发送的字节数,主要用于UDP
s.getpeername()     #返回连接套接字的远程地址。返回值通常是元组(host,ports.getsockname()     #返回套接字自己的地址。通常是一个元组(host,port)
s.setsockopt(level,optname,value) # 设置给定套接字选项的值。
#假如端口被socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过TIME_WAIT的过程之后才能使用;为了实现端口的马上复用,可以选择setsocket()函数来达到目的。
#level:选项定义的层次。支持SOL_SOCKETIPPROTO_TCPIPPROTO_IPIPPROTO_IPV6#optname:需设置的选项。SO_REUSEADDR SO_REUSEPORT
#value:设置选项的值。
s.getsockopt(level,optname,buflen) #返回套接字选项的值。buflen:缓存长度
s.settimeout(time)  #设置socket连接超时时间,单位为秒,超时一般在刚创建套接字时设置
s.gettimeout()      #返回当前超时的时间,单位是秒,如果没有设置超时,则返回Nones.close()           #关闭套接字
s.fileno()          #套接字的文件描述符
s.shutdown(how)     # 关闭连接一边或两边
s.setblocking(bool) #是否阻塞(默认True),如果设置False,那么acceptrecv时一旦无数据,则报错。
s.makefile()        #创建一个与该套接字相关联的文件

5.一个简单的客户端与服务端交互

Server.py

import socket 
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)             # 创建socket对象
s.bind(('127.0.0.1',4323))                                      # 绑定地址
s.listen(5)                                                     # 建立5个监听
while True:
    conn,addr= s.accept()                                       # 等待客户端连接
    print('欢迎{}'.format(addr))                              #打印访问的用户信息
    while True:
        data=conn.recv(1024) 
        dt=data.decode('utf-8')                                 #接收一个1024字节的数据 
        print('收到:',dt)
        aa=input('服务器发出:') 
        if aa=='quit':
            conn.close()                                        #关闭来自客户端的连接
            s.close()                                           #关闭服务器端连接
        else:
            conn.send(aa.encode('utf-8'))

Client.py


import socket   
import sys
c=socket.socket()                                           # 创建socket对象
c.connect(('127.0.0.1',4323))                                #建立连接
while True:
    ab=input('客户端发出:')
    if ab=='quit':
        c.close()                                               #关闭客户端连接
        sys.exit(0)
    else:
        c.send(ab.encode('utf-8'))                               #发送数据
        data=c.recv(1024)                                        #接收一个1024字节的数据
        print('收到:',data.decode('utf-8'))     
一文带你了解Python Socket 编程

可以看到我们实现了一个全双工的Tcp/Ip聊天工具,对于服务器和客户端来说,均可收发文件。

三、总结

Python中的socket编程难度不大,不过你要想写好的Socket也不容易,希望本文能让大家受益匪浅,毕竟小编可是把绝大多数经常用到的Api的功能都展示了。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

Pyecharts绘图API总结

一、初识Pyecharts

pyecharts简介

pyecharts 是一个用于生成 Echarts 图表的类库, Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。

Pyecharts官网

https://pyecharts.org/#/zh-cn/intro

pyecharts安装

pip install pyecharts

二、Pyecharts可视化

使用pyecharts可以绘制如下图表:

Scatter

散点图

Funnel

漏斗图

Bar

柱状图

Gauge

仪表盘

Pie

饼图

Graph

关系图

Line

折线/面积图

Liquid

水球图

Radar

雷达图

Parallel

平行坐标系

Sankey

桑基图

Polar

极坐标系

WordCloud

词云图

HeatMap

热力图

这里我们简介一下常用的图表的API:

2.0、初始化设置

导入相关库:

from pyecharts.charts import *
import pyecharts.options as opts
  • from pyecharts.charts import *: 可以使用所有的图表对应的函数;
  • 使用 options 配置项,在 pyecharts 中,一切皆 Options,进行参数设置;

总体说明一下:

  1. .render_notebook ()随时随地渲染图表;
  2. .render() 这个不会直接产生图表,而是形成一个render.html的文件,可在浏览器中打开查看图表;

2.1、scatter()

这里我们绘制一个正余弦的散点图

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
y2 = np.cos(x)


# 参数设置
(Scatter() # 图形种类
 .add_xaxis(xaxis_data=x) # 设置x轴序列
 .add_yaxis(series_name='sin', y_axis=y) # 设置y轴序列
 .add_yaxis(series_name='cos', y_axis=y2, label_opts=opts.LabelOpts(is_show=False)) # is_show = False:表示不显示数值部分
).render_notebook()

结果如下:

2.2、line()

from pyecharts.charts import Line
import pyecharts.options as opts


x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)


(
    Line()
    .add_xaxis(xaxis_data=x)
    .add_yaxis(series_name='sin', y_axis=y, label_opts=opts.LabelOpts(is_show=False))
    .add_yaxis(series_name='cos', y_axis=np.cos(x), label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(title_opts=opts.TitleOpts(title='曲线'),
                     tooltip_opts=opts.TooltipOpts(axis_pointer_type='cross')
                    )
).render_notebook()

结果如下所示:

2.3、Bar()

柱状图的绘制:

from pyecharts.charts import Bar


bar = (
    Bar()
    .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
    .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
)
bar.render_notebook()

结果如下:

当然,这里只是最基本的柱图使用;我们还可以绘制混合柱图;

from pyecharts.charts import Bar
import pyecharts.options as opts


num = [110, 136, 108, 48, 111, 112, 103]
num2 = [90, 110, 101, 70, 90, 120, 99]
lab = ['哈士奇', '萨摩耶', '泰迪', '金毛', '牧羊犬', '吉娃娃', '柯基']


(
    Bar(init_opts=opts.InitOpts(width='720px', height='320px'))
    .add_xaxis(xaxis_data=lab)
    .add_yaxis(series_name='商家A', yaxis_data=num)
    .add_yaxis(series_name='商家B', yaxis_data=num2)
    .set_global_opts(
        title_opts=opts.TitleOpts(title='各商家拥有犬类数量情况', subtitle='如有雷同,纯属意外')
    )
).render_notebook()

结果如下所示:

2.4、Pie()

普通饼图:

from pyecharts.charts import Pie
import pyecharts.options as opts


num = [110, 136, 108, 48, 111, 112, 103]
lab = ['哈士奇', '萨摩耶', '泰迪', '金毛', '牧羊犬', '吉娃娃', '柯基']


(
    Pie(init_opts=opts.InitOpts(width='720px', height='320px'))
    .add(series_name='', 
         data_pair=[(j, i) for i, j in zip(num, lab)]
        )
).render_notebook()

结果如下:

环状饼图:

from pyecharts.charts import Pie
import pyecharts.options as opts


num = [110, 136, 108, 48, 111, 112, 103]
lab = ['哈士奇', '萨摩耶', '泰迪', '金毛', '牧羊犬', '吉娃娃', '柯基']


(
    Pie(init_opts=opts.InitOpts(width='720px', height='320px'))
    .add(series_name='', 
         radius=['40%', '75%'],
         data_pair=[(j, i) for i, j in zip(num, lab)]
        )
).render_notebook()

如图所示:

玫瑰饼图:

from pyecharts.charts import Pie
import pyecharts.options as opts


num = [110, 136, 108, 48, 111, 112, 103]
lab = ['哈士奇', '萨摩耶', '泰迪', '金毛', '牧羊犬', '吉娃娃', '柯基']


(
    Pie(init_opts=opts.InitOpts(width='720px', height='320px'))
    .add(series_name='', 
#          radius=['40%', '75%'],
#          center=['25%', '50%'],
         rosetype='radius',
         data_pair=[(j, i) for i, j in zip(num, lab)]
        )
).render_notebook()

如图所示:

2.5、图表的组合使用

from pyecharts.charts import Bar, Line


num = [110, 136, 108, 48, 111, 112, 103]
lab = ['哈士奇', '萨摩耶', '泰迪', '金毛', '牧羊犬', '吉娃娃', '柯基']


bar = (
    Bar(init_opts=opts.InitOpts(width='720px', height='320px'))
    .add_xaxis(xaxis_data=lab)
    .add_yaxis(series_name='', yaxis_data=num)
)


lines = (
    Line()
    .add_xaxis(xaxis_data=lab)
    .add_yaxis(series_name='', y_axis=num, label_opts=opts.LabelOpts(is_show=False))
)


bar.overlap(lines).render_notebook()

如图所示:

三、总结

Pyecharts可以绘制各种各样的图表,主流的一个数据可视化的库,因为相对于matplotlib,seaborn等数据可视化库,它的交互性比较好,图形绘制的比较清晰美观,所以应用的比较广泛,本文主要就普通常用图形做了简单的总结,当然它还可以绘制地理图形,具体参见官网相关API。

手把手教你用Python网络爬虫进行多线程采集高清游戏壁纸

一、背景介绍

大家好,我是皮皮。对于不同的数据我们使用的抓取方式不一样,图片,视频,音频,文本,都有所不同,由于网站图片素材过多,所以今天我们使用多线程的方式采集某站4K高清壁纸。

二、页面分析

目标网站:

http://www.bizhi88.com/3840x2160/

如图所示,有278个页面,这里我们爬取前100页的壁纸图片,保存到本地;

手把手教你用Python网络爬虫进行多线程采集高清游戏壁纸

解析页面

手把手教你用Python网络爬虫进行多线程采集高清游戏壁纸

如图所示所哟鱼的图片在一个大盒子里面(<div class=”flex-img auto mt”></div>),下面每一个div就对应一张高清壁纸;

然后每页div标签里面的壁纸图片数据的各种信息:1.链接;2.名称;下面是xpath的解析;

imgLink = each.xpath("./a[1]/img/@data-original")[0]
name = each.xpath("./a[1]/img/@alt")[0]

有一个注意点:

图片标签有src属性也有data-original属性,都对应图片的url地址,我们一般使用后者,因为data-original-src是自定义属性,图片的实际地址,而src属性需要页面加载完全才会全部显现,不然得不到对应地址;

三、抓取思路

上面已经说过,图片数据过多,我们不可能写个for循环一个一个的下载,所以必然要使用多线程或者是多进程,然后把这么多的数据队列丢给线程池或者进程池去处理;在python中,multiprocessing Pool进程池,multiprocessing.dummy非常好用,

  • multiprocessing.dummy 模块:dummy 模块是多线程;
  • multiprocessing 模块:multiprocessing 是多进程;

multiprocessing.dummy 模块与 multiprocessing 模块两者的api 都是通用的;代码的切换使用上比较灵活;

页面url规律:

'http://www.bizhi88.com/s/470/1.html' # 第一页
'http://www.bizhi88.com/s/470/2.html' # 第二页
'http://www.bizhi88.com/s/470/3.html' # 第三页

构建的url:

page = 'http://www.bizhi88.com/s/470/{}.html'.format(i)

那么我们定制两个函数一个用于爬取并且解析页面(spider),一个用于下载数据 (download),开启线程池,使用for循环构建13页的url,储存在列表中,作为url队列,使用pool.map()方法进行spider,爬虫的操作;

   def map(self, fn, *iterables, timeout=None, chunksize=1):
        """Returns an iterator equivalent to map(fn, iter)”“”
    这里我们的使用是:pool.map(spider,page) # spider:爬虫函数;page:url队列

作用:将列表中的每个元素提取出来当作函数的参数,创建一个个进程,放进进程池中;

参数1:要执行的函数;

参数2:迭代器,将迭代器中的数字作为参数依次传入函数中;

四、数据采集

导入相关第三方库

from lxml import etree # 解析
import requests # 请求
from multiprocessing.dummy import Pool as ThreadPool # 并发
import time # 效率

页面数据解析

def spider(url):
    html = requests.get(url, headers=headers)
    selector = etree.HTML(html.text)
    contents = selector.xpath("//div[@class='flex-img auto mt']/div")
    item = {}
    for each in contents:
        imgLink = each.xpath("./a[1]/img/@data-original")[0]
        name = each.xpath("./a[1]/img/@alt")[0]


        item['Link'] = imgLink
        item['name'] = name
        towrite(item)

download下载图片

def download_pic(contdict):
    name = contdict['name']
    link = contdict['Link']
    with open('img/' + name + '.jpg','wb') as f:
        data = requests.get(link)
        cont = data.content
        f.write(cont)
        print('图片' + name + '下载成功!')

main() 主函数

   pool = ThreadPool(6)
    page = []
    for i in range(1, 101):
        newpage = 'http://www.bizhi88.com/s/470/{}.html'.format(i)
        page.append(newpage)
    result = pool.map(spider, page)
    pool.close()
    pool.join()

说明:

  1. 在主函数里我们首选创建了六个线程池;
  2. 通过for循环动态构建100条url;
  3. 使用map() 函数对线程池中的url进行数据解析存储操作;
  4. 当线程池close的时候并未关闭线程池,只是会把状态改为不可再插入元素的状态;

五、程序运行

if __name__ == '__main__':
    start = time.time() # 开始计时
    main()
    print(end - start) # 时间差

结果如下:

手把手教你用Python网络爬虫进行多线程采集高清游戏壁纸

当然了这里只是截取了部分图像,总共爬取了,2000+张图片。

六、总结

本次我们使用了多线程爬取了某壁纸网站的高清图片,如果使用requests很明显同步请求并且下载数据是比较慢的,所以我们使用多线程的方式去下载图片,提高了爬取效率。

趣味解读Python面向对象编程 (类和对象)

一、面向对象简介

考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介绍。而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁。

用我们的现实思维方式该怎么用程序表达呢?

  • 面向过程:根据业务逻辑从上到下写代码。
  • 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程。面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑。

今天来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)。

面向对象编程的2个非常重要的概念:类和对象。

对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类。

类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象。

二、分析类与对象

1. 类

物以类聚,人以群分。
具有相似内部状态和运动规律的实体的集合(或统称为抽象)。
具有相同属性和行为事物的统称。

类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在,一个类可以找到多个对象。

趣味解读Python面向对象编程 (类和对象)

2. 对象

某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。可以是直接使用的。

趣味解读Python面向对象编程 (类和对象)

3. 类和对象之间的关系

趣味解读Python面向对象编程 (类和对象)

小总结:类就是创建对象的模板。

4. 区分类和对象

奔驰smart 类
张三的那辆奔驰smart 对象
水果 类
苹果 类
红苹果 类 红富士苹果 类
我嘴里吃了一半的苹果 对象

5. 类的构成

类(Class) 由3个部分构成

  • 类的名称:类名
  • 类的属性:一组数据
  • 类的方法:允许对对象进行操作的方法 (行为)

举例:

1)人类设计,只关心3样东西:

  • 事物名称(类名):人(Person)
  • 属性:身高(height)、年龄(age)
  • 方法(行为/功能):跑(run)、打架(fight)

2)狗类的设计

  • 类名:狗(Dog)
  • 属性:品种 、毛色、性别、名字、 腿儿的数量
  • 方法(行为/功能):叫 、跑、咬人、吃、摇尾巴
趣味解读Python面向对象编程 (类和对象)

6. 类的抽象

如何把日常生活中的事物抽象成程序中的类?

拥有相同(或者类似)属性和行为的对象都可以抽像出一个类。

方法:一般名词都是类(名词提炼法)

<1> 坦克发射3颗炮弹轰掉了2架飞机

  • 坦克 –> 可以抽象成类。
  • 炮弹 –> 可以抽象成类。
  • 飞机 –> 可以抽象成类。

<2> 小明在公车上牵着一条叼着热狗的狗

  • 小明 –> 人类。
  • 公车 –> 交通工具类。
  • 热狗 –> 食物类。
  • 狗 –> 狗类。

<3>【想一想】如下图中,有哪些类呢?

趣味解读Python面向对象编程 (类和对象)

说明:

  • 子弹
  • 手榴弹
  • 刀子
  • 箱子

<4>【想一想】如下图中,有哪些类呢?

趣味解读Python面向对象编程 (类和对象)

说明:

  • 向日葵
  • 类名:xrk
  • 属性:颜色、品类
  • 行为:放阳光
  • 豌豆
  • 类名:wd
  • 属性:颜色 、发型、血量
  • 行为:发炮、摇头
  • 坚果:
  • 类名:jg
  • 属性:血量、类型
  • 行为:阻挡
  • 僵尸:
  • 类名:js
  • 属性:颜色、血量、 类型、速度
  • 行为:走、跑跳、吃、死

三、项目

1. 定义类

定义一个类,格式如下:

class 类名:
    方法列表

demo:定义一个Cat类

# 定义类
class Cat:
   # 方法   def eat(self):
       print("猫在吃鱼....")
   def drink(self):
       print("猫在喝可乐...")

说明:

  • 定义类时有2种:新式类和经典类,上面的Cat为经典类,如果是Cat(object)则为新式类
  • 类名的命名规则按照”大驼峰”。

2. 创建对象

Python中,可以根据已经定义的类去创建出一个个对象。

创建对象的格式为:

对象名 = 类名()

创建对象demo:

# 定义一个类
class Cat:
   # 属性
   # 方法
   def eat(self):
       print("猫在吃鱼....")
   def drink(self):       print("猫在喝可乐...")
# 根据类,创建一个对象tom = Cat()

3. 调用对象的方法

class Cat:
   # 属性
   # 方法
   def eat(self):
       print("猫在吃鱼....")
   def drink(self):       print("猫在喝可乐...")
# 创建了一个对象tom = Cat()tom.eat() # 调用对象的eat方法tom.drink()

运行结果,如图所示:

趣味解读Python面向对象编程 (类和对象)

4. 给对象添加属性

class Cat:
    # 属性    # 方法    def eat(self):        print("猫在吃鱼....")
    def drink(self):        print("猫在喝可乐...")
# 创建了一个对象tom = Cat()# 给对象tom添加了一个属性,叫name,里面的值是"汤姆"
tom.name = "汤姆"
# 给对象tom添加了一个属性,叫age,里面的值是30
tom.age = 30
# 调用tom的方法tom.eat()tom.drink()print(tom.name)
print(tom.age)

运行结果,如图所示:

趣味解读Python面向对象编程 (类和对象)

5. 通过方法获取对象属性。

class Cat:
    # 属性    # 方法    def eat(self):        print("猫在吃鱼....")
    def drink(self):        print("猫在喝可乐...")
    def introduce(self):        # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄))
        print("名字是:%s, 年龄是:%d" % (tom.name, tom.age))
# 创建了一个对象tom = Cat()# 给对象tom添加了一个属性,叫name,里面的值是"汤姆"
tom.name = "汤姆"
tom.age = 30
# 调用tom的方法tom.eat()tom.drink()# 直接通过对象获取其属性print(tom.name)
print(tom.age)
print("-"*30)
# 调用tom的方法,在其方法中获取它的属性tom.introduce()

运行结果,如图所示:

趣味解读Python面向对象编程 (类和对象)

四、总结

本文以生活中的基础现象为切入点,主要介绍了Python的面向对象基础知识,用丰富的案例帮助大家更好的去了解对象,最后以一只猫作为小项目,使用Python编程语言,方便大家增加对类和对象的认识,希望对大家的学习有帮助。

IT共享之家

入群请在微信后台回复【入群】

****看完本文有收获?请转发分享给更多的人****

—————— End ——————

往期精彩文章推荐:

一篇文章教会你利用Python网络爬虫成为斗图达人

【一、项目背景】

你是否在寻找可以与高手斗图的应用? 你是否在寻找可以自制表情的应用?你是否在寻找最全、最爆笑的表情库?

斗图网是一个收集了成千上万的撕逼斗图表情包,在这里你可以快速找到想要的表情, 更好的“斗图”,助您成为真正的斗图终结者!

一篇文章教会你利用Python网络爬虫成为斗图达人

【二、项目目标】

下载表情包,保存文档。

【三、涉及的库和网站】

1、网址如下:

https://www.doutula.com/photo/list/?page={}

2、涉及的库:requests****、lxml、ssl****、time

3、软件:PyCharm

【四、项目分析】

1、如何找到表情包图片地址?

F12右键检查,找到对应的图片的地址。

一篇文章教会你利用Python网络爬虫成为斗图达人

观察网址的变化(一般取前三页):

https://www.doutula.com/photo/list/?page=1
https://www.doutula.com/photo/list/?page=2
https://www.doutula.com/photo/list/?page=3

发现点击下一页时,page{}每增加一页自增加1,用{}代替变换的变量,再用for循环遍历这网址,实现多个网址请求。

2. 如何解除ssl验证?

因为这个网址是https,需要导入一个ssl模块,忽略ssl验证。

一篇文章教会你利用Python网络爬虫成为斗图达人

3. ****如何获取Cookie?

右键检查,找到NetWork,随便复制一个Cookie即可。

一篇文章教会你利用Python网络爬虫成为斗图达人

【五、项目实施】

1、我们定义一个class类继承object,然后定义init方法继承self,再定义一个主函数main继承self。导入需要的库。

import requests
from lxml import etree
from fake_useragent import UserAgent
import ssl  # ssl验证import time
ssl._create_default_https_context = ssl._create_unverified_contextclass  Emoticon(object):
    def __init__(self):        pass    def main(self):        passif __name__ == '__main__': 
    spider = Emoticon()    spider.main()

2、导入网址和构造请求头,防止反爬。

 def __init__(self):
        self.headers = {'User-Agent': 'Mozilla/5.0'}
        self.url = 'https://www.doutula.com/photo/list/?page={}'

3、发送请求 ,获取响应,页面回调,方便下次请求。

 def get_page(self, url):
        res = requests.get(url=url, headers=self.headers)
        html = res.content.decode("utf-8")
        return html

4、xpath解析页面。

这里我们先获取父节点,在通过for循环遍历,找到对应的子节点(图片地址)。

一篇文章教会你利用Python网络爬虫成为斗图达人
  image = parse_html.xpath('//ul[@class="list-group"]/li/div/div//a')
  for i in image:      image_src_list = i.xpath('.//img/@data-original')[0]
      image_name = i.xpath('.//img//@alt')[0]

运行的结果:

一篇文章教会你利用Python网络爬虫成为斗图达人

5、对图片地址发生请求,取对应图片地址后10位,作为图片的命名,写入文件(每一张图片的后缀名不一样,所有这里不采用image_name作为图片的命名)。

 html2 = requests.get(url=image_src_list, headers=self.headers).content
  name = "/图/" + image_src_list[-20:]
  #print(name[-10:])
  with open(name[-10:], 'wb') as f:
      f.write(html2)      print("%s 【下载成功!!!!】" % image_name)
      print("==================================")

6、调用方法,实现功能。

   html = self.get_page(url)
   self.parse_page(html)
           print("======================第%s页爬取成功!!!!=======================" % page)

7、time模块打出执行时间。

 start = time.time()
  end = time.time()
  print('执行时间:%.2f' % (end - start))

【六、效果展示】

1、点击绿色小三角运行输入起始页,终止页。

一篇文章教会你利用Python网络爬虫成为斗图达人

2、将下载成功信息显示在控制台。

一篇文章教会你利用Python网络爬虫成为斗图达人

3、保存文档,在本地可以看到斗图。

一篇文章教会你利用Python网络爬虫成为斗图达人

【七、总结】

1、不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

2、本文基于Python网络爬虫,利用爬虫库,获取表情包,存入文档。

3、希望通过这个项目能够了解到,对于HTTPS网站,解除ssl验证的有大致的了解。

4、可以尝试的去爬取其他的分类的表情包,按照步骤去实现,实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

5、需要本文源码的小伙伴,后台回复“斗图达人”四个字,即可获取。

IT共享之家

入群请在微信后台回复【入群】

****看完本文有收获?请转发分享给更多的人****

—————— End ——————

往期精彩文章推荐:

一篇文章教会你利用Python网络爬虫抓取王者荣耀图片

【一、项目背景】

王者荣耀作为当下最火的游戏之一,里面的人物信息更是惟妙惟肖,但受到官网的限制,想下载一张高清的图片很难。(图片有版权)。

以彼岸桌面这个网站为例,爬取王者荣耀图片的信息。

一篇文章教会你利用Python网络爬虫抓取王者荣耀图片

【二、项目目标】

实现将获取到的图片批量下载。

 

【三、涉及的库和网站】

1、网址如下:

http://www.netbian.com/s/wangzherongyao/index.htm/

2、涉及的库:requestslxml

 

【四、项目分析】

首先需要解决如何对下一页的网址进行请求的问题。可以点击下一页的按钮,观察到网站的变化分别如下所示:

http://www.netbian.com/s/wangzherongyao/index_2.htm
http://www.netbian.com/s/wangzherongyao/index_3.htm
http://www.netbian.com/s/wangzherongyao/index_4.htm

观察到只有index_()变化,变化的部分用{}代替,再用for循环遍历这网址,实现多个网址请求。

 http://www.netbian.com/s/wangzherongyao/index_{}.htm

 

【五、项目实施】

1、我们定义一个class类继承object,然后定义init方法继承self,再定义一个主函数main继承self。准备url地址和请求头headers。

import requests
from lxml import etree
import time
class ImageSpider(object):
    def __init__(self):
        self.firsr_url = "http://www.netbian.com/s/wangzherongyao/index.htm"
        self.url = "http://www.netbian.com/s/wangzherongyao/index_{}.htm"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
        }

    def main(self):
        pass
if __name__ == '__main__':
    spider= ImageSpider()
    spider.main()

2、对网站发生请求。

'''发送请求  获取响应'''
    def get_page(self, url):
        res = requests.get(url=url, headers=self.headers)
        html = res.content.decode("gbk") #网络编码
        return html  #返回值

 3、对请求到的数据进行处理

'''解析数据'''
def parse_page(self, html):
        parse_html = etree.HTML(html)
        image_src_list = parse_html.xpath('//div[@class="list"]/ul/li/a//@href')
        for image_src in image_src_list:
            fa = "http://www.netbian.com" + image_src
            # print(fa)

4、在谷歌浏览器上,右键选择开发者工具或者按F12。

5、右键检查,找到图片二级的页面的链接,如下图所示。

一篇文章教会你利用Python网络爬虫抓取王者荣耀图片

6、对二级页面发生请求,for遍历得到的网址。

bimg_url = parse_html1.xpath('//div[@class="pic-down"]/a/@href')
        for i in bimg_url:
               diet = "http://www.netbian.com" + i
               # print(diet)
               html2 = self.get_page(diet)
               parse_html2 = etree.HTML(html2)
               # print(parse_html2)
               url2 =  parse_html2.xpath('//table[@id="endimg"]//tr//td//a/img/@src')
一篇文章教会你利用Python网络爬虫抓取王者荣耀图片

7、将获取的图片写入文档,获取图片的title值作为图片的命名。

filename = parse_html2.xpath('//table[@id="endimg"]//tr//td//a/@title')
            for e in filename:
                    # print(e)
                    dirname = "./王者荣耀/" + e + '.jpg'
                    html2 = requests.get(url=r, headers=self.headers).content
                    # print(html2)
                    print(dirname)
                    with open(dirname, 'wb') as f:
                        f.write(html2)
                        print("%s下载成功" % filename)

8、在main方法调用,如下所示。因为第一页的网址是没有规律的,所以这里先判断一下是不是第一页。

def main(self):
        startPage = int(input("起始页:"))
        endPage = int(input("终止页:"))
        for page in range(startPage, endPage + 1):
            if page == 1:
                url = self.firsr_url

            else:
                url = self.url.format(page)
            # print(url)
            html = self.get_page(url)
            print("第%s页爬取成功!!!!" % page)
            # print(html)
            self.parse_page(html)

 

【六、效果展示】

1、运行程序,在控制台输入你要爬取的页数,如下图所示。

一篇文章教会你利用Python网络爬虫抓取王者荣耀图片

2、将下载成功的图片信息显示在控制台,如下图所示。

一篇文章教会你利用Python网络爬虫抓取王者荣耀图片

3、在本地可以看到效果图,如下图所示。

一篇文章教会你利用Python网络爬虫抓取王者荣耀图片

【七、总结】

1、不建议抓取太多数据,容易对服务器造成负载,浅尝辄止即可。

2、希望通过这个项目,能够帮助大家下载高清的图片。

3、本文基于Python网络爬虫,利用爬虫库,实现王者荣耀图片的抓取。实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

4、英雄有很多,大家自行选择你喜欢的英雄做为你的桌面的壁纸吧。

5、需要本文源码的小伙伴,后台回复“王者荣耀”四个字,即可获取。

看完本文有收获?请转发分享给更多的人

IT共享之家

入群请在微信后台回复【入群】

——————- End ——————

往期精彩文章推荐:

 

一篇文章教会你使用Python定时抓取微博评论

【Part1——理论篇】

试想一个问题,如果我们要抓取某个微博大V微博的评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口,如下图所示。

一篇文章教会你使用Python定时抓取微博评论

但是很不幸,该接口频率受限,抓不了几次就被禁了,还没有开始起飞,就凉凉了。

一篇文章教会你使用Python定时抓取微博评论

接下来小编又选择微博的移动端网站,先登录,然后找到我们想要抓取评论的微博,打开浏览器自带流量分析工具,一直下拉评论,找到评论数据接口,如下图所示。

一篇文章教会你使用Python定时抓取微博评论

之后点击“参数”选项卡,可以看到参数为下图所示的内容:

一篇文章教会你使用Python定时抓取微博评论

可以看到总共有4个参数,其中第1、2个参数为该条微博的id,就像人的身份证号一样,这个相当于该条微博的“身份证号”,max_id是变换页码的参数,每次都要变化,下次的max_id参数值在本次请求的返回数据中。

一篇文章教会你使用Python定时抓取微博评论

 

【Part2——实战篇】

有了上文的基础之后,下面我们开始撸代码,使用Python进行实现。

一篇文章教会你使用Python定时抓取微博评论

1、首先区分url,第一次不需要max_id,第二次需要用第一次返回的max_id。

一篇文章教会你使用Python定时抓取微博评论

2、请求的时候需要带上cookie数据,微博cookie的有效期比较长,足够抓一条微博的评论数据了,cookie数据可以从浏览器分析工具中找到。

一篇文章教会你使用Python定时抓取微博评论

3、然后将返回数据转换成json格式,取出评论内容、评论者昵称和评论时间等数据,输出结果如下图所示。

一篇文章教会你使用Python定时抓取微博评论

4、为了保存评论内容,我们要将评论中的表情去掉,使用正则表达式进行处理,如下图所示。

一篇文章教会你使用Python定时抓取微博评论

5、之后接着把内容保存到txt文件中,使用简单的open函数进行实现,如下图所示。

一篇文章教会你使用Python定时抓取微博评论

6、重点来了,通过此接口最多只能返回16页的数据(每页20条),网上也有说返回50页的,但是接口不同、返回的数据条数也不同,所以我加了个for循环,一步到位,遍历还是很给力的,如下图所示。

一篇文章教会你使用Python定时抓取微博评论

7、这里把函数命名为job。为了能够一直取出最新的数据,我们可以用schedule给程序加个定时功能,每隔10分钟或者半个小时抓1次,如下图所示。

一篇文章教会你使用Python定时抓取微博评论

8、对获取到的数据,做去重处理,如下图所示。如果评论已经在里边的话,就直接pass掉,如果没有的话,继续追加即可。

一篇文章教会你使用Python定时抓取微博评论

这项工作到此就基本完成了。

 

【Part3——总结篇】

这种方法虽然抓不全数据,但在这种微博的限制条件下,也是一种比较有效的方法。

最后如果您需要本文代码的话,请在后台回复“微博”二字,觉得不错,记得给个star噢~

看完本文有收获?请转发分享给更多的人

IT共享之家

入群请在微信后台回复【入群】

一篇文章教会你使用Python定时抓取微博评论

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他

如何利用CSS选择器抓取京东网商品信息

前几天小编分别利用Python正则表达式BeautifulSoupXpath分别爬取了京东网商品信息,今天小编利用CSS选择器来为大家展示一下如何实现京东商品信息的精准匹配~~

如何利用CSS选择器抓取京东网商品信息

CSS选择器

目前,除了官方文档之外,市面上及网络详细介绍BeautifulSoup使用的技术书籍和博客软文并不多,而在这仅有的资料中介绍CSS选择器的少之又少。在网络爬虫的页面解析中,CCS选择器实际上是一把效率甚高的利器。虽然资料不多,但官方文档却十分详细,然而美中不足的是需要一定的基础才能看懂,而且没有小而精的演示实例。

如何利用CSS选择器抓取京东网商品信息

京东商品图

首先进入京东网,输入自己想要查询的商品,向服务器发送网页请求。在这里小编仍以关键词“狗粮”作为搜索对象,之后得到后面这一串网址:
https://search.jd.com/Search?keyword=%E7%8B%97%E7%B2%AE&enc=utf-8,其中参数的意思就是我们输入的keyword,在本例中该参数代表“狗粮”,具体详情可以参考Python大神用正则表达式教你搞定京东商品信息。所以,只要输入keyword这个参数之后,将其进行编码,就可以获取到目标URL。之后请求网页,得到响应,尔后利用CSS选择器进行下一步的数据采集。

商品信息在京东官网上的部分网页源码如下图所示:

如何利用CSS选择器抓取京东网商品信息

部分网页源码

仔细观察源码,可以发现我们所需的目标信息在红色框框的下面,那么接下来我们就要一层一层的去获取想要的信息。

在Python的urllib库中提供了quote方法,可以实现对URL的字符串进行编码,从而可以进入到对应的网页中去。

如何利用CSS选择器抓取京东网商品信息

CSS选择器在线复制

很多小伙伴都觉得CSS表达式很难写,其实掌握了基本的用法也就不难了。在线复制CSS表达式如上图所示,可以很方便的复制CSS表达式。但是通过该方法得到的CSS表达式放在程序中一般不能用,而且长的没法看。所以CSS表达式一般还是要自己亲自上手。

直接上代码,利用CSS去提取目标信息,如商品的名字、链接、图片和价格,具体的代码如下图所示:

如何利用CSS选择器抓取京东网商品信息

代码实现

如果你想快速的实现功能更强大的网络爬虫,那么BeautifulSoupCSS选择器将是你必备的利器之一。BeautifulSoup整合了CSS选择器的语法和自身方便使用API。在网络爬虫的开发过程中,对于熟悉CSS选择器语法的人,使用CSS选择器是个非常方便的方法。

最后得到的效果图如下所示:

如何利用CSS选择器抓取京东网商品信息

最终效果图

新鲜的狗粮再一次出炉咯~~~

如何利用CSS选择器抓取京东网商品信息

CSS选择器

关于CSS选择器的简单介绍:

BeautifulSoup支持大部分的CSS选择器。其语法为:向tag对象或BeautifulSoup对象的.select()方法中传入字符串参数,选择的结果以列表形式返回,即返回类型为list。

tag.select(“string”)

BeautifulSoup.select(“string”)

注意:在取得含有特定CSS属性的元素时,标签名不加任何修饰,如class类名前加点,id名前加 #。

手把手教你用Python网络爬虫获取网易云音乐歌曲

前天给大家分享了用Python网络爬虫爬取了网易云歌词,在文尾说要爬取网易云歌曲,今天小编带大家一起来利用Python爬取网易云音乐,分分钟将网站上的音乐down到本地。

跟着小编运行过代码的筒子们将网易云歌词抓取下来已经不再话下了,在抓取歌词的时候在函数中传入了歌手ID和歌曲名两个参数,其实爬取歌曲也是同样的道理,也需要传入这两个参数,只不过网易云歌曲的URL一般人找不到。不过也不要慌,有小编在,分分钟扫除您的烦恼。

网易云歌曲一般会有一个外链,专门用于下载音乐音频的,以赵雷的歌曲《成都》为例,《成都》的外链URL是:

http://music.163.com/song/media/outer/url?id=436514312.mp3,其中436514312这个数字是《成都》这首歌曲的ID。也就是说只要我们将歌曲的ID传入到外链URL中,就可以找到该歌曲的下载地址,之后通过Python标准库进行下载即可。

话不多说,直接上代码:

手把手教你用Python网络爬虫获取网易云音乐歌曲

程序设计好之后,运行程序,输入歌手的ID,以赵雷为例,其ID是6731,输入这个ID数值之后,程序将自动将赵雷的专辑歌曲及其对应的歌词下载到本地,运行的效果图如下所示:

手把手教你用Python网络爬虫获取网易云音乐歌曲

程序运行完毕之后,歌词和歌曲都down到本地了,如下图:

手把手教你用Python网络爬虫获取网易云音乐歌曲
手把手教你用Python网络爬虫获取网易云音乐歌曲

之后在本地便可以听到优雅的歌曲了,如《成都》,见下图:

手把手教你用Python网络爬虫获取网易云音乐歌曲

大家以后要听歌曲的话只要运行这个爬虫程序,输入你喜欢的那位歌手的ID,稍等片刻,就可以听到你想要的歌曲啦10万首歌曲就不在话下啦,只要你愿意,随便多少首都行

最后小编祝福大家身体健康,工作顺利~~欢迎大家转载噢

今天这个程序完整的代码截图可以参考小编前天分享的那篇基于Python网易云音乐歌词爬取文章,结合今天的代码,就可以如愿以偿啦~~~

——————- End ——————-

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他

小白如何学习Python网络爬虫?

小白如何学习Python网络爬虫?

人生苦短,我用Python

Python网络爬虫上手很快,能够尽早入门,可是想精通确实是需求些时间,需求达到爬虫工程师的级别更是需求煞费苦心了,接下来共享的学习道路是针对小白或许学习Python网络爬虫不久的同伴们。

学习网络爬虫能够分三步走,如果你是大神,请直接绕走,蟹蟹~~

第一步,刚触摸Python网络爬虫的时分肯定是先过一遍Python最基本的常识,比如说:变量、字符串、列表、字典、元组、操控句子、语法等,把根底打牢,这样在做案例的时分不会觉得模糊。根底常识能够参阅廖雪峰的教程,很根底,也非常易懂,关于新手能够很快接纳。此外,你还需求了解一些网络恳求的基本原理、网页结构(如HTML、XML)等。

第二步,看视频或许找一本专业的网络爬虫书本(如用Python写网络爬虫),跟着他人的爬虫代码学,跟着他人的代码敲,弄懂每一行代码,留意务必要着手亲身实践,这样才会学的更快,懂的更多。许多时分我们好大喜功,觉得自己这个会,然后不愿意着手,其实真实比及我们着手的时分便漏洞百出了,最好每天都坚持敲代码,找点感觉。开发东西主张选Python3,由于到2020年Python2就中止保护了,日后Python3肯定是干流。IDE能够选择pycharm、sublime或jupyter等,小编引荐运用pychram,由于它非常友爱,有些相似java中的eclipse,非常智能。浏览器方面,学会运用 Chrome 或许 FireFox 浏览器去检查元素,学会运用进行抓包。此外,在该阶段,也需求了解干流的爬虫东西和库,如urllib、requests、re、bs4、xpath、json等,一些常用的爬虫结构如scrapy等是必需求把握的,这个结构仍是蛮简略的,可能初学者觉得它很难抵挡,可是当抓取的数据量非常大的时分,你就发现她的美~~

第三步,你现已具有了爬虫思想了,是时分自己着手,锦衣玉食了,你能够独立设计爬虫体系,多找一些网站做操练。静态网页和动态网页的抓取战略和办法需求把握,了解JS加载的网页,了解selenium+PhantomJS模仿浏览器,知道json格局的数据该怎样处理。网页如果是POST恳求,你应该知道要传入data参数,而且这种网页一般是动态加载的,需求把握抓包办法。如果想进步爬虫功率,就得考虑是运用多线程,多进程仍是协程,仍是分布式操作。

小白沿着这三步走就现已很好了,其实网络爬虫的道路远不止这些,当你学完这些,你会发现一山还有一山高。之后你能够会碰到爬虫结构的运用、数据库、涉及到大规模爬虫,还需求了解分布式的概念、音讯行列、增量式爬取、常用的数据结构和算法、缓存,乃至还包括机器学习、数据发掘和剖析的使用。

希望小白们尽早入门,一起为学习Python奋斗!

——————- End ——————-

往期精彩文章推荐:

看完本文有收获?请转发分享给更多的人

Python爬虫与数据挖掘

入群请在微信后台回复【入群】

在公众号后台回复下列关键词可以免费获取相应的学习资料:

Python、网络爬虫 、书籍、数据分析、机器学习、数据结构、

大数据、服务器、Spark、Redis、C++、C、php、

mysql、java、Android、面试题、课堂、其他