re-common 10.0.39__py3-none-any.whl → 10.0.40__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- re_common/baselibrary/__init__.py +4 -4
- re_common/baselibrary/baseabs/__init__.py +6 -6
- re_common/baselibrary/baseabs/baseabs.py +26 -26
- re_common/baselibrary/database/mbuilder.py +132 -132
- re_common/baselibrary/database/moudle.py +93 -93
- re_common/baselibrary/database/msqlite3.py +194 -194
- re_common/baselibrary/database/mysql.py +169 -169
- re_common/baselibrary/database/sql_factory.py +26 -26
- re_common/baselibrary/mthread/MThreadingRun.py +486 -486
- re_common/baselibrary/mthread/MThreadingRunEvent.py +349 -349
- re_common/baselibrary/mthread/__init__.py +2 -2
- re_common/baselibrary/mthread/mythreading.py +695 -695
- re_common/baselibrary/pakge_other/socks.py +404 -404
- re_common/baselibrary/readconfig/config_factory.py +18 -18
- re_common/baselibrary/readconfig/ini_config.py +317 -317
- re_common/baselibrary/readconfig/toml_config.py +49 -49
- re_common/baselibrary/temporary/envdata.py +36 -36
- re_common/baselibrary/tools/all_requests/aiohttp_request.py +118 -118
- re_common/baselibrary/tools/all_requests/httpx_requet.py +102 -102
- re_common/baselibrary/tools/all_requests/mrequest.py +412 -412
- re_common/baselibrary/tools/all_requests/requests_request.py +81 -81
- re_common/baselibrary/tools/batch_compre/bijiao_batch.py +31 -31
- re_common/baselibrary/tools/contrast_db3.py +123 -123
- re_common/baselibrary/tools/copy_file.py +39 -39
- re_common/baselibrary/tools/db3_2_sizedb3.py +102 -102
- re_common/baselibrary/tools/foreachgz.py +39 -39
- re_common/baselibrary/tools/get_attr.py +10 -10
- re_common/baselibrary/tools/image_to_pdf.py +61 -61
- re_common/baselibrary/tools/java_code_deal.py +139 -139
- re_common/baselibrary/tools/javacode.py +79 -79
- re_common/baselibrary/tools/mdb_db3.py +48 -48
- re_common/baselibrary/tools/merge_file.py +171 -171
- re_common/baselibrary/tools/merge_gz_file.py +165 -165
- re_common/baselibrary/tools/mhdfstools/down_hdfs_files.py +42 -42
- re_common/baselibrary/tools/mhdfstools/hdfst.py +42 -42
- re_common/baselibrary/tools/mhdfstools/up_hdfs_files.py +38 -38
- re_common/baselibrary/tools/mongo_tools.py +50 -50
- re_common/baselibrary/tools/move_file.py +170 -170
- re_common/baselibrary/tools/move_mongo/mongo_table_to_file.py +63 -63
- re_common/baselibrary/tools/move_mongo/move_mongo_table.py +354 -354
- re_common/baselibrary/tools/move_mongo/use_mttf.py +18 -18
- re_common/baselibrary/tools/move_mongo/use_mv.py +93 -93
- re_common/baselibrary/tools/mpandas/mpandasreadexcel.py +125 -125
- re_common/baselibrary/tools/mpandas/pandas_visualization.py +7 -7
- re_common/baselibrary/tools/myparsel.py +104 -104
- re_common/baselibrary/tools/rename_dir_file.py +37 -37
- re_common/baselibrary/tools/sequoiadb_utils.py +398 -398
- re_common/baselibrary/tools/split_line_to_many.py +25 -25
- re_common/baselibrary/tools/stringtodicts.py +33 -33
- re_common/baselibrary/tools/workwechant_bot.py +84 -84
- re_common/baselibrary/utils/baseaiohttp.py +296 -296
- re_common/baselibrary/utils/baseaiomysql.py +87 -87
- re_common/baselibrary/utils/baseallstep.py +191 -191
- re_common/baselibrary/utils/baseavro.py +19 -19
- re_common/baselibrary/utils/baseboto3.py +291 -291
- re_common/baselibrary/utils/basecsv.py +32 -32
- re_common/baselibrary/utils/basedict.py +133 -133
- re_common/baselibrary/utils/basedir.py +241 -241
- re_common/baselibrary/utils/baseencode.py +351 -351
- re_common/baselibrary/utils/baseencoding.py +28 -28
- re_common/baselibrary/utils/baseesdsl.py +86 -86
- re_common/baselibrary/utils/baseexcel.py +264 -264
- re_common/baselibrary/utils/baseexcept.py +109 -109
- re_common/baselibrary/utils/basefile.py +654 -654
- re_common/baselibrary/utils/baseftp.py +214 -214
- re_common/baselibrary/utils/basegzip.py +60 -60
- re_common/baselibrary/utils/basehdfs.py +135 -135
- re_common/baselibrary/utils/basehttpx.py +268 -268
- re_common/baselibrary/utils/baseip.py +87 -87
- re_common/baselibrary/utils/basejson.py +2 -2
- re_common/baselibrary/utils/baselist.py +32 -32
- re_common/baselibrary/utils/basemotor.py +190 -190
- re_common/baselibrary/utils/basemssql.py +98 -98
- re_common/baselibrary/utils/baseodbc.py +113 -113
- re_common/baselibrary/utils/basepandas.py +302 -302
- re_common/baselibrary/utils/basepeewee.py +11 -11
- re_common/baselibrary/utils/basepika.py +180 -180
- re_common/baselibrary/utils/basepydash.py +143 -143
- re_common/baselibrary/utils/basepymongo.py +230 -230
- re_common/baselibrary/utils/basequeue.py +22 -22
- re_common/baselibrary/utils/baserar.py +57 -57
- re_common/baselibrary/utils/baserequest.py +279 -279
- re_common/baselibrary/utils/baseset.py +8 -8
- re_common/baselibrary/utils/basesmb.py +403 -403
- re_common/baselibrary/utils/basestring.py +382 -382
- re_common/baselibrary/utils/basetime.py +320 -320
- re_common/baselibrary/utils/baseurl.py +121 -121
- re_common/baselibrary/utils/basezip.py +57 -57
- re_common/baselibrary/utils/core/__init__.py +7 -7
- re_common/baselibrary/utils/core/bottomutils.py +18 -18
- re_common/baselibrary/utils/core/mdeprecated.py +327 -327
- re_common/baselibrary/utils/core/mlamada.py +16 -16
- re_common/baselibrary/utils/core/msginfo.py +25 -25
- re_common/baselibrary/utils/core/requests_core.py +103 -103
- re_common/baselibrary/utils/fateadm.py +429 -429
- re_common/baselibrary/utils/importfun.py +123 -123
- re_common/baselibrary/utils/mfaker.py +57 -57
- re_common/baselibrary/utils/my_abc/__init__.py +3 -3
- re_common/baselibrary/utils/my_abc/better_abc.py +32 -32
- re_common/baselibrary/utils/mylogger.py +414 -414
- re_common/baselibrary/utils/myredisclient.py +861 -861
- re_common/baselibrary/utils/pipupgrade.py +21 -21
- re_common/baselibrary/utils/ringlist.py +85 -85
- re_common/baselibrary/utils/version_compare.py +36 -36
- re_common/baselibrary/utils/ydmhttp.py +126 -126
- re_common/facade/lazy_import.py +11 -11
- re_common/facade/loggerfacade.py +25 -25
- re_common/facade/mysqlfacade.py +467 -467
- re_common/facade/now.py +31 -31
- re_common/facade/sqlite3facade.py +257 -257
- re_common/facade/use/mq_use_facade.py +83 -83
- re_common/facade/use/proxy_use_facade.py +19 -19
- re_common/libtest/base_dict_test.py +19 -19
- re_common/libtest/baseavro_test.py +13 -13
- re_common/libtest/basefile_test.py +14 -14
- re_common/libtest/basemssql_test.py +77 -77
- re_common/libtest/baseodbc_test.py +7 -7
- re_common/libtest/basepandas_test.py +38 -38
- re_common/libtest/get_attr_test/get_attr_test_settings.py +14 -14
- re_common/libtest/get_attr_test/settings.py +54 -54
- re_common/libtest/idencode_test.py +53 -53
- re_common/libtest/iniconfig_test.py +35 -35
- re_common/libtest/ip_test.py +34 -34
- re_common/libtest/merge_file_test.py +20 -20
- re_common/libtest/mfaker_test.py +8 -8
- re_common/libtest/mm3_test.py +31 -31
- re_common/libtest/mylogger_test.py +88 -88
- re_common/libtest/myparsel_test.py +27 -27
- re_common/libtest/mysql_test.py +151 -151
- re_common/libtest/pymongo_test.py +21 -21
- re_common/libtest/split_test.py +11 -11
- re_common/libtest/sqlite3_merge_test.py +5 -5
- re_common/libtest/sqlite3_test.py +34 -34
- re_common/libtest/tomlconfig_test.py +30 -30
- re_common/libtest/use_tools_test/__init__.py +2 -2
- re_common/libtest/user/__init__.py +4 -4
- re_common/studio/__init__.py +4 -4
- re_common/studio/assignment_expressions.py +36 -36
- re_common/studio/mydash/test1.py +18 -18
- re_common/studio/pydashstudio/first.py +9 -9
- re_common/studio/streamlitstudio/first_app.py +65 -65
- re_common/studio/streamlitstudio/uber_pickups.py +23 -23
- re_common/studio/test.py +18 -18
- re_common/v2/baselibrary/business_utils/BusinessStringUtil.py +219 -219
- re_common/v2/baselibrary/business_utils/baseencodeid.py +100 -100
- re_common/v2/baselibrary/business_utils/full_doi_path.py +116 -116
- re_common/v2/baselibrary/business_utils/rel_tools.py +6 -6
- re_common/v2/baselibrary/decorators/utils.py +59 -59
- re_common/v2/baselibrary/helpers/search_packge/NearestNeighbors_test.py +105 -105
- re_common/v2/baselibrary/helpers/search_packge/fit_text_match.py +253 -253
- re_common/v2/baselibrary/helpers/search_packge/scikit_learn_text_matcher.py +260 -260
- re_common/v2/baselibrary/helpers/search_packge/test.py +1 -1
- re_common/v2/baselibrary/s3object/baseboto3.py +230 -230
- re_common/v2/baselibrary/tools/WeChatRobot.py +95 -95
- re_common/v2/baselibrary/tools/ac_ahocorasick.py +75 -75
- re_common/v2/baselibrary/tools/concurrency.py +35 -35
- re_common/v2/baselibrary/tools/data_processer/base.py +53 -53
- re_common/v2/baselibrary/tools/data_processer/data_processer.py +508 -508
- re_common/v2/baselibrary/tools/data_processer/data_reader.py +187 -187
- re_common/v2/baselibrary/tools/data_processer/data_writer.py +38 -38
- re_common/v2/baselibrary/tools/dict_tools.py +44 -44
- re_common/v2/baselibrary/tools/dolphinscheduler.py +187 -187
- re_common/v2/baselibrary/tools/hdfs_base_processor.py +204 -204
- re_common/v2/baselibrary/tools/hdfs_bulk_processor.py +67 -67
- re_common/v2/baselibrary/tools/hdfs_data_processer.py +338 -338
- re_common/v2/baselibrary/tools/hdfs_line_processor.py +74 -74
- re_common/v2/baselibrary/tools/list_tools.py +69 -69
- re_common/v2/baselibrary/tools/resume_tracker.py +94 -94
- re_common/v2/baselibrary/tools/search_hash_tools.py +54 -54
- re_common/v2/baselibrary/tools/text_matcher.py +326 -326
- re_common/v2/baselibrary/tools/unionfind_tools.py +60 -60
- re_common/v2/baselibrary/utils/BusinessStringUtil.py +196 -196
- re_common/v2/baselibrary/utils/api_net_utils.py +270 -270
- re_common/v2/baselibrary/utils/author_smi.py +361 -361
- re_common/v2/baselibrary/utils/base_string_similarity.py +158 -158
- re_common/v2/baselibrary/utils/basedict.py +37 -37
- re_common/v2/baselibrary/utils/basehdfs.py +163 -163
- re_common/v2/baselibrary/utils/basepika.py +180 -180
- re_common/v2/baselibrary/utils/basetime.py +77 -77
- re_common/v2/baselibrary/utils/db.py +156 -156
- re_common/v2/baselibrary/utils/elasticsearch.py +46 -0
- re_common/v2/baselibrary/utils/json_cls.py +16 -16
- re_common/v2/baselibrary/utils/mq.py +83 -83
- re_common/v2/baselibrary/utils/n_ary_expression_tree.py +243 -243
- re_common/v2/baselibrary/utils/string_bool.py +186 -186
- re_common/v2/baselibrary/utils/string_clear.py +246 -246
- re_common/v2/baselibrary/utils/string_smi.py +18 -18
- re_common/v2/baselibrary/utils/stringutils.py +271 -271
- re_common/vip/base_step_process.py +11 -11
- re_common/vip/baseencodeid.py +90 -90
- re_common/vip/changetaskname.py +28 -28
- re_common/vip/core_var.py +24 -24
- re_common/vip/mmh3Hash.py +89 -89
- re_common/vip/proxy/allproxys.py +127 -127
- re_common/vip/proxy/allproxys_thread.py +159 -159
- re_common/vip/proxy/cnki_proxy.py +153 -153
- re_common/vip/proxy/kuaidaili.py +87 -87
- re_common/vip/proxy/proxy_all.py +113 -113
- re_common/vip/proxy/update_kuaidaili_0.py +42 -42
- re_common/vip/proxy/wanfang_proxy.py +152 -152
- re_common/vip/proxy/wp_proxy_all.py +181 -181
- re_common/vip/read_rawid_to_txt.py +91 -91
- re_common/vip/title/__init__.py +5 -5
- re_common/vip/title/transform/TransformBookTitleToZt.py +125 -125
- re_common/vip/title/transform/TransformConferenceTitleToZt.py +139 -139
- re_common/vip/title/transform/TransformCstadTitleToZt.py +195 -195
- re_common/vip/title/transform/TransformJournalTitleToZt.py +203 -203
- re_common/vip/title/transform/TransformPatentTitleToZt.py +132 -132
- re_common/vip/title/transform/TransformRegulationTitleToZt.py +114 -114
- re_common/vip/title/transform/TransformStandardTitleToZt.py +135 -135
- re_common/vip/title/transform/TransformThesisTitleToZt.py +135 -135
- re_common/vip/title/transform/__init__.py +10 -10
- {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/LICENSE +201 -201
- {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/METADATA +24 -16
- re_common-10.0.40.dist-info/RECORD +249 -0
- {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/WHEEL +1 -1
- re_common-10.0.39.dist-info/RECORD +0 -248
- {re_common-10.0.39.dist-info → re_common-10.0.40.dist-info}/top_level.txt +0 -0
|
@@ -1,268 +1,268 @@
|
|
|
1
|
-
"""
|
|
2
|
-
basehttpx
|
|
3
|
-
"""
|
|
4
|
-
import traceback
|
|
5
|
-
|
|
6
|
-
import httpx
|
|
7
|
-
import urllib3
|
|
8
|
-
from httpx import Timeout
|
|
9
|
-
from httpx._config import UNSET
|
|
10
|
-
|
|
11
|
-
from re_common.baselibrary.utils.core.mlamada import closeResult
|
|
12
|
-
from re_common.baselibrary.utils.core.requests_core import USER_AGENT, set_proxy_httpx
|
|
13
|
-
|
|
14
|
-
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class BaseHttpx(object):
|
|
18
|
-
def __init__(self, logger=None):
|
|
19
|
-
if logger == None:
|
|
20
|
-
from re_common.baselibrary import MLogger
|
|
21
|
-
logger = MLogger().streamlogger
|
|
22
|
-
self.logger = logger
|
|
23
|
-
self.proxies = None
|
|
24
|
-
self.headers = {}
|
|
25
|
-
self.sn = None
|
|
26
|
-
self.as_sn = None
|
|
27
|
-
|
|
28
|
-
def httpx_get(self, url,
|
|
29
|
-
*,
|
|
30
|
-
params=None,
|
|
31
|
-
headers=None,
|
|
32
|
-
cookies=None,
|
|
33
|
-
auth=None,
|
|
34
|
-
allow_redirects=True,
|
|
35
|
-
cert=None,
|
|
36
|
-
verify=True,
|
|
37
|
-
timeout=Timeout(timeout=5.0),
|
|
38
|
-
trust_env=True):
|
|
39
|
-
"""
|
|
40
|
-
基础httpx使用教程
|
|
41
|
-
params = {'key1': 'value1', 'key2': 'value2'}
|
|
42
|
-
r = httpx.get('https://httpbin.org/get', params=params)
|
|
43
|
-
r.url
|
|
44
|
-
params = {'key1': 'value1', 'key2': ['value2', 'value3']}
|
|
45
|
-
r.status_code
|
|
46
|
-
r.headers['content-type']
|
|
47
|
-
r.encoding
|
|
48
|
-
r.encoding = 'ISO-8859-1'
|
|
49
|
-
r.content
|
|
50
|
-
r.text
|
|
51
|
-
r.json()
|
|
52
|
-
/////////////////
|
|
53
|
-
from PIL import Image
|
|
54
|
-
from io import BytesIO
|
|
55
|
-
i = Image.open(BytesIO(r.content))
|
|
56
|
-
|
|
57
|
-
:param url:
|
|
58
|
-
:return: r
|
|
59
|
-
"""
|
|
60
|
-
return httpx.get(url, params=params, headers=headers, cookies=cookies,
|
|
61
|
-
auth=auth, follow_redirects=allow_redirects, cert=cert,
|
|
62
|
-
verify=verify, timeout=timeout, trust_env=trust_env)
|
|
63
|
-
|
|
64
|
-
def httpx_post(self, url, *,
|
|
65
|
-
data=None,
|
|
66
|
-
files=None,
|
|
67
|
-
json=None,
|
|
68
|
-
params=None,
|
|
69
|
-
headers=None,
|
|
70
|
-
cookies=None,
|
|
71
|
-
auth=None,
|
|
72
|
-
allow_redirects=True,
|
|
73
|
-
cert=None,
|
|
74
|
-
verify=True,
|
|
75
|
-
timeout=Timeout(timeout=5.0),
|
|
76
|
-
trust_env=True):
|
|
77
|
-
"""
|
|
78
|
-
基础的post请求
|
|
79
|
-
>>> r = httpx.put('https://httpbin.org/put', data={'key': 'value'})
|
|
80
|
-
>>> r = httpx.delete('https://httpbin.org/delete')
|
|
81
|
-
>>> r = httpx.head('https://httpbin.org/get')
|
|
82
|
-
>>> r = httpx.options('https://httpbin.org/get')
|
|
83
|
-
data={'key': 'value'}
|
|
84
|
-
:param url:
|
|
85
|
-
:param data:
|
|
86
|
-
:return:
|
|
87
|
-
"""
|
|
88
|
-
r = httpx.post(url, data=data, json=json, files=files,
|
|
89
|
-
params=params, headers=headers, cookies=cookies,
|
|
90
|
-
auth=auth, follow_redirects=allow_redirects, cert=cert,
|
|
91
|
-
verify=verify, timeout=timeout, trust_env=trust_env)
|
|
92
|
-
return r
|
|
93
|
-
|
|
94
|
-
def creat_sn(self, proxy=None, headers=None, verify=False, **kwargs):
|
|
95
|
-
"""
|
|
96
|
-
创建httpx会话对象
|
|
97
|
-
:param proxy:
|
|
98
|
-
:param headers:
|
|
99
|
-
:param verify:
|
|
100
|
-
:param kwargs:
|
|
101
|
-
:return:
|
|
102
|
-
"""
|
|
103
|
-
if proxy:
|
|
104
|
-
kwargs["proxies"] = set_proxy_httpx(proxy)
|
|
105
|
-
self.proxies = kwargs["proxies"]
|
|
106
|
-
if headers:
|
|
107
|
-
kwargs["headers"] = headers
|
|
108
|
-
if headers == "default":
|
|
109
|
-
kwargs["headers"]['User-Agent'] = USER_AGENT
|
|
110
|
-
kwargs["verify"] = verify
|
|
111
|
-
sn = httpx.Client(**kwargs)
|
|
112
|
-
self.sn = sn
|
|
113
|
-
return sn
|
|
114
|
-
|
|
115
|
-
def sn_close(self):
|
|
116
|
-
self.sn.close()
|
|
117
|
-
|
|
118
|
-
async def create_async_client(self, **kwargs):
|
|
119
|
-
"""
|
|
120
|
-
创建异步会话对象
|
|
121
|
-
:param kwargs:
|
|
122
|
-
:return:
|
|
123
|
-
"""
|
|
124
|
-
sn = httpx.AsyncClient(**kwargs)
|
|
125
|
-
self.as_sn = sn
|
|
126
|
-
return sn
|
|
127
|
-
|
|
128
|
-
async def as_sn_close(self):
|
|
129
|
-
"""
|
|
130
|
-
关闭异步sn
|
|
131
|
-
"""
|
|
132
|
-
await self.as_sn.close()
|
|
133
|
-
|
|
134
|
-
def base_sn_httpx(self, url, sn, endstring="", marks=[], **kwargs):
|
|
135
|
-
|
|
136
|
-
r = None
|
|
137
|
-
exMsg = None
|
|
138
|
-
try:
|
|
139
|
-
r = sn.get(url=url, **kwargs)
|
|
140
|
-
except:
|
|
141
|
-
exMsg = '* ' + traceback.format_exc()
|
|
142
|
-
self.logger.error(exMsg)
|
|
143
|
-
finally:
|
|
144
|
-
closeResult(r)
|
|
145
|
-
|
|
146
|
-
if exMsg:
|
|
147
|
-
self.logger.info("判断到except,请求出项错误{}".format(exMsg))
|
|
148
|
-
return False, "httpx", r
|
|
149
|
-
|
|
150
|
-
if r.status_code != 200:
|
|
151
|
-
self.logger.warning('r.status_code:' + str(r.status_code))
|
|
152
|
-
return False, "code", r
|
|
153
|
-
|
|
154
|
-
if endstring:
|
|
155
|
-
"""
|
|
156
|
-
请求有可能是html或者json等,如果有需要判断html结束的才启动这个选项
|
|
157
|
-
"""
|
|
158
|
-
html = r.text.strip()
|
|
159
|
-
if not html.endswith(endstring):
|
|
160
|
-
self.logger.info("not endswith {}".format(endstring))
|
|
161
|
-
return False, "endString", r
|
|
162
|
-
|
|
163
|
-
if marks:
|
|
164
|
-
"""
|
|
165
|
-
验证请求是否成功 通过一个特征字符串或者html的标签来查找 保证下载的页面是我需要的页面
|
|
166
|
-
而不是错误页面
|
|
167
|
-
特征值有可能没有是网页出现问题 有可能是请求不完全 这个依照情况而定
|
|
168
|
-
"""
|
|
169
|
-
html = r.text.strip()
|
|
170
|
-
for mark in marks:
|
|
171
|
-
if html.find(mark) == -1:
|
|
172
|
-
self.logger.info('not found {}'.format(mark))
|
|
173
|
-
return False, "Feature err", r
|
|
174
|
-
else:
|
|
175
|
-
self.logger.info("found mark is {}".format(mark))
|
|
176
|
-
|
|
177
|
-
return True, "", r
|
|
178
|
-
|
|
179
|
-
def base_sn_post_httpx(self, url, sn, data=None, endstring="", marks=[], **kwargs):
|
|
180
|
-
r = None
|
|
181
|
-
exMsg = None
|
|
182
|
-
try:
|
|
183
|
-
r = sn.post(url=url, data=data, **kwargs)
|
|
184
|
-
except:
|
|
185
|
-
exMsg = '* ' + traceback.format_exc()
|
|
186
|
-
self.logger.error(exMsg)
|
|
187
|
-
finally:
|
|
188
|
-
closeResult(r)
|
|
189
|
-
|
|
190
|
-
if exMsg:
|
|
191
|
-
self.logger.info("判断到except,请求出项错误{}".format(exMsg))
|
|
192
|
-
return False, "httpx", r
|
|
193
|
-
|
|
194
|
-
if r.status_code != 200:
|
|
195
|
-
self.logger.warning('r.status_code:' + str(r.status_code))
|
|
196
|
-
return False, "code", r
|
|
197
|
-
|
|
198
|
-
if endstring:
|
|
199
|
-
"""
|
|
200
|
-
请求有可能是html或者json等,如果有需要判断html结束的才启动这个选项
|
|
201
|
-
"""
|
|
202
|
-
html = r.text.strip()
|
|
203
|
-
if not html.endswith(endstring):
|
|
204
|
-
self.logger.info("not endswith {}".format(endstring))
|
|
205
|
-
return False, "endString", r
|
|
206
|
-
|
|
207
|
-
if marks:
|
|
208
|
-
"""
|
|
209
|
-
验证请求是否成功 通过一个特征字符串或者html的标签来查找 保证下载的页面是我需要的页面
|
|
210
|
-
而不是错误页面
|
|
211
|
-
特征值有可能没有是网页出现问题 有可能是请求不完全 这个依照情况而定
|
|
212
|
-
"""
|
|
213
|
-
html = r.text.strip()
|
|
214
|
-
for mark in marks:
|
|
215
|
-
if html.find(mark) == -1:
|
|
216
|
-
self.logger.info('not found {}'.format(mark))
|
|
217
|
-
return False, "Feature err", r
|
|
218
|
-
else:
|
|
219
|
-
self.logger.info("found mark is {}".format(mark))
|
|
220
|
-
|
|
221
|
-
return True, "", r
|
|
222
|
-
|
|
223
|
-
async def httpx_asyncclient(self, url, params=None,
|
|
224
|
-
headers=None,
|
|
225
|
-
cookies=None,
|
|
226
|
-
auth=None,
|
|
227
|
-
allow_redirects=True,
|
|
228
|
-
timeout=UNSET):
|
|
229
|
-
"""
|
|
230
|
-
Python 3.8+ with
|
|
231
|
-
:param url:
|
|
232
|
-
:return:
|
|
233
|
-
"""
|
|
234
|
-
async with httpx.AsyncClient() as client:
|
|
235
|
-
r = await client.get(url, params=params, headers=headers,
|
|
236
|
-
cookies=cookies, auth=auth, follow_redirects=allow_redirects,
|
|
237
|
-
timeout=timeout)
|
|
238
|
-
return r
|
|
239
|
-
|
|
240
|
-
async def httpx_asyncclient_post(self, url, *,
|
|
241
|
-
data=None,
|
|
242
|
-
files=None,
|
|
243
|
-
json=None,
|
|
244
|
-
params=None,
|
|
245
|
-
headers=None,
|
|
246
|
-
cookies=None,
|
|
247
|
-
auth=None,
|
|
248
|
-
allow_redirects=True,
|
|
249
|
-
timeout=UNSET):
|
|
250
|
-
async with httpx.AsyncClient() as client:
|
|
251
|
-
r = await client.post(url, data=data, files=files, json=json,
|
|
252
|
-
params=params, headers=headers, cookies=cookies,
|
|
253
|
-
auth=auth, follow_redirects=allow_redirects,
|
|
254
|
-
timeout=timeout)
|
|
255
|
-
return r
|
|
256
|
-
|
|
257
|
-
async def check_http2(self, url, **kwargs):
|
|
258
|
-
"""
|
|
259
|
-
检查http2的支持
|
|
260
|
-
:return:
|
|
261
|
-
"""
|
|
262
|
-
client = httpx.AsyncClient(http2=True)
|
|
263
|
-
response = await client.get(url, **kwargs)
|
|
264
|
-
http_version = response.http_version # "HTTP/1.0", "HTTP/1.1", or "HTTP/2".
|
|
265
|
-
if http_version == "HTTP/2":
|
|
266
|
-
return True, http_version
|
|
267
|
-
else:
|
|
268
|
-
return False, http_version
|
|
1
|
+
"""
|
|
2
|
+
basehttpx
|
|
3
|
+
"""
|
|
4
|
+
import traceback
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
import urllib3
|
|
8
|
+
from httpx import Timeout
|
|
9
|
+
from httpx._config import UNSET
|
|
10
|
+
|
|
11
|
+
from re_common.baselibrary.utils.core.mlamada import closeResult
|
|
12
|
+
from re_common.baselibrary.utils.core.requests_core import USER_AGENT, set_proxy_httpx
|
|
13
|
+
|
|
14
|
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class BaseHttpx(object):
|
|
18
|
+
def __init__(self, logger=None):
|
|
19
|
+
if logger == None:
|
|
20
|
+
from re_common.baselibrary import MLogger
|
|
21
|
+
logger = MLogger().streamlogger
|
|
22
|
+
self.logger = logger
|
|
23
|
+
self.proxies = None
|
|
24
|
+
self.headers = {}
|
|
25
|
+
self.sn = None
|
|
26
|
+
self.as_sn = None
|
|
27
|
+
|
|
28
|
+
def httpx_get(self, url,
|
|
29
|
+
*,
|
|
30
|
+
params=None,
|
|
31
|
+
headers=None,
|
|
32
|
+
cookies=None,
|
|
33
|
+
auth=None,
|
|
34
|
+
allow_redirects=True,
|
|
35
|
+
cert=None,
|
|
36
|
+
verify=True,
|
|
37
|
+
timeout=Timeout(timeout=5.0),
|
|
38
|
+
trust_env=True):
|
|
39
|
+
"""
|
|
40
|
+
基础httpx使用教程
|
|
41
|
+
params = {'key1': 'value1', 'key2': 'value2'}
|
|
42
|
+
r = httpx.get('https://httpbin.org/get', params=params)
|
|
43
|
+
r.url
|
|
44
|
+
params = {'key1': 'value1', 'key2': ['value2', 'value3']}
|
|
45
|
+
r.status_code
|
|
46
|
+
r.headers['content-type']
|
|
47
|
+
r.encoding
|
|
48
|
+
r.encoding = 'ISO-8859-1'
|
|
49
|
+
r.content
|
|
50
|
+
r.text
|
|
51
|
+
r.json()
|
|
52
|
+
/////////////////
|
|
53
|
+
from PIL import Image
|
|
54
|
+
from io import BytesIO
|
|
55
|
+
i = Image.open(BytesIO(r.content))
|
|
56
|
+
|
|
57
|
+
:param url:
|
|
58
|
+
:return: r
|
|
59
|
+
"""
|
|
60
|
+
return httpx.get(url, params=params, headers=headers, cookies=cookies,
|
|
61
|
+
auth=auth, follow_redirects=allow_redirects, cert=cert,
|
|
62
|
+
verify=verify, timeout=timeout, trust_env=trust_env)
|
|
63
|
+
|
|
64
|
+
def httpx_post(self, url, *,
|
|
65
|
+
data=None,
|
|
66
|
+
files=None,
|
|
67
|
+
json=None,
|
|
68
|
+
params=None,
|
|
69
|
+
headers=None,
|
|
70
|
+
cookies=None,
|
|
71
|
+
auth=None,
|
|
72
|
+
allow_redirects=True,
|
|
73
|
+
cert=None,
|
|
74
|
+
verify=True,
|
|
75
|
+
timeout=Timeout(timeout=5.0),
|
|
76
|
+
trust_env=True):
|
|
77
|
+
"""
|
|
78
|
+
基础的post请求
|
|
79
|
+
>>> r = httpx.put('https://httpbin.org/put', data={'key': 'value'})
|
|
80
|
+
>>> r = httpx.delete('https://httpbin.org/delete')
|
|
81
|
+
>>> r = httpx.head('https://httpbin.org/get')
|
|
82
|
+
>>> r = httpx.options('https://httpbin.org/get')
|
|
83
|
+
data={'key': 'value'}
|
|
84
|
+
:param url:
|
|
85
|
+
:param data:
|
|
86
|
+
:return:
|
|
87
|
+
"""
|
|
88
|
+
r = httpx.post(url, data=data, json=json, files=files,
|
|
89
|
+
params=params, headers=headers, cookies=cookies,
|
|
90
|
+
auth=auth, follow_redirects=allow_redirects, cert=cert,
|
|
91
|
+
verify=verify, timeout=timeout, trust_env=trust_env)
|
|
92
|
+
return r
|
|
93
|
+
|
|
94
|
+
def creat_sn(self, proxy=None, headers=None, verify=False, **kwargs):
|
|
95
|
+
"""
|
|
96
|
+
创建httpx会话对象
|
|
97
|
+
:param proxy:
|
|
98
|
+
:param headers:
|
|
99
|
+
:param verify:
|
|
100
|
+
:param kwargs:
|
|
101
|
+
:return:
|
|
102
|
+
"""
|
|
103
|
+
if proxy:
|
|
104
|
+
kwargs["proxies"] = set_proxy_httpx(proxy)
|
|
105
|
+
self.proxies = kwargs["proxies"]
|
|
106
|
+
if headers:
|
|
107
|
+
kwargs["headers"] = headers
|
|
108
|
+
if headers == "default":
|
|
109
|
+
kwargs["headers"]['User-Agent'] = USER_AGENT
|
|
110
|
+
kwargs["verify"] = verify
|
|
111
|
+
sn = httpx.Client(**kwargs)
|
|
112
|
+
self.sn = sn
|
|
113
|
+
return sn
|
|
114
|
+
|
|
115
|
+
def sn_close(self):
|
|
116
|
+
self.sn.close()
|
|
117
|
+
|
|
118
|
+
async def create_async_client(self, **kwargs):
|
|
119
|
+
"""
|
|
120
|
+
创建异步会话对象
|
|
121
|
+
:param kwargs:
|
|
122
|
+
:return:
|
|
123
|
+
"""
|
|
124
|
+
sn = httpx.AsyncClient(**kwargs)
|
|
125
|
+
self.as_sn = sn
|
|
126
|
+
return sn
|
|
127
|
+
|
|
128
|
+
async def as_sn_close(self):
|
|
129
|
+
"""
|
|
130
|
+
关闭异步sn
|
|
131
|
+
"""
|
|
132
|
+
await self.as_sn.close()
|
|
133
|
+
|
|
134
|
+
def base_sn_httpx(self, url, sn, endstring="", marks=[], **kwargs):
|
|
135
|
+
|
|
136
|
+
r = None
|
|
137
|
+
exMsg = None
|
|
138
|
+
try:
|
|
139
|
+
r = sn.get(url=url, **kwargs)
|
|
140
|
+
except:
|
|
141
|
+
exMsg = '* ' + traceback.format_exc()
|
|
142
|
+
self.logger.error(exMsg)
|
|
143
|
+
finally:
|
|
144
|
+
closeResult(r)
|
|
145
|
+
|
|
146
|
+
if exMsg:
|
|
147
|
+
self.logger.info("判断到except,请求出项错误{}".format(exMsg))
|
|
148
|
+
return False, "httpx", r
|
|
149
|
+
|
|
150
|
+
if r.status_code != 200:
|
|
151
|
+
self.logger.warning('r.status_code:' + str(r.status_code))
|
|
152
|
+
return False, "code", r
|
|
153
|
+
|
|
154
|
+
if endstring:
|
|
155
|
+
"""
|
|
156
|
+
请求有可能是html或者json等,如果有需要判断html结束的才启动这个选项
|
|
157
|
+
"""
|
|
158
|
+
html = r.text.strip()
|
|
159
|
+
if not html.endswith(endstring):
|
|
160
|
+
self.logger.info("not endswith {}".format(endstring))
|
|
161
|
+
return False, "endString", r
|
|
162
|
+
|
|
163
|
+
if marks:
|
|
164
|
+
"""
|
|
165
|
+
验证请求是否成功 通过一个特征字符串或者html的标签来查找 保证下载的页面是我需要的页面
|
|
166
|
+
而不是错误页面
|
|
167
|
+
特征值有可能没有是网页出现问题 有可能是请求不完全 这个依照情况而定
|
|
168
|
+
"""
|
|
169
|
+
html = r.text.strip()
|
|
170
|
+
for mark in marks:
|
|
171
|
+
if html.find(mark) == -1:
|
|
172
|
+
self.logger.info('not found {}'.format(mark))
|
|
173
|
+
return False, "Feature err", r
|
|
174
|
+
else:
|
|
175
|
+
self.logger.info("found mark is {}".format(mark))
|
|
176
|
+
|
|
177
|
+
return True, "", r
|
|
178
|
+
|
|
179
|
+
def base_sn_post_httpx(self, url, sn, data=None, endstring="", marks=[], **kwargs):
|
|
180
|
+
r = None
|
|
181
|
+
exMsg = None
|
|
182
|
+
try:
|
|
183
|
+
r = sn.post(url=url, data=data, **kwargs)
|
|
184
|
+
except:
|
|
185
|
+
exMsg = '* ' + traceback.format_exc()
|
|
186
|
+
self.logger.error(exMsg)
|
|
187
|
+
finally:
|
|
188
|
+
closeResult(r)
|
|
189
|
+
|
|
190
|
+
if exMsg:
|
|
191
|
+
self.logger.info("判断到except,请求出项错误{}".format(exMsg))
|
|
192
|
+
return False, "httpx", r
|
|
193
|
+
|
|
194
|
+
if r.status_code != 200:
|
|
195
|
+
self.logger.warning('r.status_code:' + str(r.status_code))
|
|
196
|
+
return False, "code", r
|
|
197
|
+
|
|
198
|
+
if endstring:
|
|
199
|
+
"""
|
|
200
|
+
请求有可能是html或者json等,如果有需要判断html结束的才启动这个选项
|
|
201
|
+
"""
|
|
202
|
+
html = r.text.strip()
|
|
203
|
+
if not html.endswith(endstring):
|
|
204
|
+
self.logger.info("not endswith {}".format(endstring))
|
|
205
|
+
return False, "endString", r
|
|
206
|
+
|
|
207
|
+
if marks:
|
|
208
|
+
"""
|
|
209
|
+
验证请求是否成功 通过一个特征字符串或者html的标签来查找 保证下载的页面是我需要的页面
|
|
210
|
+
而不是错误页面
|
|
211
|
+
特征值有可能没有是网页出现问题 有可能是请求不完全 这个依照情况而定
|
|
212
|
+
"""
|
|
213
|
+
html = r.text.strip()
|
|
214
|
+
for mark in marks:
|
|
215
|
+
if html.find(mark) == -1:
|
|
216
|
+
self.logger.info('not found {}'.format(mark))
|
|
217
|
+
return False, "Feature err", r
|
|
218
|
+
else:
|
|
219
|
+
self.logger.info("found mark is {}".format(mark))
|
|
220
|
+
|
|
221
|
+
return True, "", r
|
|
222
|
+
|
|
223
|
+
async def httpx_asyncclient(self, url, params=None,
|
|
224
|
+
headers=None,
|
|
225
|
+
cookies=None,
|
|
226
|
+
auth=None,
|
|
227
|
+
allow_redirects=True,
|
|
228
|
+
timeout=UNSET):
|
|
229
|
+
"""
|
|
230
|
+
Python 3.8+ with
|
|
231
|
+
:param url:
|
|
232
|
+
:return:
|
|
233
|
+
"""
|
|
234
|
+
async with httpx.AsyncClient() as client:
|
|
235
|
+
r = await client.get(url, params=params, headers=headers,
|
|
236
|
+
cookies=cookies, auth=auth, follow_redirects=allow_redirects,
|
|
237
|
+
timeout=timeout)
|
|
238
|
+
return r
|
|
239
|
+
|
|
240
|
+
async def httpx_asyncclient_post(self, url, *,
|
|
241
|
+
data=None,
|
|
242
|
+
files=None,
|
|
243
|
+
json=None,
|
|
244
|
+
params=None,
|
|
245
|
+
headers=None,
|
|
246
|
+
cookies=None,
|
|
247
|
+
auth=None,
|
|
248
|
+
allow_redirects=True,
|
|
249
|
+
timeout=UNSET):
|
|
250
|
+
async with httpx.AsyncClient() as client:
|
|
251
|
+
r = await client.post(url, data=data, files=files, json=json,
|
|
252
|
+
params=params, headers=headers, cookies=cookies,
|
|
253
|
+
auth=auth, follow_redirects=allow_redirects,
|
|
254
|
+
timeout=timeout)
|
|
255
|
+
return r
|
|
256
|
+
|
|
257
|
+
async def check_http2(self, url, **kwargs):
|
|
258
|
+
"""
|
|
259
|
+
检查http2的支持
|
|
260
|
+
:return:
|
|
261
|
+
"""
|
|
262
|
+
client = httpx.AsyncClient(http2=True)
|
|
263
|
+
response = await client.get(url, **kwargs)
|
|
264
|
+
http_version = response.http_version # "HTTP/1.0", "HTTP/1.1", or "HTTP/2".
|
|
265
|
+
if http_version == "HTTP/2":
|
|
266
|
+
return True, http_version
|
|
267
|
+
else:
|
|
268
|
+
return False, http_version
|