国庆快到了,我为期一个月的实习也即将结束,这两天打算回顾一下这一个月以来写过的代码并对于自己在这过程中学到的一些新姿势做一个简要的记录,内容可能写的比较稀碎,就当是备忘录了。
1. 解压zip(并删除原zip文件)
with zipfile.ZipFile(file_path, 'r') as f: f.extractall(curr_dir) os.remove(file_path)
2. 搭建FTP服务器
from pyftpdlib.servers import FTPServer from pyftpdlib.handlers import FTPHandler from pyftpdlib.authorizers import DummyAuthorizer auth = DummyAuthorizer() auth.add_user('username', 'password', 'D:/path', perm='elradfmw') handler = FTPHandler handler.authorizer = auth server = FTPServer(('10.12.34.56', 1234), handler) server.serve_forever()
3. 浮点数相加问题
有时候两个有限小数相加,后面会多出很多个9或0,例如:
6.3 + 0.43 = 6.7299999999999995, 0.1 + 0.2 = 0.30000000000000004
虽然没搞懂这个现象是怎么回事,但这种情况可以通过round来处理,例如四舍五入保留两位小数:
num = round(num, 2)
4. Pandas的Dataframe排序
指定一个列名,并根据这一列对数据排序:
df = df.sort_values('col_1')
5. Selenium获取元素内的文本
通常,获取文本可以通过.text来获取,例如:
a = driver.find_element(By.XPATH, '//xpath').text
不过,对于某些元素,这么获取得到的内容却是空的,这时候可以用.get_attribute()的方式来获取:
a = driver.find_element(By.XPATH, '//xpath').get_attribute('innerText')
6. Selenium模拟元素点击
对于button这样的元素,可以直接用click()来点击:
driver.find_element(By.XPATH, '//button[1]').click()
然而,有些元素虽然在网页中也可以点击,但是直接用click()的话会报错(例如span),这种情况下只能调用js脚本来完成:
# <li><span></span></li> driver.execute_script('document.evaluate(\'//li[0]\', document, null, XPathResult.ANY_TYPE, null).iterateNext().children[0].click();')
7. Pandas直接读取请求的表格内容
有时候需要对requests请求返回的表格内容先进行处理再保存到硬盘本地,一种方法是先下载到本地,再读取,再保存。还有一种方法是使用BytesIO。
from io import BytesIO r = requests.get(url) df = pd.read_csv(BytesIO(r.content))
8. Pandas获取两个Dataframe的差集
如df1 – df2:
dff = pd.concat([df1, df2, df2]).drop_duplicates(keep=False)
9. 结合selenium与requests
有的网站在登录的时候不会直接发送明文密码,而是对密码使用某种算法加密后再发送,对于这种情况,分析js代码比较麻烦,图省事可以直接用selenium登录。后续的请求操作使用requests效率更高,所以可以先通过selenium登录后获取cookies,再让requests使用该cookies进行后续操作。
headers = {} driver.get('xxx.com/login') driver.find_element(By.ID, 'username').send_keys('username') driver.find_element(By.ID, 'password').send_keys('password') driver.find_element(By.ID, 'btn').click() cookie = driver.get_cookie('sessionid') headers['Cookie'] = '='.join([cookie['name'], cookie['value']]) r = requests.get('xxx.com/xxx', headers=headers)
10. docx/wps文档的编辑
有时候需要批量修改文档,把对应的位置分别替换为不同文本,如果直接修改paragraph的text的话,会造成格式丢失,所以需要修改paragraph的run里面的text。
import docx document = docx.Document('xxx.docx') document.paragraphs[1].runs[2].text = document.paragraphs[1].runs[2].text.replace('a', 'b') document.save('yyy.docx')
11. Requests文件上传
from urllib3 import encode_multipart_formdata data = {'file': ('filename.txt', open('filename.txt', 'rb').read())} encoded = encode_multipart_formdata(data) data = encoded[0] headers['Content-Type'] = encoded[1] r = requests.post('xxx.com/xxx', data=data, headers=headers)
12. Selenium获取session storage
有些时候发起请求要使用token而不是cookie,这玩意儿可能会放在浏览器的session storage中,有时可能无法直接在窗口中获取到,需要切换到某个frame当中才能获取,可以通过js来获取:
driver.switch_to.frame('framename') token = driver.execute_script('return sessionStorage["Token"];')