如何使用Scrapy和Splash爬行LeetCode

时间:2019-01-01 11:37:50

标签: python scrapy splash

我是Python和Spider的新手。我现在正在尝试使用Scrapy和Splash来爬行用js呈现的动态页面,例如从https://leetcode.com/problemset/all/爬行问题。

但是当我在https://leetcode.com/problems/two-sum/中使用response.xpath(“ // div [@ class ='css-1ponsav']”)时,似乎没有任何信息。 同样,在登录界面https://leetcode.com/accounts/login/中,当您尝试调用SplashFormRequest.from_response(response,...)进行登录时,它将返回ValueError:在<200>中找不到元素。

我对前端了解不多。我不知道与LeetCode使用的graphQL有什么关系。还是其他原因?

这是代码。

# -*- 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 :(得分:1)

我对Splash不太熟悉,但是可以通过查看“网络”选项卡下的XHR过滤器以查找生成这些输出的POST或GET响应来抓取98%的Javascript生成的网站。

在您的情况下,我看到有一个响应可以生成整个页面,而无需任何特殊的查询参数或API密钥。