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
    条件时会出错,因为此时浏览器窗口已关闭。