簡體   English   中英

如何使用Scrapy和Splash爬行LeetCode

[英]How to use Scrapy and Splash to crawl LeetCode

我是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})

我對Splash不太熟悉,但是可以通過查看“網絡”選項卡下的XHR過濾器以查找生成這些輸出的POST或GET響應來抓取98%的Java生成的網站。

在您的情況下,我可以看到有一個響應可以生成整個頁面,而無需任何特殊的查詢參數或API密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM