最近碰过一个需求,要把 sqlserver
里面的几个字段拼接并做 md5
处理,在插入为一个 guid
字段。由于数据库安装的是中文,用数据库的 HASHBYTES
做 md5
碰到中文会和正常的不一致,因为它是用 gb2312
编码的,正常的应该是用 utf8
编码。后来的网上找到可以用 SQL CLR 用户定义的函数
来实现。
新建项目
添加新建项
实现函数
1 | using System; |
生成 dll
注册 dll
使用
1 | USE temp; |
备注:
最近碰过一个需求,要把 sqlserver
里面的几个字段拼接并做 md5
处理,在插入为一个 guid
字段。由于数据库安装的是中文,用数据库的 HASHBYTES
做 md5
碰到中文会和正常的不一致,因为它是用 gb2312
编码的,正常的应该是用 utf8
编码。后来的网上找到可以用 SQL CLR 用户定义的函数
来实现。
1 | using System; |
1 | USE temp; |
备注:
termux 是 android
下的 Linux
环境和命令行模拟器.
1 | apt update |
如果漏装依赖会报错
安装成功就可以正常使用了.
具体可以看 Running a notebook server
这样就可以在其他电脑连接手机里面的 jupyter
, 并设置了密码,地址就不用代 token
了.
在 jupyter
里面运行 linux
命令.
最近有个爬虫项目网站太多,绝大部分接口都是json,有些还有参数加密,
一个个分析接口就太麻烦,就想用浏览器全部渲染出来,就可以省掉这些步骤。
最近流行 headless
就用它了。puppeteer
是 nodejs
的,它的 python
绑定比较好的是 pyppeteer。
中文资料非常少,接口看文档,例子看 tests
下面的测试用例。
还可以看看 puppeteer
的教程。
1 | browser = await pyppeteer.launch({ |
devtools
控制界面的显示,用来调试。args
是浏览器启动的命令行参数,可以设置浏览器头部,
不然会标示为无头浏览器。--no-sandbox
在 docker
里使用时需要加入的参数,不然会报错。
为了加快渲染速度,可以禁止加载图片之类的。1
2
3
4
5
6
7
8
9async def request_check(req):
'''请求过滤'''
if req.resourceType in ['image', 'media', 'eventsource', 'websocket']:
await req.abort()
else:
await req.continue_()
await page.setRequestInterception(True)
page.on('request', request_check)
请求加载是否完成,无网都需要处理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15async def goto(page, url):
while True:
try:
await page.goto(url, {
'timeout': 0,
'waitUntil': 'networkidle0'
})
break
except (pyppeteer.errors.NetworkError,
pyppeteer.errors.PageError) as ex:
# 无网络 'net::ERR_INTERNET_DISCONNECTED','net::ERR_TUNNEL_CONNECTION_FAILED'
if 'net::' in str(ex):
await asyncio.sleep(10)
else:
raise
比如一些js库,我使用 Ajax-hook 来统计 ajax 的请求完成情况,
需要在网页头部注入js文件,一些自己的库,比较大,也这样注入。1
2
3
4
5
6from pathlib import Path
CURDIR = Path(__file__).parent
JS_AJAX_HOOK_LIB = str(CURDIR / 'static' / 'ajaxhook.min.js')
await page.addScriptTag(path=JS_AJAX_HOOK_LIB)
这样注入的js文件不能有中文,因为 pyppeteer
里面打开文件用的是默认编码,可以 hook 住open
函数来解决。1
2# 因为 pyppeteer 库里面 addScriptTag 用的是系统默认编码,导致js文件里面不能有中文
pyppeteer.frame_manager.open = lambda file: open(file, encoding='utf8')
在 window10 里开发很流程,部署到 windows server 上,可能由于配置比较差或其他原因,网站渲染很慢。
可以放在容器里,效果明显。注意点是上面提到了的关闭沙盒模式,需要下一些浏览器的依赖,还有就是最好先把浏览器下好,做到镜像里,这样
就不会在容器里一个一个下了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15FROM python:slim
WORKDIR /usr/src/app
RUN apt-get update && apt-get install -y gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
RUN apt-get install -y vim
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
RUN python -c "import pyppeteer;pyppeteer.chromium_downloader.download_chromium();"
COPY . .
VOLUME /data
SOCKSrequests
从 2.10.0
版本支持 socks
协议.
安装:
1 | pip install requests[socks] |
使用:
1 | proxies = { |
首先是要安装额外库
1 | pip install requests[socks] |
这种安装方法来自 setuptools 的 extras_require
. 可以在 requests
的 setup.py
里面看到.
1 | extras_require={ |
可以看到会安装 PySocks 库.
PySocks
的引入方式是 import socks
. 在 requests
里面只在 requests/adapters.py
看到
1 | from urllib3.contrib.socks import SOCKSProxyManager |
使用的是 urllib3 库.
1 | class SOCKSProxyManager(PoolManager): |
可以看到 requests
和 urllib3
设置的默认连接池大小都是 10.
装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).
缺点:
__name__
和 __doc__
属性1 | import time |
输出
1 | **************************************** Calling snooze(.123 |
functools.wraps
是标准库里的装饰器,它的作用是协助构建行为良好的装饰器,解决了手写装饰器的缺点.
1 | from functools import wraps |
只要在参数里面加上 self
, 就可以使用类里面的方法了.
1 | from functools import wraps |