WuHao's Blog

May the force be with you

0%

Requests 库

robots.txt 网络爬虫排除标准

爬虫协议: http:// robots.txt
实例1.京东商品页面的爬取


实例2.亚马逊商品页面爬取

import requests
url = "https://item.jd.com/100012545852.html"
 try:
     # 更改头部信息
     kv = {'user-agent': 'Mozilla/5.0'}
    r = requests.get(url, headers=kv)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    # print(r.request.headers)
    print(r.text[:1000])
except:
    print("爬取失败")

实例3.百度,360搜索关键字提交

import requests
 url = "https://www.baidu.com/s"
 keyword = "Python"  #中文也没问题
 try:
     kv = {'wd': 'keyword'}
    r = requests.get(url, params=kv)
    # https://www.baidu.com/s?wd=Python
    print(r.request.url)
    r.raise_for_status()  # 1469
    r.encoding = r.apparent_encoding
    print(len(r.text))  #
    print(r.text)
except:
    print("爬取失败")

实例4.图片的爬取和抓取

import requests
import os 
url = "http://"
root = "D://pics//"
path = root+url.split('/')[-1] #原来的名字储存在本地
try:
if not os.path.exists(root): #根目录是否存在
    os.mkdir(root)
if not os.path.exists(path):
    r = requests.get(url)
    with open(path,'wb') as f:
        f.write(r.content)
        f.close()
        print("文件保存成功")
else:
    print("文件已经村在")
except:
print("爬取失败")

实例5. IP地址归属地查询
import requests
#url = "http://m.ip138.com/ip.asp?ip="
url = "https://www.ip138.com/iplookup.asp?ip="
try:
    kv = {'user-agent': 'Mozilla/5.0'}
    r = requests.get(url + 'IP地址' + '&action=2',headers=kv)
    print(r.status_code)
    r.encoding = r.apparent_encoding
    # 返回最后500字节
    #print(r.text[-500:])
    print(r.text[:2000])
except:
    print("爬取失败")


实例6.多线程对视频爬取

"""使用多线程爬取梨视频视频数据"""
"""https://www.cnblogs.com/zivli/p/11614103.html"""

import requests
 import re
 from lxml import etree
 from multiprocessing.dummy import Pool    

url = 'https://www.pearvideo.com/category_5'
page_text = requests.get(url=url).text

tree = etree.HTML(page_text)
# 1、获取页面中视频详情地址
li_list = tree.xpath('//ul[@id="listvideoListUl"]/li')
url_list = []
for i in li_list:
    # 2、构造出每个视频的详情地址
    detail_url = "https://www.pearvideo.com/" + i.xpath('./div/a/@href')[0]
    name = i.xpath('./div/a/div[2]/text()')[0] + '.mp4'
    # 3、向视频详情地址发起请求
    detail_page = requests.get(url=detail_url).text
    # 4、从response中解析出视频的真实地址
    ex = 'srcUrl="(.*?)",vdoUrl'
    video_url = re.findall(ex, detail_page)[0]
    dic = {
        'name': name,
        'url': video_url
    }
    url_list.append(dic)

def get_video_data(d):
    """
    向视频地址发起请求,二进制写入本地文件
    :param d:
    :return:
    """
    url = d['url']
    data = requests.get(url=url).content
    print(d['name'], "正在下载。。。")
    with open(d['name'], 'wb') as f:
        f.write(data)
        print(d['name'], "下载成功。。。")

# 使用多进程处理
pool = Pool(4)
pool.map(get_video_data, url_list)
pool.close()
pool.join()

BeautifulSoup库

from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>data</p>','html.parser')

"""Beautiful Soup库的基本元素"""

import requests
from bs4 import BeautifulSoup

url = "https://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
#print(soup.prettify())

# <title>This is a python demo page</title>
print(soup.title)

tag = soup.a
# <a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
print(tag)
# a
print(soup.a.name)
# p
print(soup.a.parent.name)
# body
print(soup.a.parent.parent.name)
# html
print(soup.a.parent.parent.parent.name)
# [document]
print(soup.a.parent.parent.parent.parent.name)
# {'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
print(tag.attrs)
# ['py1']
print(tag.attrs['class'])
# http://www.icourse163.org/course/BIT-268001
print(tag.attrs['href'])
# <class 'dict'>
print(type(tag.attrs))
# <class 'bs4.element.Tag'>
print(type(tag))

# Basic Python
print(soup.a.string)
# <p class="title"><b>The demo python introduces several python courses.</b></p>
print(soup.p)
# The demo python introduces several python courses.
print(soup.p.string)
# <class 'bs4.element.NavigableString'>
print(type(soup.p.string))

