小言_互联网的博客

打开我的收藏夹 -- Python篇

505人阅读  评论(0)


python基础部分

Python打包exe文件

Python有如下发布方式:

.py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。

.pyc文件:有些公司或个人因为机密或者各种原因,不愿意源码被运行者看到,可以使用pyc文件发布,pyc文件是Python解释器可以识别的二进制码,故发布后也是跨平台的,需要使用者安装相应版本的Python和依赖库。

可执行文件:对于非码农用户或者一些小白用户,最简单的方式就是提供一个可执行文件,只需要把用法告诉他即可。比较麻烦的是需要针对不同平台需要打包不同的可执行文件。

pyinstaller

pip install pyinstaller

如果安装不成功,不是安装不了,是缺了点东西,pycharm会提醒你。

打包模式:

pyinstaller -F mycript.py
pyinstaller -F -w -pD:\tmp\core-python\libs -i d:\tmp\main.ico main.py
-F 表示生成单个可执行文件;

-D  –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)。

-w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!;

-c  –console, –nowindowed 使用控制台,无界面(默认)-p 表示你自己自定义需要加载的类路径,一般情况下用不到;

-i 表示可执行文件的图标。

Python爬虫

Scrapy框架

抓取网页:慕课网

首先,安装一下Scrapy。

接着,建立工程文件:

scrapy startproject scrapytest


创建爬虫文件:

我们在scrapytest/spiders/目录下创建一个文件MySpider.py
文件包含一个MySpider类,它必须继承scrapy.Spider类。

#引入文件
import scrapy

class MySpider(scrapy.Spider):
    #用于区别Spider
    name = "MySpider"
    #允许访问的域
    allowed_domains = []
    #爬取的地址
    start_urls = []
    #爬取方法
    def parse(self, response):
        pass

定义一个容器,保存爬取的数据。

我们在工程目录下可以看到一个items文件,我们可以更改这个文件或者创建一个新的文件来定义我们的item。
这里,我们在同一层创建一个新的item文件CourseItems.py


CourseItems.py的代码如下:

#引入文件
import scrapy

class CourseItem(scrapy.Item):
    #课程标题
    title = scrapy.Field()
    #课程url
    url = scrapy.Field()
    #课程标题图片
    image_url = scrapy.Field()
    #课程描述
    introduction = scrapy.Field()
    #学习人数
    student = scrapy.Field()

常用方法如下:

#定义一个item
course = CourseItem()
#赋值
course['title'] = "语文"
#取值
course['title']
course.get('title')
#获取全部键
course.keys()
#获取全部值
course.items()

重新编写爬虫文件MySpider.py:

import scrapy
#引入容器
from scrapytest.CourseItems import CourseItem

class MySpider(scrapy.Spider):
    #设置name
    name = "MySpider"
    #设定域名
    allowed_domains = ["imooc.com"]
    #填写爬取地址
    start_urls = ["http://www.imooc.com/course/list"]
    #编写爬取方法
    def parse(self, response):
        #实例一个容器保存爬取的信息
        item = CourseItem()
        #这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定
        #先获取每个课程的div
        for box in response.xpath('···'):
            #获取每个div中的课程路径
            item['url'] = ···
            #获取div中的课程标题
            item['title'] = ···
            #获取div中的标题图片地址
            item['image_url'] = ···
            
            ···
            
            yield item

运行scrapy框架:

在命令行下进入工程文件夹,然后运行

scrapy crawl MySpider

使用Pipeline处理数据:

当Item在Spider中被收集之后,它将会被传递到Pipeline,一些组件会按照一定的顺序执行对Item的处理。
Pipeline经常进行一下一些操作:
清理HTML数据
验证爬取的数据(检查item包含某些字段)
查重(并丢弃)
将爬取结果保存到数据库中

首先在scrapytest/目录下建立一个文件MyPipelines.py

找到settings.py文件,这个文件时爬虫的配置文件,在其中添加:

ITEM_PIPELINES = {
   
    'scrapytest.MyPipelines.MyPipeline': 1,
}

上面的代码用于注册Pipeline,其中scrapytest.MyPipelines.MyPipeline为你要注册的类,右侧的’1’为该Pipeline的优先级,范围1~1000,越小越先执行。

MyPipelines.py代码如下:

#引入文件
from scrapy.exceptions import DropItem
import json

class MyPipeline(object):
    def __init__(self):
        #打开文件
        self.file = open('data.json', 'w', encoding='utf-8')
    #该方法用于处理数据
    def process_item(self, item, spider):
        #读取item中的数据
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"
        #写入文件
        self.file.write(line)
        #返回item
        return item
    #该方法在spider被开启时被调用。
    def open_spider(self, spider):
        pass
    #该方法在spider被关闭时被调用。
    def close_spider(self, spider):
        pass

接下来,执行命令:

scrapy crawl MySpider

就可以在项目根目录下发现data.json文件。


selenium

控制浏览器窗口大小:driver.set_window_size(480, 800)
控制浏览器后退:driver.back()
控制浏览器前进:driver.forward()

刷新浏览器界面:driver.refresh()

元素操作:

1、clear() 清除文本,如果是一个文件输入框
2、send_keys(*value) 在元素上模拟按键输入
3、click() 单击元素

WebElement 接口常用方法:

submit()方法用于提交表单,这里特别用于没提交按钮的情况,例如搜索框输入关键字之后的“回车”操作,那么就可以通过submit()来提交搜索框的内容。
size 返回元素的尺寸。
text 获取元素的文本。
get_attribute(name) 获得属性值。
is_displayed() 设置该元素是否用户可见。

鼠标操作:

click_and_hold(element)左键点击
context_click(elem) 右击
double_click(elem) 双击
drag_and_drop(source,target) 拖动
move_to_element(elem) 鼠标悬停

键盘操作:(这个比较重要啦)

from selenium.webdriver.common.keys import Keys
  #在使用键盘按键方法前需要先导入keys 类包。
    send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
    send_keys(Keys.SPACE) 空格键(Space)
    send_keys(Keys.TAB) 制表键(Tab)
    send_keys(Keys.ESCAPE) 回退键(Esc)
    send_keys(Keys.ENTER) 回车键(Enter)
    send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
    send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
    send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
    send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
    send_keys(Keys.F1) 键盘F1
    ……
    send_keys(Keys.F12) 键盘F12

多表单切换:

在web 应用中经常会遇到frame 嵌套页面的应用,页WebDriver 每次只能在一个页面上识别元素,对于frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过switch_to_frame()方法将当前定位的主体切换了frame 里。

还没有遇到过,因为平时切界面的时候都会换网址。
但是也遇到过切界面没换网址的情况,碧如腾讯校招网。

这时候估计就要用这个技术了吧。

switch_to_frame() 默认可以直接取表单的id 或name 属性进行切换,如果iframe 没有可用的id 和name 可以通过下面的方式进行定位:

#先通过xpth 定位到iframe
xf = driver.find_element_by_xpath('//*[@class="if"]')
#再将定位对象传给switch_to_frame()方法
driver.switch_to_frame(xf)
driver.switch_to_default_content()

如果完成了在当前表单上的操作可以通过switch_to_default_content()方法返回到上一层单。该方法不用指定某个表单的返回,默认对应与它最近的switch_to_frame()方法。


多窗口切换

有时候需要在不同的窗口切换,从而操作不同的窗口上的元素,WebDriver 提供了switch_to_window()方法可以切换到任意的窗口。

其实,我并不知道这个和重定位界面有啥性能上的区别,难道是因为这样的话支持前进和后退吗!!!


警告框处理

在WebDriver 中处理JavaScript 所生成的alert、confirm 以及prompt 是很简单的。具体做法是使用switch_to_alert()方法定位到alert/confirm/prompt。然后使用text/accept/dismiss/send_keys 按需进行操做。

text 返回alert/confirm/prompt 中的文字信息。
accept 点击确认按钮。
dismiss 点击取消按钮,如果有的话。
send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错。

上传文件

send_keys 实现上传:

from selenium import webdriver
import os
driver = webdriver.Firefox()
#打开上传功能页面
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')
driver.quit()

通过这种方法上传,就绕开了操作Windows 控件的步骤。如果能找上传的input 标签,那么基本都可以通过send_keys()方法向其输入一个文件地址来实现上传。


窗口截图!!!(这功能我一直想要)

Webdriver 提供了截图函数get_screenshot_as_file()来截取当前窗口。

 #coding=utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
try:
driver.find_element_by_id('kw_error').send_key('selenium')
driver.find_element_by_id('su').click()
except :
driver.get_screenshot_as_file("D:\\baidu_error.jpg")
driver.quit()

