我的脚本一次又一次地解析无限滚动网页中的所有链接
My script parses all the links again and again from a infinite scrolling webpage
我已经使用 python 结合 selenium 编写了一个脚本,以从网页中获取所有公司链接,该网页在滚动到最下方之前不会显示所有链接。但是,当我 运行 我的脚本时,我得到了想要的链接,但是有很多重复项被删除了。此时,我不知道如何修改我的脚本以获得唯一链接。这是我到目前为止尝试过的方法:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://fortune.com/fortune500/list/')
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3)
for items in driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]"):
item = items.find_elements_by_xpath('.//a')[0]
print(item.get_attribute("href"))
driver.close()
我不知道 python 但我知道你做错了什么。希望您能够自己找出代码 ;)
每次向下滚动时,页面都会添加 50 个链接,直到有 1000 个链接。好吧几乎...它从 20 个链接开始,然后每次添加 30 个,然后每次添加 50 个,直到有 1000 个。
你的代码现在打印的方式是:
前20个链接。
第一个 20 又是下一个 30。
前50个+后50个
等等...
您真正想要做的只是向下滚动页面,直到您拥有页面上的所有链接,然后然后 打印它们。希望对您有所帮助。
这是更新后的 Python 代码(我检查过它并且有效)
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://fortune.com/fortune500/list/')
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
listElements = driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")
print(len(listElements))
if (len(listElements) == 1000):
break
for item in listElements:
print(item.get_attribute("href"))
driver.close()
如果您希望它运行得更快一些,您可以将 "time.sleep(5)" 换成 Anderson 的等待语句
您可以试试下面的代码:
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.common.exceptions import TimeoutException
my_links = []
while True:
try:
current_length = len(my_links)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait(driver, 10).until(lambda: len(driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")) > current_length)
my_links.extend([a.get_attribute("href") for a in driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")])
except TimeoutException:
break
my_links = set(my_links)
这应该允许您在可能的情况下向下滚动并收集新链接。最后,使用 set()
您只能保留唯一值
我已经使用 python 结合 selenium 编写了一个脚本,以从网页中获取所有公司链接,该网页在滚动到最下方之前不会显示所有链接。但是,当我 运行 我的脚本时,我得到了想要的链接,但是有很多重复项被删除了。此时,我不知道如何修改我的脚本以获得唯一链接。这是我到目前为止尝试过的方法:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://fortune.com/fortune500/list/')
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3)
for items in driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]"):
item = items.find_elements_by_xpath('.//a')[0]
print(item.get_attribute("href"))
driver.close()
我不知道 python 但我知道你做错了什么。希望您能够自己找出代码 ;)
每次向下滚动时,页面都会添加 50 个链接,直到有 1000 个链接。好吧几乎...它从 20 个链接开始,然后每次添加 30 个,然后每次添加 50 个,直到有 1000 个。
你的代码现在打印的方式是:
前20个链接。
第一个 20 又是下一个 30。
前50个+后50个
等等...
您真正想要做的只是向下滚动页面,直到您拥有页面上的所有链接,然后然后 打印它们。希望对您有所帮助。
这是更新后的 Python 代码(我检查过它并且有效)
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('http://fortune.com/fortune500/list/')
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
listElements = driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")
print(len(listElements))
if (len(listElements) == 1000):
break
for item in listElements:
print(item.get_attribute("href"))
driver.close()
如果您希望它运行得更快一些,您可以将 "time.sleep(5)" 换成 Anderson 的等待语句
您可以试试下面的代码:
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.common.exceptions import TimeoutException
my_links = []
while True:
try:
current_length = len(my_links)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait(driver, 10).until(lambda: len(driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")) > current_length)
my_links.extend([a.get_attribute("href") for a in driver.find_elements_by_xpath("//li[contains(concat(' ', @class, ' '), ' small-12 ')]//a")])
except TimeoutException:
break
my_links = set(my_links)
这应该允许您在可能的情况下向下滚动并收集新链接。最后,使用 set()
您只能保留唯一值