基于bs4库的HTML内容遍历方法
根据树形结构,有三种遍历方式:上行,下行和平行
下行:.contents 列表类型
.children    循环类型
.decendants    

上行:.parent
:.parents

for parent in soup.a.parents:
    if parent is None:
        print(parent)
    else:
        print(parent.name)

平行:.next_sibling
.previous_sibling
.next_siblings
.previous_siblings

基于bs4库的html格式化
.prettify()
#bs4库使用utf-8编码方式与Python3.X匹配

信息的标记

HTML,XML,一对标签
JSON 有类型的键值对构成的表达形式
YAML 无类型键值对 key:value
import requests
from bs4 import BeautifulSoup

url = "https://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
soup = BeautifulSoup(demo, "html.parser")
for link in soup.find_all('a'):
print(link.get('href'))
# http://www.icourse163.org/course/BIT-268001
# http://www.icourse163.org/course/BIT-1001870001

基于bs4库的HTML内容查找方法

Matlab 图像处理
imread,imshow,imtool,imfill,形态学上腐蚀和膨胀imerode,imdilate,bwlabel------数硬币
rgb2grey();
[L, num]  = bwlabel(image);
SE  = strel ('disk',5);%控制半径
image = imerode(image ,SE)


encode
        image1+image2

decode

  datetime模块

import datetime as d
d.date() 处理日期(年月日)
d.time() 处理事件(时分秒,毫秒)
d.datetime() 处理日期+时间
d.timedelta() 处理时段(时间间隔)
d.date.today()  当前时间
d.tatetime.now()
修改日期格式:
d.date.today().strftime('%Y-%m-%d %H:%M:%S')
d.date.today().__format__('格式')
d.datetime.isoformat()
日期转换成时间戳
timetuple 时间转换成struct_time格式
d.date.today.timetuple() 
time.mktime 返回用秒数来表示时间的浮点数
d.date.fromtimestamp() 将时间戳转换成日期    
timedelta() 方法
eg:今天是今年的第几天:
import datetime
today = datetime.date.today().strftime('%Y%m%d')
#today = today.__format__('%Y%m%d')# __format__ 和strftime()一样
dt = datetime.datetime.strptime(today,"%Y%m%d")
start = today[:4])+'0101'
start = datetime.datetime.strptime(start,"%Y%m%d")
print(int((dt-start).days)+1)


对象持久化

标准库模块
pickle 任意python对象格式化后和解格式化
dbm 实现一个可通过键访问的文件系统,以储存字节串
shelve 按照键把pickle 处理后的对象存储到一个文件中
d = shelve.open()
d[key] =data    value = d[key] del d[key]
d.close()

文本文件基本读写

文件打开
f = open(filename[,mode[,buffering]])
mode第一个字母,表示
f:open()返回的文件对象
mode:可选参数,打开模式和文件类型
buffering:可选参数,打开模式和文件类型
'r'-read,'w'-write,'x'-文件不存在情况下创建并写文件
'a'-append,'+'-读写模式
mode第二个字母是文件类型
't'-txt 'b'-二进制文件


面向对象(object oriented design)(OOP)

类(class)定义的特殊方法 eg.座位(seat)
对象(object) eg.1A号
#class member,instance variable, method(function)

class BankAccount:

#Constructor
def __init__(self,accountNumber,accountName):

    self.accountNumber = accountNumber
    self.accountName   = accountName
    self.balance       = balance

def deposit(self,amount):
    self.balance = self.balance + amount

def withdraw(self):
    self.balance = self.balance - amount


def __str__(self)
    return "({},{})".format(self.accountName,self.balance)
    return "("+ self.accountName + ", " + str(self.balance) + ")"

def __lt__(self,other)
    return self.balance < other.balance
def __gt__(self,other)
    return self.balance > other.balance

new
from ... import BankAccount

b1.withdraw(100.0)
b2.deposit(50.0)

b1 = BankAcount("56789","Tony",500.0)
b2 = BankAcount("12345","Jerry",100.0)


print( b1 )
print( b1 )






算术运算
__add__(self,other),__sub__,__mul__,__div__
反运算
当左操作数不支持相应的操作时被调用
__radd__(self,other),__rsub__,__rmul__,__rdiv__

自定义对象的排序

列表方法sort()

  

  理论力学

静力学部分:

一、静力学公式和物体受力分析

五个公式及两个推理:
1.力的平行四边形规则  F1+F2=F
2.二力平衡充要条件   F1=-F2
3.加减平衡力系原理   任意加减力系不改变对刚体作用  
    推论1:力的可传导性
    推论2:三力平衡汇交定理: 若两个里作用线汇于一点,三力一定在同一平面,且第三个力作用线通过汇交点。
