Как очистить полный список на странице, загруженной с помощью бесконечной прокрутки, где запрашиваемый URL-адрес всегда одинаков - PullRequest
0 голосов
/ 05 февраля 2020

Я все еще делаю свои первые несколько проектов Scrapy, и я наткнулся на этот сайт с бесконечной прокруткой, где запрошенный URL-адрес всегда один и тот же. Я пытался найти решения, но все материалы, которые я прочитал, содержат URL-адреса с некоторым отличием (страница №, текст и т. Д. c). Как мне go извлечь все имена, которые приходят из https://www.baincapital.com/people. Я выяснил, мои селекторы и т. Д. c, но он просто возвращает первоначально видимую информацию. Любая помощь будет оценена. Пока мой код:

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}

Same URL request

Обновлен код:

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
        }

1 Ответ

1 голос
/ 05 февраля 2020

То, что вы пытаетесь сделать, возможно, невозможно, используя только Scrapy. Доступ к данным Dynami c является хорошо известной проблемой, но, к счастью, есть решения. Одним из них является Селен. Здесь вы можете увидеть, как их можно использовать для доступа к динамическим c данным со страницы и как интегрировать их с Scrapy: селен с scrapy для динамических c page

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...