首页 > 解决方案 > 为什么不是完整的数据?

问题描述

我尝试在所有 3 个 url 中获取所有特定的 span 标签,但最后 csv 文件只显示最后一个 url 的数据。

Python代码

from selenium import webdriver
from lxml import etree
from bs4 import BeautifulSoup
import time
import pandas as pd

urls = []
for i in range(1, 4):
    if i == 1:
        url = "https://www.coinbase.com/price/s/listed"
        urls.append(url)

    else:
        url = "https://www.coinbase.com/price/s/listed" + f"?page={i}"
        urls.append(url)
print(urls)

for url in urls:
    wd = webdriver.Chrome()
    wd.get(url)

    time.sleep(30)
    resp =wd.page_source
    html = BeautifulSoup(resp,"lxml")
    tr = html.find_all("tr",class_="AssetTableRowDense__Row-sc-14h1499-1 lfkMjy")
    print(len(tr))
    names =[]
    for i in tr:
        name1 = i.find("span",class_="TextElement__Spacer-hxkcw5-0 cicsNy Header__StyledHeader-sc-1xiyexz-0 kwgTEs AssetTableRowDense__StyledHeader-sc-14h1499-14 AssetTableRowDense__StyledHeaderDark-sc-14h1499-17 cWTMKR").text
        name2 = i.find("span",class_="TextElement__Spacer-hxkcw5-0 cicsNy Header__StyledHeader-sc-1xiyexz-0 bjBkPh AssetTableRowDense__StyledHeader-sc-14h1499-14 AssetTableRowDense__StyledHeaderLight-sc-14h1499-15 AssetTableRowDense__TickerText-sc-14h1499-16 cdqGcC").text
        names.append([name1,name2])

ns=pd.DataFrame(names)
date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
path = "/Users/paul/jpn traffic/coinbase/coinbase"
ns.to_csv(path+date+date+'.csv',index=None)

2 print() 函数的结果,它没有返回任何错误:

print(urls):['https://www.coinbase.com/price/s/listed', 'https://www.coinbase.com/price/s/listed?page=2', 'https://www.coinbase.com/price/s/listed?page=3']

打印(长度(tr))

26
30
16

那么我的代码有什么问题?为什么不是完整的数据?

顺便说一句,如果我想在给定的时间每天在云服务上运行我的代码,这对我来说更好,作为一个新手 python 学习者?我不需要在云上存储大量数据,我只需要 python 脚本将电子邮件发送到我的盒子就可以了。

标签: python-3.xrecursionweb-scrapingpythonanywhere

解决方案


为什么不是数据?答案是数据是从后门生成的,这意味着网站正在使用API这就是为什么数据不是在 BeautifulSoup 的帮助下产生的。您可以使用 api_url 和 requests 轻松获取数据。要获取 api_url,请转到 chrome devtools,然后转到网络选项卡,然后转到 xhr 选项卡并单击标题选项卡,然后您将获得 url 并单击预览选项卡以查看数据。

现在,数据正在生成:

import requests
r = requests.get('https://www.coinbase.com/api/v2/assets/search?base=BDT&country=BD&filter=listed&include_prices=true&limit=30&order=asc&page=2&query=&resolution=day&sort=rank')
coinbase = r.json()['data']

for coin in coinbase:
    print(coin['name'])

推荐阅读