4.作用力与反作用力
5.刚化原理    平衡下变形体刚化,平衡状态不变

约束:对非自由体某些位移起限制作用的周围物体
约束反力:约束对物体的作用,方向与约束能够阻碍的位移方向相反

常见的几种约束:光滑面,绳、链胶带,光滑铰链

受力分析和受力图(二力杆)

二、平面力系

平面汇交力系:
平面汇交力系可以简化为合力,大小方向为各合力的和F1+F2+...+Fn=Fi
其平衡必要充分条件:Fi=0;几何条件:力系的力多边形自行封闭;解析条件:各力在三个相互平行的坐标轴投影的代数和分别等于零

力矩,力偶,力偶矩,合成与平衡
力矩:M=FL,逆时针为正
合力矩:平面汇交力系的合力对于平面内任一点之力矩等于所有各分力对于该点之矩的代数和。
力偶:等值反向不共线的平行力组成的力系,力偶没有合力,也不能用一个力来平衡。

力的平移定理,合力矩定理
平移:刚体上A点平移倒B点,必须同时附加个力偶,力偶矩等于原来的力F对B点的矩
合力矩定理:平面任意力系的合理对作用面内任一点的矩等于力系中各力对同一点的矩的代数和。

平面任意力系的平衡条件和平衡方程
FR=0,Mo=0

物体系的平衡
主矢和主矩等于零:Xi=0,Yi=0,Mo=0

平面桁架内力的计算:节点法,截面法
桁架是一种杆件彼此在两端用铰链连接而成的结构,它在受力后几何形状不变。
节点法:逐个考虑桁架中所有节点的平衡,应用平面汇交力系的平衡方程求出各个杆件的内力。
截面法:截断待求内力的杆件,将桁架切割为两部分,取其中一部分为研究对象,应用平面任意力系的平衡方程求出被切割杆件的内力。

三、空间力系

空间汇交力系

力对点的矩,力对轴的矩

空间力偶

空间任意力系(主矢,主矩),平衡方程

  材料力学

变形固体基本假设:连续性假设;各向同性假设;小变形假设
拉压杆的斜截面上既有正应力也有切应力,当45度时候切应力最大    τmax=σ/2
应力集中:由于截面急剧变化引起的应力局部增大现象,称为应力集中

  弹性力学

理想弹性体:连续性,完全弹性,均匀性,各向异性四个假定
弹性力学三大规律:变形连续规律、应力-应变关系和运动(或平衡)规律
应力:单位ML-1T-2,方向延坐标轴正面上正向为正,负面负向为负

