今日はやって
みましょう、ステーションBのUPマスターのトップ100データ情報〜考えすぎないでください、あまり質問しないでください。それは純粋にテクノロジーのためであり、データのためではありません〜私はそれを信じています!!
次に、古いルールに従ってコードをアップロードし、ステーションBのアップマスターの情報をクロールする方法を確認します。
# -*- coding:utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-8-21
"""
import requests
import os
import json
import traceback
#存放数据的根目录
dir_path = os.path.join('up_100')
def get_http_session(pool_connections=2,pool_maxsize=10,max_retries = 3):
"""
http的连接池
:param pool_connection: 连接池数
:param poll_maxsize: 最大连接池数
:param max_retries: 最大重试数
:return:
"""
session =requests.session()
#适配器
adapter = requests.adapters.HTTPAdapter(pool_connections=pool_connections, pool_maxsize=pool_maxsize, max_retries=max_retries)
session.mount('http://',adapter)
session.mount('https://',adapter)
return session
def save_file(filepath,content):
"""
:param filepath: 文件路径
:param content: 保存的内容
:return:
"""
with open(filepath) as f:
f.write(content)
def log(content,level,filepath):
"""
:param content: 输入错误信息的内容
:param level: 错误等级
:param filepath: 写入错误文件地址
:return:
"""
if level == 'error':
with open(filepath,'a') as f:
f.write(content)
elif level == 'fail':
with open(filepath,'a') as f:
f.write(content)
def make_dir(name):
up_dir = os.path.join(dir_path,name)
if not os.path.exists(up_dir):
os.makedirs(up_dir)
return up_dir
def read_json(filepath):
"""
:param filepath: 读取文件
:return:
"""
with open(filepath,'r') as f:
res = f.read()
#将读取的文件转换成json格式,
return json.loads(res)
def get_up_base_info(name,uid):
url = f"B站UP主的url"
#设置获取url,超时时间为100
try:
r = get_http_session().get(url, timeout=100)
if r.status_code ==200:
up_dir = make_dir(name)
#文件信息
filepath = os.path.join(up_dir,f'{uid}_base_info.json')
#获取up主的内容,缩进4位,不进行编码
content = json.dumps(r.json(),indent=4,ensure_ascii= False)
save_file(filepath,content)
print(f'{name}up主信息保存成功!')
else:
#将失败的内容写入到log中
fail_str = f'name:[{name}],uid:[{uid},url:[{url}]'
log(fail_str,'fail','base_info_fail.log')
except Exception as e:
log(traceback.format_exc(),'error','base_info_error.log')
#保存错误的基本信息
error_str = f'name:[{name}],uid:[{uid}'
log(error_str,'error','base_info_error.log')
def base_info_task(power_json):
##启动方法,获取json的uid 和name信息
for d in power_json:
uid = d['uid']
name = d['name']
get_up_base_info(name,uid)
def main():
#读取pwoer_up
power_json = read_json('power_up.json')
base_info_task(power_json)
if __name__ == '__main__':
main()
注:
1.取得したインターフェースは情報を返します。Charles、Fiddlerなどの使いやすいツールを使用できます
。2。取得したデータは、見やすいようにjson形式で保存されます。3。
ログレベルはエラーのみを定義しますそして、失敗します。他は定義されていません。自分でカプセル化できます
。4。ここではuidと名前の情報のみが必要であり、他の情報が必要であり、それを自分で追加できます
。5。同様に、ここにUser-Agent設定がないため、クロールしても頻繁に使用すると、IPがブロックされる可能性があります;
6.大量にクロールする場合は、ユーザーエージェント設定とIPプロキシプール設定を実行できます。IP プロキシプール用の特別なスペースがあります。