是日,申东华教授电邮告吾爬取bscscan以及dappradar的BEP-20 Tokens以及Top Blockchain Dapps的相关数据以供研究之用,吾当时希望可以成为教授研究助理,因此硬着头皮接下了这个工作,但彼时我还没有开始过一次爬虫的练习,但是在简历上已经说了我是会用爬虫的。没办法,我只好硬着头皮做了起来。
先看要求:
教授首先要求我将下面的网站Tokens 那一列的名称和简介以及名称对应的超链接的资料爬取下来。
于是我们开始做。
from bs4 import BeautifulSoup
import requests
import pandas as pd
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
} #我并不确定这个header是干什么用的,但是看了有的文章说如果这里没有一个好的header后面会爬取数据被反爬虫。
# url for webscraper
ls = [1,2,3,4,5,6,7,8,9,10] #这个网站一共有10页
# url = "https://yieldwatch.net"
url = 'https://bscscan.com/tokens?p=' # 我们在做网站页面提取的时候一定要截取网站链接通用的部分。
Token Tracker | BscScanhttps://bscscan.com/tokens
然后,我们将网站的源代码进行分解,寻找我们需要的内容,我们在网站页面先选择检查(inspect)然后我们再将鼠标放到我们想要提取的内容然后选择检查。
# 解析网页
all_tokens = pd.DataFrame(columns=['index','Token','address','details'])
all_tokens.loc[0] = [0,0,0,0]
for i in ls:
r = requests.get(url + str(i),headers=headers)
soup = BeautifulSoup(r.text, "lxml")
subjects = soup.select('div tbody tr')
tokens = pd.DataFrame(columns=['index','Token','address','details'])
token = []
for i in range(len(subjects)):
Token_soup = subjects[i].find('a',class_="text-primary")
Token = Token_soup.get_text()
address_soup = subjects[i].find('h3',class_="h6 mb-0")
address = address_soup.find_all('a', href=True)[0]['href'][7:]
# print(address)
# break
if subjects[i].find('p',class_="d-none d-md-block font-size-1 mb-0") is not None:
token_id_soup = subjects[i].find('p',class_="d-none d-md-block font-size-1 mb-0")
token_id = token_id_soup.get_text()
else:
token_id = None
token = [i,Token,address,token_id]
tokens.loc[i]= token
# all_tokens.concat(tokens)
frames = [all_tokens, tokens]
all_tokens = pd.concat(frames)
在这里大家可以发现我完全使用了beautifulsoup的class提取的方式。而且这个beautifulsoup的提取过程只需要我把class前面的类别 <p, <h3, <a ... 记录一下,然后我们根据class的名称进行提取就可以了。
然后老师需要我提取那个打开之后的页面的链接,我的做法是:所有的超链接文本在原来界面的源代码上面都是具有超链接的地址的,于是我不需要打开这个超链接就可以看到这个链接。
这样之后我们就得到了这个问题的答案。
这个爬虫实例可以说是一切顺利并且,我不得不说,属于非常简单的情况。既没有遇到request无法获取,而且数据量也不是很大,而且也不需要用selenium进行页面内部的操作。
而关于第二个网站/dappradar就复杂多了。我先把网站放在这里,然后我也把任务说一下,感兴趣的朋友可以自己先想想思路,然后看看能不能做出来。
任务二:
Dappahttps://dappradar.com/rankings/protocol/binance-smart-chain
在这个网站上,我们需要所有BNB下方的的所有Dappa的名称,categories,并且点开每一个图片的链接(如下图)
首先检查是否每一个网站拥有Buy CAKE的按钮,如果有,我们需要爬取这个按钮的链接。如果没有,记录没有。
然后点击下方的 Smart Contract的按钮,你会看到一共有多少个Smart Contract,然后在这个的基础上我们需要把展示出来的所有Smart Contract都爬取出来。