Python 如何在使用无限滚动加载的页面中刮取完整列表,其中每次请求的URL都是相同的

Python 如何在使用无限滚动加载的页面中刮取完整列表,其中每次请求的URL都是相同的,python,web-scraping,scrapy,infinite-scroll,Python,Web Scraping,Scrapy,Infinite Scroll,我仍然在做我最初的几个零碎的项目,我发现这个网站有一个无限长的卷轴,其中请求的URL每次都是相同的。我曾试图寻找解决方案,但我读到的所有材料都涉及带有一些区别的URL页面号、文本等。我该如何提取从中产生的所有名称https://www.baincapital.com/people. 我已经找到了我的选择器等,但它只是返回最初可见的信息。任何帮助都将不胜感激。 到目前为止,我的代码是: import scrapy from scrapy_splash import SplashRequest

我仍然在做我最初的几个零碎的项目,我发现这个网站有一个无限长的卷轴,其中请求的URL每次都是相同的。我曾试图寻找解决方案,但我读到的所有材料都涉及带有一些区别的URL页面号、文本等。我该如何提取从中产生的所有名称https://www.baincapital.com/people. 我已经找到了我的选择器等,但它只是返回最初可见的信息。任何帮助都将不胜感激。 到目前为止,我的代码是:

import scrapy
from scrapy_splash import SplashRequest


class BainPeople(scrapy.Spider):
    name = 'BainPeop'
    start_urls = [
    'https://www.baincapital.com/people'
    ]

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url, callback = self.parse, args={"wait" : 3})

    def parse(self, response):
        name = response.css('h4 span::text').extract()
        links = response.css('div.col-xs-6.col-sm-4.col-md-6.col-lg-3.grid.staff a::attr(href)').extract()

        yield {'name' : name}
更新代码:

import scrapy
from selenium import webdriver

class BainpeopleSpider(scrapy.Spider):
    name = 'bainpeople'
    allowed_domains = ['https://www.baincapital.com/people']
    start_urls = ['http://www.baincapital.com/people/']


    def parse(self, response):
        driver = webdriver.Chrome(executable_path='C:/Users/uchit.madhok/Downloads/chromedriver_win32/chromedriver')
        driver.get('http://www.baincapital.com/people/')


        name = driver.find_elements_by_css_selector("h4 span").text
        links = driver.find_elements_by_css_selector('div.col-xs-6.col-sm-4.col-md-6.col-lg-3.grid.staff a').attr(href)

        yield {
        'name' : name
        'links' : links
        }

        driver.close()
最终代码:

import scrapy
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

class BainpeopleSpider(scrapy.Spider):
    name = 'bainpeople'
    allowed_domains = ['baincapital.com']
    start_urls = ['http://www.baincapital.com/people/']

    def parse(self, response):
        browser = webdriver.Chrome(executable_path='C:/Users/uchit.madhok/Downloads/chromedriver_win32/chromedriver')
        browser.get('http://www.baincapital.com/people/')

        elm = browser.find_element_by_tag_name('html')
        i = 30

        while i>0:
            elm.send_keys(Keys.END)
            time.sleep(8)
            elm.send_keys(Keys.HOME)
            i = i-1


        links = list(map(lambda x: x.get_attribute('href'), browser.find_elements_by_css_selector('div.col-xs-6.col-sm-4.col-md-6.col-lg-3.grid.staff a')))
        for j in links:
            yield response.follow(str(j), callback = self.parse_detail)

    def parse_detail(self, response):
        name = response.css('h1.pageTitle::text').extract()
        title = response.css('div.__location::text')[0].extract()
        team = response.css('div.__location::text')[1].extract()
        location = response.css('div.__location::text')[2].extract()
        about = response.css('div.field-item.even p::text').extract()
        sector = response.css('ul.focus_link a::text').extract()

        yield {
        'name' : name,
        'title' : title,
        'team' : team,
        'location' : location,
        'about' : about,
        'sector' : sector
        }

你试图做的事情可能是不可能单独使用Scrapy的。访问动态数据是一个众所周知的问题,但幸运的是有解决方案。其中之一是硒。在这里,您可以看到如何使用它访问页面中的动态数据,以及如何将其与Scrapy集成:

好的,所以我尝试使用Selenium进行此操作,但我仍然无法获得我正在寻找的结果,并且我非常确定我使用的选择器有问题。当我使用驱动程序时。通过css选择器“h4 span”查找元素。文本我从列表中只得到一个名称,当我将其更改为驱动程序时。通过css选择器“h4 span”查找元素。文本我得到一个错误,说列表对象没有名为text的属性。运行代码时,chrome浏览器会弹出并关闭,所以我知道运行正常@Łukasz KarczewskiYeah,你应该这样做:maplambda x:x.text,driver.find_elements_by_css_selector'h4 span'我试过运行它,但没有出现错误,尽管没有刮取任何东西名称“:如果你想让它更具可读性,你需要这样做:listmaplambda x:x.text,driver.find_elements_by_css_selector'h4 span'是的,这很有效,但是,我仍然只得到前16个可见名称的列表,而不是当你一直滚动到页面底部时显示的其余名称的列表。我想得到所有的100个名字,一旦你滚动到最后一个滚动出现。