数据分析

pandas

series常规操作:

sis = Series([-2-1,0,1,2]
sis.to_frame()
sis.value_counts() # 统计每个唯一值的所有出现次数
sis.size
sis.shape
sis.count() # 返回非缺失值的数目
sis.min()
sis.max()
sis.median()
sis.std()
sis.sum()
sis.describe() # 返回摘要统计信息和几个分位数
sis.isnull() # 非空值
sis.fillna(0) # 用0来补充缺失值
#上述函数可以结合使用,如下
sis.isnull().sum()# 统计空值的个数

emmm,好吧,这个系列我写过。
数据分析师的修炼历程

那好吧,就拿个项目来糊弄一下了。


数据分析项目:马大师

本部分代码来自:朱小五是凹凸君呀的博客:小伙子不讲武德,竟用Python爬取了B站上1.4w条马老师视频数据来分析

马老师专栏在此,谁敢不笑?

https://api.bilibili.com/x/web-interface/web/channel/multiple/list?channel_id=3503796&sort_type=hot&page_size=30

获取视频数据代码:

def get_data(url,headers):
    data_m = pd.DataFrame(columns=['id','name','view_count','like_count','duration','author_name','author_id','bvid'])
    html = requests.get(url,headers=headers).content
    data = json.loads(html.decode('utf-8'))
    offset = data['data']['offset']
    print(offset)
    for j in range(30):
        data_m = data_m.append({
   'id':data['data']['list'][j]['id'],'name':data['data']['list'][j]['name'],
            'view_count':data['data']['list'][j]['view_count'],'like_count':data['data']['list'][j]['like_count'],
            'duration':data['data']['list'][j]['duration'],'author_name':data['data']['list'][j]['author_name'],
            'author_id':data['data']['list'][j]['author_id'],'bvid':data['data']['list'][j]['bvid']},
            ignore_index=True)
    return(offset,data_m)

爬取弹幕:

# 绘制词云图
stylecloud.gen_stylecloud(text=' '.join(text1), 
    collocations=False,
    font_path=r'C:\Windows\Fonts\msyh.ttc',
    icon_name='fas fa-play-circle',
    size=653,
    output_name='马保国词云图.png')
 
Image(filename='马保国词云图.png') 

数据可视化

pyechart 之我的网址

pyechart教程
pyechart案例

Pie——饼图比例显示

贴块儿代码吧

from pyecharts.charts import Pie
import pandas as pd
from pyecharts import options as opts
 
#  pd.read_csv() 将csv文件 以 二维的形式读入 且 第一行 默认 不算入
vote = pd.read_csv("vote_result.csv")
 
print(vote) # 二维形式输出
print(vote.values)
print(vote.values.tolist());
 
 
c = (
    Pie()
    .add(
        "",
        vote.values.tolist(),
 
        #下边只是设置 比例显示,无需知道底层细节
        label_opts=opts.LabelOpts(
            position="outside",
            formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c}  {per|{d}%}  ",
            background_color="#eee",
            border_color="#aaa",
            border_width=1,
            border_radius=4,
            rich={
   
                "a": {
   "color": "#999", "lineHeight": 22, "align": "center"},
                "abg": {
   
                    "backgroundColor": "#e3e3e3",
                    "width": "100%",
                    "align": "right",
                    "height": 22,
                    "borderRadius": [4, 4, 0, 0],
                },
                "hr": {
   
                    "borderColor": "#aaa",
                    "width": "100%",
                    "borderWidth": 0.5,
                    "height": 0,
                },
                "b": {
   "fontSize": 16, "lineHeight": 33},
                "per": {
   
                    "color": "#eee",
                    "backgroundColor": "#334455",
                    "padding": [2, 4],
                    "borderRadius": 2,
                },
            },
        ),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="Pie-rate"))
    .render("pie_rich_label.html")
) 

vote_result.csv

Areas_of_interest,Votes
金融,172
医疗保健,136
市场业,135
零售业,101
制造业,80
司法,68
工程与科学,50
保险业,29
其它,41

Python表白代码

本部分出自杨老师的告白文,喜欢的朋友自己去看杨老师的主页:Eastmount

想看效果自己去运行。

一行表白代码

我稍微改了一点点:

