1 背景
? 之前使用Selenium爬取 https://eth.btc.com/accounts 上的账户地址及其交易记录,但是运行时间很长,而且老报一些错误,所以想到换一种方式来爬取智能合约。
2 方法
- 先对其抓包,获取请求路径和参数
- 循环构造参数
- 使用requests.get(url, params).json()请求获取数据并使用json方法序列化结果
- 处理获取到的数据并将其写入文件
3 步骤
(1)抓包
通过分析,获取请求地址和参数,发现只有page和size两个参数。
(2)构造参数 获取数据
A.txt中是爬取的一些账户地址,通过账户地址跟上图中的请求url组合形成请求地址来获取其交易记录
A.txt部分数据示例:
外部地址,1,https://eth.btc.com/accountinfo/0x00000000219ab540356cbb839cbe05303d7705fa,0x00000000219ab540356cbb839cbe05303d7705fa,7513890.00007 ETH,152468
合约地址,2,https://eth.btc.com/accountinfo/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2,0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2,6942619.43722 ETH,2774885
外部地址,3,https://eth.btc.com/accountinfo/0xbe0eb53f46cd790cd13851d5eff43d12404d33e8,0xbe0eb53f46cd790cd13851d5eff43d12404d33e8,2296896.46551 ETH,963
外部地址,4,https://eth.btc.com/accountinfo/0x73bceb1cd57c711feac4224d062b0f6ff338501e,0x73bceb1cd57c711feac4224d062b0f6ff338501e,1899046.59613 ETH,320
代码:
import requests
headers = {
'Cookie': 'OCSSID=4df0bjva6j7ejussu8al3eqo03',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
def getManyPages(address, total):
params = []
for i in range(1, int(total / 500) + 2):
params.append({"page": i, "size": 500})
url = 'https://explorer-web.api.btc.com/v1/eth/accounts/' + address + '/txns'
print('正在爬取', url, '...')
data = []
for i in params:
print(i)
json = '$$'
try:
json = requests.get(url, params=i, allow_redirects=False, headers=headers).json()
except:
continue
finally:
if json != '$$':
data.append(json.get('data'))
print('爬取结束!', url)
print('================================================================================================')
return data
def getAddressAndTotal():
res = []
with open('../data/A.txt', 'r', encoding='utf-8') as f:
for line in f.readlines():
sp = line.split(',')
res.append({
'address': sp[3],
'total': int(str(sp[5]).strip())
})
return res
if __name__ == '__main__':
addrTotal = getAddressAndTotal()
for at in addrTotal:
dataList = getManyPages(at.get('address'), at.get('total'))
with open('../data/req.txt', 'a', encoding='utf-8') as f:
for r in dataList:
for d in r.get('list'):
f.write(str(d))
f.write('\n')
|