python-3.x - 为什么不是完整的数据?
问题描述
我尝试在所有 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 脚本将电子邮件发送到我的盒子就可以了。
解决方案
为什么不是数据?答案是数据是从后门生成的,这意味着网站正在使用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'])
推荐阅读
- javascript - 带有 JQuery 的禁用字段出现在 C# 服务器端的请求中
- vb.net - form.show 上的 TypeInitializationException,它曾经在那里工作
- http - 用于分布式抓取解决方案负载平衡的高级 HTTP/2 代理
- html - 如何在输入中使用模式来强制它不接受“-”?
- checkbox - 如果选中复选框,则使用脚本从 Google Sheet 中的行生成文档
- tomcat - 如何在启动时查看传递给 tomcat8 的选项?
- c++ - 如何在标准库 C/C++ 函数中使 gdb 步入操作?
- php - 联系表格 7 未读取输入值
- c# - Web 浏览器无法下载 ics 文件
- sql - 如何从 Kinesis Analytics (SQL) 中格式化为字符串的 json 中选择数据