Python 在Javascript网站上循环浏览不同页面并抓取数据
我想我已经很接近了,但是我不明白为什么我的代码不能像预期的那样工作。我想从第一页抓取数据,然后单击Python 在Javascript网站上循环浏览不同页面并抓取数据,python,selenium,loops,web-scraping,Python,Selenium,Loops,Web Scraping,我想我已经很接近了,但是我不明白为什么我的代码不能像预期的那样工作。我想从第一页抓取数据,然后单击next(箭头)按钮,移动到下一页并执行相同的操作,依此类推,直到next箭头按钮变灰,此时驾驶员应该退出。任何帮助都将不胜感激。代码如下: 进口硒 从selenium.webdriver.chrome.options导入选项 从selenium导入webdriver 从bs4导入* 导入时间 作为pd进口熊猫 进口泡菜 导入html5lib 选项=选项() options.add_参数('--
next
(箭头)按钮,移动到下一页并执行相同的操作,依此类推,直到next
箭头按钮变灰,此时驾驶员应该退出。任何帮助都将不胜感激。代码如下:
进口硒
从selenium.webdriver.chrome.options导入选项
从selenium导入webdriver
从bs4导入*
导入时间
作为pd进口熊猫
进口泡菜
导入html5lib
选项=选项()
options.add_参数('--headless')
options.add_参数('--disable gpu')
chrome\u driver\u path='/Users/Justin/Desktop/Python/chromedriver'
driver=webdriver.Chrome(可执行文件路径=Chrome\u驱动程序路径)
url=”https://cryptoli.st/lists/fixed-supply"
获取驱动程序(url)
时间。睡眠(3)
page=driver.page\u源
主列表=[]
def get_下一页(url):
while driver.find_element_by_xpath('/html/body/div/div/div/div[2]/div[1]/div[2]/div[2]/div[2]/ul/li[9]')!=正确:
driver.find_元素(
“/html/body/div/div/div/div[2]/div[1]/div[2]/div[2]/div[2]/ul/li[9]/a”)。单击()
soup=BeautifulSoup(第页“html5lib”)
容器=汤。查找所有('div',属性={
'class':'dataTables\u scrollBody'})
df=pd.read_html(str(容器))
dfs=df[0]
page_next_data=dfs[['#','名称','符号','最大供应量','汇总','价格','市值',
“24小时容量”、“1小时百分比”、“24小时百分比”、“7天百分比”、“循环量”、“总供应量”、“共识法”]]
返回主列表。追加(第页下一页数据)
其他:
driver.quit()
def get_数据(回调,url):
全球汤,容器
soup=BeautifulSoup(第页“html5lib”)
容器=汤。查找所有('div',属性={
'class':'dataTables\u scrollBody'})
df=pd.read_html(str(容器))
dfs=df[0]
page_one_data=dfs[['#','名称','符号','最大供应量','汇总','价格','市值',
“24小时容量”、“1小时百分比”、“24小时百分比”、“7天百分比”、“循环量”、“总供应量”、“共识法”]]
返回主列表。追加(第一页数据)
返回回调(args)
打印(获取数据(获取下一页,url))
即使现在,您似乎还没有测试任何较小的代码片段。
看看你的逻辑:
while driver...
driver....click()
...
return master_list.append(...)
None
return None
看起来你把事情弄得太复杂了。在一个函数中有两个
return
语句,并且使用了函数范围中不存在的args
变量。请参见下面的调整和工作代码:
import selenium
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from bs4 import *
import time
import pandas as pd
import pickle
import html5lib
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
chrome_driver_path = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(executable_path=chrome_driver_path)
url = "https://cryptoli.st/lists/fixed-supply"
driver.get(url)
time.sleep(3)
page = driver.page_source
master_list = []
def get_next_page(url):
proceed = True
while driver.find_element_by_xpath('/html/body/div/div/div/div[2]/div[1]/div[2]/div[2]/div[2]/ul/li[9]/a') != True and proceed:
try:
driver.find_elements_by_xpath('/html/body/div/div/div/div[2]/div[1]/div[2]/div[2]/div[2]/ul/li[9]/a')[0].click()
except Exception:
proceed = False
soup = BeautifulSoup(page, 'html5lib')
container = soup.find_all('div', attrs={'class': 'dataTables_scrollBody'})
df = pd.read_html(str(container))
dfs = df[0]
page_next_data = dfs[['#', 'Name', 'Symbol', 'Max Supply', 'Summary', 'Price', 'Market Cap', '24h Volume', '1h %', '24h %', '7d %', 'Circulation', 'Total Supply', 'Consensus Method']]
master_list.append(page_next_data)
else:
driver.quit()
def get_data(callback, url):
global soup, container
soup = BeautifulSoup(page, 'html5lib')
container = soup.find_all('div', attrs={'class': 'dataTables_scrollBody'})
df = pd.read_html(str(container))
dfs = df[0]
page_one_data = dfs[['#', 'Name', 'Symbol', 'Max Supply', 'Summary', 'Price', 'Market Cap', '24h Volume', '1h %', '24h %', '7d %', 'Circulation', 'Total Supply', 'Consensus Method']]
master_list.append(page_one_data)
return callback(url)
get_data(get_next_page, url)
print(master_list)
您很好地概括了希望此代码执行的操作。但是,我们还需要您详细说明它在做什么,包括可疑值的跟踪(使用
print
s)和问题隔离(删除多余代码)。见(MRE)。谢谢你的提示!我编辑了这篇文章。它返回的第一页很好,但我无法让它执行回调函数,甚至无法抛出错误,所以我知道出了什么问题。谢谢!我在自学python,但我不知道从哪里开始。我不明白“并继续:”在python中,继续是一个特殊的变量,如果设置为=True,它会告诉程序继续下一步吗?另外,看到异常是大写的,您还没有定义它是“Exception Exception”,这只是一个简短的说法“如果发现异常,是否停止迭代?再次感谢你!这非常有用。继续
只是一个可以更改的变量名。try
和except
仅用于确定下一个箭头按钮何时不再可单击(变灰)。更合适的方法是只使用webdriver方法测试此元素是否可单击,如Finally,如果您可以退出中的驱动程序,除了,您在评估while
条件时会出错,因为此时浏览器窗口已关闭。