Python 如何清除网站中的所有页面
我想在这10页中循环浏览,从中找出他们的名字和HREF 下面是我的代码,它只连续刮取第1页10次:Python 如何清除网站中的所有页面,python,selenium,loops,selenium-webdriver,web-scraping,Python,Selenium,Loops,Selenium Webdriver,Web Scraping,我想在这10页中循环浏览,从中找出他们的名字和HREF 下面是我的代码,它只连续刮取第1页10次: def name(): for i in range(1, 11): tag = driver.find_elements_by_xpath('/html/body/div[4]/main/div[9]/div/div/div/div/div/div/div[2]/div[2]/div[3]/div/div[5]/ol/li[3]/div/div/div/div/div/d
def name():
for i in range(1, 11):
tag = driver.find_elements_by_xpath('/html/body/div[4]/main/div[9]/div/div/div/div/div/div/div[2]/div[2]/div[3]/div/div[5]/ol/li[3]/div/div/div/div/div/div[2]/div[1]/div[2]/div/h4')
for a in tag:
for name in a.find_elements_by_tag_name('a'):
links = name.get_attribute("href")
names = name.get_attribute('text')
watches_name.append(names)
watches_link.append(links)
# print(watches_name)
# print(watches_link)
name()
我想如果你的代码工作正常,你只需要点击分页按钮。我发现它可以通过css选择器
(“#Caret_Right_Line_Sm”)
找到。尝试将此行添加到函数中:
def name():
for i in range(1, 11):
tag = driver.find_elements_by_xpath('/html/body/div[4]/main/div[9]/div/div/div/div/div/div/div[2]/div[2]/div[3]/div/div[5]/ol/li[3]/div/div/div/div/div/div[2]/div[1]/div[2]/div/h4')
for a in tag:
for name in a.find_elements_by_tag_name('a'):
links = name.get_attribute("href")
names = name.get_attribute('text')
watches_name.append(names)
watches_link.append(links)
# print(watches_name)
# print(watches_link)
driver.find_elements_by_css_selector('#Caret_Right_Line_Sm')[1].click()
name()
如果您想从下一页中获取元素,则必须在链接
driver.find_element_by_css_selector('.sku-list-page-next').click()
最小的工作代码和其他更改 我将xpath简化为更简单的东西。我将名称、链接成对保留,因为在CSV文件或数据库中编写,或者过滤和排序更简单 我不得不使用更长的睡眠时间,有时我的浏览器需要更多的时间来更新页面上的元素
from selenium import webdriver
import time
url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'
driver = webdriver.Firefox()
driver.get(url)
time.sleep(2)
# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()
items = []
for page in range(1, 11):
print('\n[DEBUG] wait 15 seconds to update page\n')
time.sleep(15)
print('\n--- page', page, '---\n')
all_links = driver.find_elements_by_css_selector('#main-results h4 a')
for a in all_links:
link = a.get_attribute("href")
name = a.get_attribute('text')
items.append( [name, link] )
print(name)
print('\n[DEBUG] click next\n')
driver.find_element_by_css_selector('.sku-list-page-next').click()
#print(items)
顺便说一句:
此方法可以使用而不是True
,以及一些方法来识别是否存在链接
,并在没有
时退出循环。这样,它可以处理任意数量的页面
其他方法 当您手动访问几个页面时,您应该看到第二个页面的url带有
?cp=2
,第三个带有?cp=3
,等等。因此您可以使用它来加载页面
driver.get(url + '?cp=' + str(page+1) )
最小工作代码
from selenium import webdriver
import time
url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'
driver = webdriver.Firefox()
driver.get(url)
time.sleep(2)
# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()
items = []
for page in range(1, 11):
print('\n[DEBUG] wait 15 seconds to update page\n')
time.sleep(15)
print('\n--- page', page, '---\n')
all_links = driver.find_elements_by_css_selector('#main-results h4 a')
for a in all_links:
link = a.get_attribute("href")
name = a.get_attribute('text')
items.append( [name, link] )
print(name)
print('\n[DEBUG] load next url\n')
driver.get(url + '?cp=' + str(page+1) )
#print(items)
此方法还可以使用while True
和变量page
来获取任意数量的页面
编辑: 带有
而为True的版本
from selenium import webdriver
import time
url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'
driver = webdriver.Firefox()
driver.get(url)
time.sleep(2)
# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()
items = []
page = 1
while True:
print('\n[DEBUG] wait 15 seconds to update page\n')
time.sleep(15)
print('\n--- page', page, '---\n')
all_links = driver.find_elements_by_css_selector('#main-results h4 a')
for a in all_links:
link = a.get_attribute("href")
name = a.get_attribute('text')
items.append( [name, link] )
print(name)
page += 1
print('\n[DEBUG] load next url\n')
driver.get(url + '?cp=' + str(page) )
if driver.title == 'Best Buy: Page Not Found':
print('\n[DEBUG] exit loop\n')
break
#print(items)
及
什么与现有代码不兼容?你遇到了什么问题?它刮到了第一页而不是其他9页我想我的第一个for循环是错误的,但我已经试着纠正了它,但它不起作用什么元素是/html/body/div[4]/main/div[9]/div/div/div/div/div/div[2]/div[3]/div/div/div[5]/ol/li[3]/div/div/div/div/div/div/div[2]/div[1]/div[2]/div/h4
xpath定位器需要找到?名称和hrefwell,我之前已经尝试过回答您了。此代码有问题,它甚至无法从整个第一页获取数据。只从一个单一的产品就可以了。这里根本没有试图打开下一页。
from selenium import webdriver
import time
url = 'https://www.bestbuy.com/site/promo/health-fitness-deals'
driver = webdriver.Firefox()
driver.get(url)
time.sleep(2)
# page "Hello! Choose a Country" - selecting Unitet State flag
driver.find_element_by_class_name('us-link').click()
items = []
page = 1
while True:
print('\n[DEBUG] wait 15 seconds to update page\n')
time.sleep(15)
print('\n--- page', page, '---\n')
all_links = driver.find_elements_by_css_selector('#main-results h4 a')
for a in all_links:
link = a.get_attribute("href")
name = a.get_attribute('text')
items.append( [name, link] )
print(name)
page += 1
print('\n[DEBUG] click next\n')
item = driver.find_element_by_css_selector('.sku-list-page-next')
if item.get_attribute("href"):
item.click()
else:
print('\n[DEBUG] exit loop\n')
break
#print(items)