圣维南原理:如果把物体的一小部分边界上的面力,变换为分布不同但静力等效的面力(主矢量相同,对同一点的主矩也相同),那么,近处的应力分量将有显著的改变,但远处所受的影响可以不计。
圣维南原理表明:在小边界上进行面力的静力等效变换后,只影响近处(局部区域)的应力,对绝大部分弹性体区域的应力没有明显影响。

  最基本要求:

  1.控制在单面,一页, 可以通过字号(10,10.5),行距行间距,段间距,页边距

  2.absolutely, no typo… find a native speaker

  3.排版整洁,重点突出,(google resume templates) (专业词汇:专业+resume samples)

  4.联系方式(tel+mail)

  简历找谁改:

  1.看整体:任何人 找人改:10秒钟,抓住两个信息,求职职位!!!特色是什么!!!recruiter 只会抓两个信息:技能突不突出,职位匹配不匹配!!! straightforward

  2.逐字逐句:从业人士

  3.学校资源:Career Center

  4.免费的咨询资源

  要改多少遍:

  1.一直改一直更新

  检验简历合格唯一标准:拿到意向公司offer,稳定拿到越来越多公司offer

  2.不要等,尽早投,直到得到recruiter

  各板块具体建议:

  1.姓名(电话邮箱), 公司会根据名字,邮箱电话筛选人,surname and lastname 可以换

  2.linkedIn/ Github链接(如果加分)

  3.skills 职业从最熟到最不熟,最重要到最不重要

  4.学历 突出跟申请职位相关的实习/课程

  5.工作经历 实习/coop > Teaching/Research Assistant > Academic Projects

  6.学术项目 一定要是一个Final project, individual contributer/ team player

  7. Objective summary,一道两句话,一行,不超过两行

  板块顺序:

  1.想让别人最先看到什么(名校,大公司实习,技能)eg.编程语言

  2.应届生学历放上半页(先放最近的学历,除非跳槽)

  3.工作经历放学校项目前面

  4.学术经历,牛逼放前面

  语言技巧:

  1.尽量用数字量化成就(估)

  2.Easy-to-read:精简语言

  3.不同职位准备不同简历,准备多分简历

  4.Be confident in what you did

  small tips: 有専門resume paper,网购

  哪里找投简历:

  1.直接找Recruiter投

  2.找内推referral

  3.学校内部招聘网University job Board

  4.handshake.com,学校会与joinhandshake.com合作,其他网站Indeed,Mosnter, LinkedIn,海投

 课题研究成果内容简介,在填写的表格中,是有相关内容与要求提示的,给予课题负责人提供了方向和思路。主要包括以下两点:

  1、简介内容包括:该课题研究的目的和意义(略写);研究成果的主要内容和重要观点或对策建议(详写);成果的学术价值、应用价值,以及社会影响(略写)。

  2、简介内容应由课题负责人撰写:文章内容要层次清楚、观点明晰、用语准确、文风朴实,要有实质性内容,并具有整体性和系统性,不得简单排列篇章目录。

  课题研究成果内容简介,撰写起来是很让人头疼的,撰写的思路可以采用以下方法:

  1、先写针对的问题,几句话搞定。比如针对的情况产生的问题。课题研究成果有哪几类

  2、再写提出的方法,也就是方法简介。比如提出了*方法,解决方案,**框架。

  3、然后写达到了的效果,也就是所上面提出的方法达到的效果。比如性能提高了倍,开销降低了

  4、最后写写这个研究点的学术成果,比如在会议期刊发表了论文,申请了**专利等。另外,如果有产业化的成果当然也要写在最后了。

  money walks

  why we sleep

  Rental property investing

  Tony robbins money master the game

  Crushing it

  what every body is saying

  the power of habit

  you are a badass

  FBI 教你读心术

  peter Mayle

  Rich dad and poor dad

  Atomic Habits

  Super freakonomics

  social security dummies

  The 4-hours workweek

  The LLC and Corporation start-Up guide

  money management skills

  杰克伦敦《马丁伊登》《一块牛排》

  東京

  台北:

富霸王猪脚 地址:南京东路二段115巷20号
穆记牛肉面 地址:台湾台北市信义区吴兴街239号 牛肉饼
ZAKUZAKU棒棒泡芙 地址:台北信义新天地 A11馆一楼 卡士达酱
RAPL澎派令果 地址:台北市松高路12号 新光三越信义A8 1F
路地 氷の怪物 地址:大安區市民大道四段10號
吴宝春麦方店 地址:台北市信义区菸厂路88号B2 酒酿桂圆和荔枝玫瑰

  成都:

洞子口陈凉粉  洞子口福德路42号,经典川菜基本上都可以,凉拌鸡,锅巴肉片,肝腰合炒

荣园餐厅  武侯区蜀汉路10号附2号,瓦罐汤,炒藤藤菜

上池面馆  人民公园上池正街,回锅肉面

  台北:

桃园街15号牛肉面

  新疆

托克逊,奇台;阿图什
巴楚县,木沙江烤肉  过油肉拌面,烤肉串,烤肝子,馕坑肉48
喀什,手抓饭 花苑小区,麦麦提沙吾提师傅的儿子抓饭店,手抓饭可以加

  内蒙,呼伦贝尔市,海拉尔区

  江苏,扬州

高邮,阳春面 江苏省高邮市府前街陈小五小吃部

  北京

双发盛酒家,首经贸站东北口 炸酱面,焦溜丸子,火爆腰花
方砖厂,炸酱面

  长沙

清泉阁包子铺,中山路319号 烧麦,包子
老头子糖油粑粑

  在求解最优化问题中,拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush Kuhn Tucker)条件是两种最常用的方法。在有等式约束时使用拉格朗日乘子法,在有不等约束时使用KKT条件。

  我们这里提到的最优化问题通常是指对于给定的某一函数,求其在指定作用域上的全局最小值(因为最小值与最大值可以很容易转化,即最大值问题可以转化成最小值问题)。提到KKT条件一般会附带的提一下拉格朗日乘子。对学过高等数学的人来说比较拉格朗日乘子应该会有些印象。二者均是求解最优化问题的方法,不同之处在于应用的情形不同。

  一般情况下,最优化问题会碰到一下三种情况:

  1. 无约束条件

  这是最简单的情况,解决方法通常是函数对变量求导,令求导函数等于0的点可能是极值点。将结果带回原函数进行验证即可。

  1. 等式约束条件

  设目标函数为f(x),约束条件为h_k(x),形如:

  s.t. 表示subject to ,“受限于”的意思,l表示有l个约束条件。

  则解决方法是消元法或者拉格朗日法。消元法比较简单不在赘述,这里主要讲拉格朗日法,因为后面提到的KKT条件是对拉格朗日乘子法的一种泛化。

  例如给定椭球:

  求这个椭球的内接长方体的最大体积。这个问题实际上就是条件极值问题,即在条件下,求的最大值。

  当然这个问题实际可以先根据条件消去 z (消元法),然后带入转化为无条件极值问题来处理。但是有时候这样做很困难,甚至是做不到的,这时候就需要用拉格朗日乘数法了。

  首先定义拉格朗日函数F(x):

