Как использовать Scrapy и Splash для сканирования LeetCode - PullRequest
0 голосов
/ 01 января 2019

Я новичок в Python и Spider.Сейчас я пытаюсь использовать Scrapy и Splash для сканирования динамических страниц, отображаемых с помощью js, таких как проблемы сканирования с https://leetcode.com/problemset/all/.

Но когда я использую response.xpath ("// div [@ class = 'css-1ponsav '] ") в https://leetcode.com/problems/two-sum/, кажется, не получить никакой информации.Аналогично, в интерфейсе входа в систему https://leetcode.com/accounts/login/, когда вы пытаетесь вызвать SplashFormRequest.from_response (response, ...) для входа в систему, он возвращает ValueError: Элемент не найден в <200>.

Я не знаю много о внешнем интерфейсе.Я не знаю, есть ли какое-то отношение к graphQL, используемому LeetCode.Или по другим причинам?

Вот код.

# -*- coding: utf-8 -*-
import json
import scrapy
from scrapy import Request, Selector
from scrapy_splash import SplashRequest
from leetcode_problems.items import ProblemItem


class TestSpiderSpider(scrapy.Spider):
    name = 'test_spider'
    allowed_domains = ['leetcode.com']

    single_problem_url = "https://leetcode.com/problems/two-sum/"

    def start_requests(self):
        url = self.single_problem_url
        yield SplashRequest(url=url, callback=self.single_problem_parse, args={'wait': 2})

    def single_problem_parse(self, response):
        submission_page = response.xpath("//div[@data-key='submissions']/a/@href").extract_first()
        submission_text = response.xpath("//div[@data-key='submissions']//span[@class='title__qRnJ']").extract_first()
        print("submission_text:", end=' ')
        print(submission_text) #Print Nothing
        if submission_page:
            yield SplashRequest("https://leetcode.com" + submission_page, self.empty_parse, args={'wait': 2})

1 Ответ

0 голосов
/ 01 января 2019

Я не так хорошо знаком со Splash, но 98% веб-сайтов, созданных с помощью Javascript, можно удалить, просмотрев фильтр XHR на вкладке Сеть в поисках ответов POST или GET, которые генерируют эти выходные данные.

В вашем случае я вижу, что есть один ответ, который генерирует всю страницу без необходимости каких-либо специальных параметров запроса или ключей API.

...