如何在最后一页停止 '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']
它在 Next
和 Previous
之间切换是什么导致了问题。请避免在较新的代码中使用 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 页
要终止循环,请检查下一个按钮是否存在;如果不存在则终止。
代码运行良好,甚至循环遍历所有页面,但问题是它不会在最后一页停止。 从第 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']
它在 Next
和 Previous
之间切换是什么导致了问题。请避免在较新的代码中使用 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 页
要终止循环,请检查下一个按钮是否存在;如果不存在则终止。