print('\n'.join([''.join([('love广军哥哥'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)]))

3D红色桃心

#coding:utf-8
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
 
#绘制3D桃心
def heart_3d(x,y,z):
    return (x**2+(9/4)*y**2+z**2-1)**3-x**2*z**3-(9/80)*y**2*z**3
 
#图像展示
def plot_implicit(fn, bbox=(-1.5, 1.5)):
    xmin, xmax, ymin, ymax, zmin, zmax = bbox*3
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    A = np.linspace(xmin, xmax, 100)  #resolution of the contour
    B = np.linspace(xmin, xmax, 40)   #number of slices
    A1, A2 = np.meshgrid(A, A)        #grid on which the contour is plotted

    #plot contours in the XY plane
    for z in B:
        X, Y = A1, A2
        Z = fn(X, Y, z)
        cset = ax.contour(X, Y, Z+z, [z], zdir='z', colors=('r',))
        # [z] defines the only level to plot
        # for this contour for this value of z

    #plot contours in the XZ plane
    for y in B: 
        X, Z = A1, A2
        Y = fn(X, y, Z)
        cset = ax.contour(X, Y+y, Z, [y], zdir='y', colors=('red',))
 
    #plot contours in the YZ plane
    for x in B: 
        Y, Z = A1, A2
        X = fn(x, Y, Z)
        cset = ax.contour(X+x, Y, Z, [x], zdir='x',colors=('red',))

    #轴
    ax.set_zlim3d(zmin, zmax)
    ax.set_xlim3d(xmin, xmax)
    ax.set_ylim3d(ymin, ymax)

    #显示图像
    plt.show()

#主函数
if __name__ == '__main__':
    plot_implicit(heart_3d)

我的告白气球

一波狗粮猝不及防。

今天我跟好兄弟吃完饭,跟他说我这学期准备学车,准备找对象,他说一定是可以实现的,我觉得应该可以实现吧,,,,

要学前端找他:这名没人用吧,一个明明可以回家发展却想先靠自己实力的大佬。
今天还收到另一个好兄弟的喜讯,他获得了CSDN博客专家,Java后端找他:唔仄lo咚锵

import turtle
import time

# 画心形圆弧
def chage_angle():
    for i in range(200):
        turtle.right(1)
        turtle.forward(2);

def move_position(x,y):
    turtle.hideturtle() # 隐藏画笔(先)
    turtle.up()  # 提笔
    turtle.goto(x,y)# 移动画笔到指定起始坐标(窗口中心为0,0)
    turtle.down()  # 下笔
    turtle.showturtle()  # 显示画笔

love = input("请输入表白语: ")
signature = input("请输入签名: ")
if love == '':
    love = "I LOVE YOU"


turtle.setup(width=800, height=500)     # 窗口(画布)大小
turtle.color('red', 'pink')     # 画笔颜色
turtle.pensize(3)       # 画笔粗细
turtle.speed(1)     # 描绘速度
# 初始化画笔起始坐标
move_position(x=0,y=-180)   # 移动画笔位置
turtle.left(140)    # 向左旋转140度

turtle.begin_fill()     # 标记背景填充位置

# 画心形直线( 左下方 )
turtle.forward(224)    # 向前移动画笔,长度为224
# 画爱心圆弧
chage_angle()      # 左侧圆弧
turtle.left(120)    # 调整画笔角度
chage_angle()      # 右侧圆弧
# 画心形直线( 右下方 )
turtle.forward(224)

turtle.end_fill()       # 标记背景填充结束位置

# 在心形中写上表白话语
move_position(0,20)      # 表白语位置
turtle.hideturtle()     # 隐藏画笔
turtle.color('#CD5C5C', 'pink')      # 字体颜色
# font:设定字体、尺寸(电脑下存在的字体都可设置)
turtle.write(love, font=('Arial', 30, 'bold'), align='center')

# 签写署名
if signature != '':
    turtle.color('red', 'pink')
    time.sleep(2)
    move_position(180, -180)
    turtle.hideturtle()  # 隐藏画笔
    turtle.write(signature, font=('Arial', 20), align="left")
    
    # 点击窗口关闭程序
window = turtle.Screen()
window.exitonclick()

Python好物推荐

Python跟我练

跟我练Python入门到精通

下周三,也就是2021年3.31,我将在CSDN上再次直播,这次的主题是“Python爬虫”,欢迎大家前来,先关注一下,不迷路哦

好的,到这儿吧。


转载:https://blog.csdn.net/qq_43762191/article/details/115166730
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场