如何在最后一页停止 'next page' 循环?

How can I stop the 'next page' loop at the last page?

代码运行良好,甚至循环遍历所有页面,但问题是它不会在最后一页停止。 从第 15 页开始,它在连续循环中运行,即第 15 页、第 16 页、第 15 页和第 16 页,依此类推

from bs4 import BeautifulSoup as soup
import pandas as pd
import requests
import urllib
import requests, random

data =[]

def getdata (url):
    user_agents = [
      "chrome/5.0 (Windows NT 6.0; Win64; x64",
      "chrome/5.0 (Windows NT 6.0; Win64; x32",
    ]
    user_agent = random.choice(user_agents)
    header_ = {'User-Agent': user_agent}
    req = urllib.request.Request(url, headers=header_)
    flipkart_html = urllib.request.urlopen(req).read()
    f_soup = soup(flipkart_html,'html.parser')
    
    for e in f_soup.select('div[class="_13oc-S"]'):
        
        try:
            asin = e.find('a',{'class':'_1fQZEK'})['href'].split('=')[1].split('&')[0]
        except:
            asin = 'No ASIN Found'
            
        data.append({
            'ASIN': asin
        })
        
    return f_soup

def getnextpage(f_soup):
        try:
            page = f_soup.findAll('a',attrs={"class": '_1LKTO3'})[-1]['href']
            url =  'https://www.flipkart.com'+ str(page)
        except:
            url = None

        return url

keywords = ['iphone']

for k in keywords:
    url = 'https://www.flipkart.com/search?q='+k
    while True:
        geturl = getdata(url)
        url = getnextpage(geturl)
        if not url:
            break
        print(url)

输出

注意:有些关键字return甚至40页。 示例:'mobile'

那么,即使页面是动态的,我如何才能停在最后一页。

问题:

def getnextpage(f_soup):
        try:
            page = f_soup.findAll('a',attrs={"class": '_1LKTO3'})[-1]['href']
            url =  'https://www.flipkart.com'+ str(page)
        except:
            url = None

        return url

主要问题是您选择了包含下一页 link 的元素:

f_soup.findAll('a',attrs={"class": '_1LKTO3'})[-1]['href']

它在 NextPrevious 之间切换是什么导致了问题。请避免在较新的代码中使用 findAll(),而是使用 find_all()

Select 您的元素更具体,例如css selectors:-soup-contains("Next"):

f_soup.select_one('a[href*="&page="]:-soup-contains("Next")')['href']

在这种情况下,循环将break直到最后一页结束。

如果将 print 语句移到 if 语句上方,您会看到它在第 16 页之后选择第 15 页

要终止循环,请检查下一个按钮是否存在;如果不存在则终止。