( 其中λk是各个约束条件的待定系数。)

  然后解变量的偏导方程:

  如果有l个约束条件,就应该有l+1个方程。求出的方程组的解就可能是最优化值(高等数学中提到的极值),将结果带回原方程验证就可得到解。

  回到上面的题目,通过拉格朗日乘数法将问题转化为

  対求偏导得到

  联立前面三个方程得到,带入第四个方程解之

  带入解得最大体积为:

至于为什么这么做可以求解最优化?维基百科上给出了一个比较好的直观解释。

  举个二维最优化的例子:

    min f(x,y)

      s.t. g(x,y) = c

  这里画出z=f(x,y)的等高线(函数登高线定义见百度百科):

  绿线标出的是约束g(x,y)=c的点的轨迹。蓝线是f(x,y)的等高线。箭头表示斜率,和等高线的法线平行。从梯度的方向上来看,显然有d1>d2。绿色的线是约束,也就是说,只要正好落在这条绿线上的点才可能是满足要求的点。如果没有这条约束,f(x,y)的最小值应该会落在最小那圈等高线内部的某一点上。而现在加上了约束,最小值点应该在哪里呢?显然应该是在f(x,y)的等高线正好和约束线相切的位置,因为如果只是相交意味着肯定还存在其它的等高线在该条等高线的内部或者外部,使得新的等高线与目标函数的交点的值更大或者更小,只有到等高线与目标函数的曲线相切的时候,可能取得最优值。

  如果我们对约束也求梯度∇g(x,y),则其梯度如图中绿色箭头所示。很容易看出来,要想让目标函数f(x,y)的等高线和约束相切,则他们切点的梯度一定在一条直线上(f和g的斜率平行)。

  也即在最优化解的时候:∇f(x,y)=λ(∇g(x,y)-C) (其中∇为梯度算子; 即:f(x)的梯度 = λ* g(x)的梯度,λ是常数,可以是任何非0实数,表示左右两边同向。)

  即:▽[f(x,y)+λ(g(x,y)−c)]=0λ≠0

  那么拉格朗日函数: F(x,y)=f(x,y)+λ(g(x,y)−c) 在达到极值时与f(x,y)相等,因为F(x,y)达到极值时g(x,y)−c总等于零。

  min( F(x,λ) )取得极小值时其导数为0,即▽f(x)+▽∑ni=λihi(x)=0,也就是说f(x)和h(x)的梯度共线。

  简单的说,在F(x,λ)取得最优化解的时候,即F(x,λ)取极值(导数为0,▽[f(x,y)+λ(g(x,y)−c)]=0)的时候,f(x)与g(x) 梯度共线,此时就是在条件约束g(x)下,f(x)的最优化解。

  1. 不等式约束条件

  设目标函数f(x),不等式约束为g(x),有的教程还会添加上等式约束条件h(x)。此时的约束优化问题描述如下:

  则我们定义不等式约束下的拉格朗日函数L,则L表达式为:

  其中f(x)是原目标函数,hj(x)是第j个等式约束条件,λj是对应的约束系数,gk是不等式约束,uk是对应的约束系数。

  常用的方法是KKT条件,同样地,把所有的不等式约束、等式约束和目标函数全部写为一个式子L(a, b, x)= f(x) + ag(x)+bh(x),

  KKT条件是说最优值必须满足以下条件:

    1)L(a, b, x)对x求导为零;

    2)h(x) =0;

    3)a*g(x) = 0;

  求取这些等式之后就能得到候选最优值。其中第三个式子非常有趣,因为g(x)<=0,如果要满足这个等式,必须a=0或者g(x)=0. 这是SVM的很多重要性质的来源,如支持向量的概念。

  接下来主要介绍KKT条件,推导及应用。详细推导过程如下:

参考文献:

【1】 拉格朗日乘数法

【2】 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

【3】 KKT条件介绍

【4】 拉格朗日乘子法(Lagrange Multiplier)和KKT(Karush Kuhn Tucker)条件