Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我的刮板无法从网页中获取所有项目_Python_Python 3.x_Selenium_Selenium Webdriver_Web Scraping - Fatal编程技术网

Python 我的刮板无法从网页中获取所有项目

Python 我的刮板无法从网页中获取所有项目,python,python-3.x,selenium,selenium-webdriver,web-scraping,Python,Python 3.x,Selenium,Selenium Webdriver,Web Scraping,我已经用python结合selenium编写了一些代码来解析网页中不同的产品名称。如果使浏览器向下滚动,则几乎看不到“加载更多”按钮。如果页面向下滚动,直到没有可单击的“加载更多”按钮,则该网页将显示其全部内容。我的刮刀似乎做得很好,但我没有得到所有的结果。该页面中有大约200种产品,但我从中获得了90种。我应该在我的刮板上做些什么改变才能把它们都弄到手?提前谢谢 我正在处理的网页: 这是我正在尝试的脚本: import time from selenium import webdriver f

我已经用python结合selenium编写了一些代码来解析网页中不同的产品名称。如果使浏览器向下滚动,则几乎看不到“加载更多”按钮。如果页面向下滚动,直到没有可单击的“加载更多”按钮,则该网页将显示其全部内容。我的刮刀似乎做得很好,但我没有得到所有的结果。该页面中有大约200种产品,但我从中获得了90种。我应该在我的刮板上做些什么改变才能把它们都弄到手?提前谢谢

我正在处理的网页:

这是我正在尝试的脚本:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("put_above_url_here")
wait = WebDriverWait(driver, 10)

page = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,".listing_item")))
for scroll in range(17):
    page.send_keys(Keys.PAGE_DOWN)
    time.sleep(2)
    try:
        load = driver.find_element_by_css_selector(".lm-btm")
        load.click()
    except Exception:
        pass

for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[id^=item_]"))):
    name = item.find_element_by_css_selector(".pro-name.el2").text
    print(name)
driver.quit()

请尝试以下代码以获取所需数据:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.purplle.com/search?q=hair%20fall%20shamboo")
wait = WebDriverWait(driver, 10)

header = driver.find_element_by_tag_name("header")
driver.execute_script("arguments[0].style.display='none';", header)

while True:

    try:
        page = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".listing_item")))
        driver.execute_script("arguments[0].scrollIntoView();", page)
        page.send_keys(Keys.END)
        load = wait.until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "LOAD MORE")))
        driver.execute_script("arguments[0].scrollIntoView();", load)
        load.click()
        wait.until(EC.staleness_of(load))
    except:
        break

for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[id^=item_]"))):
    name = item.find_element_by_css_selector(".pro-name.el2").text
    print(name)
driver.quit()

您只能在万不得已的情况下使用硒

在网页中简单地看一下,就会发现它调用了API来获取您的数据

它返回一个包含所有详细信息的JSON输出:

您现在可以轻松地循环并存储在数据帧中


速度非常快,错误比selenium少。

为什么你总是那么准确@Andersson爵士?它完美地完成了任务。仅供参考,最近我学到了一些你可能喜欢的东西。只要有
scrollIntoView
的选项,就可以使用
page.location
load.location
而不是
driver.execute_脚本(“参数[0]。scrollIntoView();”,page)
或后者来实现。有一件事需要知道,先生:我无法理解
标题部分。有必要吗?谢谢你的一切,再一次,仅仅一个“喜欢”是不够的。我知道
location\u曾经滚动到\u视图中
打算滚动页面,但它似乎不再工作了。。。也许现在
location
属性也应该这样做。我试试看。谢谢至于页眉:页面的页眉是固定的,所以当你向下滚动页面到“加载更多”按钮时,它不可见,因为它被页眉覆盖,所以你不能点击它。避免使用带偏移量的滚动是一个小技巧……先生,最后要知道的一件事是:我是否应该总是这样使用
驱动程序。执行脚本(“参数[0]。style.display='none';”,header)
每当需要将
头设置为地标时,我的意思是
“参数[0]。style.display='none';”
part?这是使元素不可见的方法。如果您不想使标题完全不可见,也应该有办法将标题的属性
位置
的“固定”
更改为
的“绝对”
不,先生,这是绝对正确的。我只是想了解更多,这就是为什么我问了这么愚蠢的问题。谢谢Darshan Jadav,谢谢你的建议。事实上,我不是在寻找数据;更确切地说,我想通过编程打破障碍,达到完整的内容。只是好奇。。。你觉得这个怎么样?我正在使用Chrome,并使用网络选项卡查看流量,并查看您在上面发布的表单中是否存在XHR请求。你就是这样发现的吗?如果XHR请求的内容不止一个,您如何找到合适的?你只是一次打开一个直到找到合适的吗?谢谢。你可以在网络>xhr中找到。当您将鼠标悬停在由xhr生成的左侧栏中的链接上时,重新加载页面后,您可以看到一些与您正在使用@JeffC玩的链接或多或少相似的链接。点击这些,找到正确的一个。就这样。这里有一个例子:我想补充托普托的评论,就是这样做的。但有时,如果有更多的请求,您必须复制该请求的请求头;在该窗口中有一个“预览”选项卡,单击该选项卡,它将显示获取的数据。谢谢