本帖最后由 suchocolate 于 2021-11-14 19:27 编辑
从浏览器f12分析,真实的数据在另外的页面,这个页面的的url比较长,在页面的html代码里搜的了以下,这个url里只有sid和p是变动的,其他不变,p是页码,所以只要我们找到sid就能合成url。
我在首页的html代码里搜了sid是js定义的,用etree不方便获取,改用re获取。
合成数据页url后,开始根据需要获取想要的页数,每页的数据存在了tr里,循环所有tr获取其中的值。
import requests
import re
from lxml import etree
def main():
url = 'https://bscscan.com/token/0xD44FD09d74cd13838F137B590497595d6b3FEeA4#balances' # 主页面
headers = {'user-agent': 'firefox'}
r = requests.get(url, headers=headers)
sid = re.findall(r'var sid = \'(.*?)\'', r.text)[0] # 从主页面搜索sid,用于合成数据页的url
result = []
for i in range(1, 3): # 这里只爬取2页,想爬多一点的页,自己改range即可。
url = f'https://bscscan.com/token/generic-tokenholders2?' \
f'm=normal&a=0xD44FD09d74cd13838F137B590497595d6b3FEeA4&s=5000000000000000000000000&' \
f'sid={sid}&p={i}' # 构建数据页url,i是第几页
r = requests.get(url, headers=headers)
html = etree.HTML(r.text)
trs = html.xpath('//tbody/tr') # 使用xpath过滤出表格的每一行,逐行获取
for tr in trs:
rank = tr.xpath('./td[1]/text()')[0]
ads = tr.xpath('./td[2]/span/a/text()')[0]
qut = tr.xpath('./td[3]/text()')[0]
result.append([rank, ads, qut]) # 存到列表中
print(result) # 打印结果
if __name__ == '__main__':
main()
|