Trang JavaScript quét web bằng Python


178

Tôi đang cố gắng phát triển một trình quét web đơn giản. Tôi muốn trích xuất văn bản mà không cần mã HTML. Trên thực tế, tôi đã đạt được mục tiêu này, nhưng tôi đã thấy rằng trong một số trang tải JavaScript, tôi đã không thu được kết quả tốt.

Ví dụ: nếu một số mã JavaScript thêm một số văn bản, tôi không thể nhìn thấy nó, bởi vì khi tôi gọi

response = urllib2.urlopen(request)

Tôi nhận được văn bản gốc mà không cần thêm văn bản (vì JavaScript được thực thi trong máy khách).

Vì vậy, tôi đang tìm kiếm một số ý tưởng để giải quyết vấn đề này.


2
Âm thanh như bạn có thể cần một cái gì đó nặng hơn, hãy thử Selenium hoặc Watir.
wim

2
Tôi đã thực hiện thành công điều này trong Java (Tôi đã sử dụng bộ công cụ Cobra lobobrowser.org/cobra.jsp ) Vì bạn muốn hack trong python (luôn là một lựa chọn tốt) Tôi khuyên bạn nên sử dụng hai tùy chọn sau: - packtpub.com/article/ web-scraping-with-python-part-2 - blog.databigbang.com/web-scraping-ajax-and-javascript-sites
bpgergo

Câu trả lời:


203

EDIT 30/12/2017: Câu trả lời này xuất hiện trong kết quả tìm kiếm hàng đầu của Google, vì vậy tôi quyết định cập nhật nó. Câu trả lời cũ vẫn còn ở cuối.

Dryscape không được duy trì nữa và các nhà phát triển thư viện Dryscape khuyên dùng chỉ là Python 2. Tôi đã tìm thấy bằng cách sử dụng thư viện python của Selenium với Phantom JS làm trình điều khiển web đủ nhanh và dễ dàng hoàn thành công việc.

Khi bạn đã cài đặt Phantom JS , hãy đảm bảo rằng phantomjstệp nhị phân có sẵn trong đường dẫn hiện tại:

phantomjs --version
# result:
2.1.1

Thí dụ

Để đưa ra một ví dụ, tôi đã tạo một trang mẫu với mã HTML sau đây. ( liên kết ):

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Javascript scraping test</title>
</head>
<body>
  <p id='intro-text'>No javascript support</p>
  <script>
     document.getElementById('intro-text').innerHTML = 'Yay! Supports javascript';
  </script> 
</body>
</html>

không có javascript, nó nói: No javascript supportvà với javascript:Yay! Supports javascript

Cạo mà không có hỗ trợ JS:

import requests
from bs4 import BeautifulSoup
response = requests.get(my_url)
soup = BeautifulSoup(response.text)
soup.find(id="intro-text")
# Result:
<p id="intro-text">No javascript support</p>

Quét với hỗ trợ JS:

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get(my_url)
p_element = driver.find_element_by_id(id_='intro-text')
print(p_element.text)
# result:
'Yay! Supports javascript'

Bạn cũng có thể sử dụng thư viện Python khô để quét các trang web điều khiển javascript.

Quét với hỗ trợ JS:

import dryscrape
from bs4 import BeautifulSoup
session = dryscrape.Session()
session.visit(my_url)
response = session.body()
soup = BeautifulSoup(response)
soup.find(id="intro-text")
# Result:
<p id="intro-text">Yay! Supports javascript</p>

16
Đáng buồn thay, không hỗ trợ Windows.
Expenzor

1
Bất kỳ lựa chọn thay thế cho những người trong chúng ta lập trình trong Windows?
Hoshiko86

2
@ExpenzorTôi đang làm việc trên windows. PhantomJS hoạt động tốt.
Aakash Choubey

17
Đáng chú ý PhantomJS đã bị ngừng và không còn được phát triển tích cực trong bối cảnh Chrome hiện đang hỗ trợ không đầu. Nên sử dụng chrome / firefox không đầu.
sytech

3
Đó là cả hỗ trợ selen và chính PhantomJS. github.com/ariya/ph
Phantomjs/issues/15344

73

Chúng tôi không nhận được kết quả chính xác vì bất kỳ nội dung javascript nào cần được hiển thị trên DOM. Khi chúng tôi tìm nạp một trang HTML, chúng tôi sẽ tìm nạp ban đầu, không được sửa đổi bởi javascript, DOM.

Do đó, chúng tôi cần hiển thị nội dung javascript trước khi thu thập dữ liệu trang.

Vì selen đã được đề cập nhiều lần trong chủ đề này (và đôi khi nó cũng được đề cập đến chậm), tôi sẽ liệt kê hai giải pháp khả thi khác.


Giải pháp 1: Đây là một hướng dẫn rất hay về cách sử dụng Scrapy để thu thập dữ liệu nội dung được tạo bằng javascript và chúng tôi sẽ làm theo điều đó.

Những gì chúng ta sẽ cần:

  1. Docker được cài đặt trong máy của chúng tôi. Đây là một điểm cộng so với các giải pháp khác cho đến thời điểm này, vì nó sử dụng nền tảng độc lập với hệ điều hành.

  2. Cài đặt Splash theo hướng dẫn được liệt kê cho HĐH tương ứng của chúng tôi.
    Trích dẫn từ tài liệu giật gân:

    Splash là một dịch vụ kết xuất javascript. Đó là một trình duyệt web nhẹ với API HTTP, được triển khai trong Python 3 bằng cách sử dụng Twisted và QT5.

    Về cơ bản, chúng tôi sẽ sử dụng Splash để hiển thị nội dung được tạo bởi Javascript.

  3. Chạy máy chủ giật gân : sudo docker run -p 8050:8050 scrapinghub/splash.

  4. Cài đặt scrapy-splash plugin:pip install scrapy-splash

  5. Giả sử rằng chúng tôi đã có một dự án Phế liệu được tạo (nếu không, hãy tạo một dự án ), chúng tôi sẽ làm theo hướng dẫn và cập nhật settings.py:

    Sau đó đi đến dự án phế liệu của bạn settings.pyvà thiết lập các phần mềm trung gian này:

    DOWNLOADER_MIDDLEWARES = {
          'scrapy_splash.SplashCookiesMiddleware': 723,
          'scrapy_splash.SplashMiddleware': 725,
          'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }

    URL của máy chủ Splash (nếu bạn đang sử dụng Win hoặc OSX thì đây phải là URL của máy docker: Làm cách nào để lấy địa chỉ IP của Docker chứa từ máy chủ? ):

    SPLASH_URL = 'http://localhost:8050'

    Và cuối cùng bạn cũng cần đặt các giá trị này:

    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
  6. Cuối cùng, chúng ta có thể sử dụng một SplashRequest:

    Trong một con nhện bình thường, bạn có các đối tượng Yêu cầu mà bạn có thể sử dụng để mở URL. Nếu trang bạn muốn mở chứa dữ liệu do JS tạo, bạn phải sử dụng SplashRequest (hoặc SplashFormRequest) để hiển thị trang. Đây là một ví dụ đơn giản:

    class MySpider(scrapy.Spider):
        name = "jsscraper"
        start_urls = ["http://quotes.toscrape.com/js/"]
    
        def start_requests(self):
            for url in self.start_urls:
            yield SplashRequest(
                url=url, callback=self.parse, endpoint='render.html'
            )
    
        def parse(self, response):
            for q in response.css("div.quote"):
            quote = QuoteItem()
            quote["author"] = q.css(".author::text").extract_first()
            quote["quote"] = q.css(".text::text").extract_first()
            yield quote

    SplashRequest kết xuất URL dưới dạng html và trả về phản hồi mà bạn có thể sử dụng trong phương thức gọi lại (phân tích cú pháp).


Giải pháp 2: Hãy gọi thử nghiệm này vào lúc này (tháng 5 năm 2018) ...
Giải pháp này chỉ dành cho phiên bản 3.6 của Python (tại thời điểm này).

Bạn có biết mô-đun yêu cầu (ai không làm)?
Bây giờ nó có một trang web thu thập thông tin anh chị em: request-HTML :

Thư viện này dự định làm cho phân tích cú pháp HTML (ví dụ: quét web) đơn giản và trực quan nhất có thể.

  1. Cài đặt yêu cầu-html: pipenv install requests-html

  2. Yêu cầu url của trang:

    from requests_html import HTMLSession
    
    session = HTMLSession()
    r = session.get(a_page_url)
  3. Kết xuất phản hồi để nhận các bit được tạo bởi Javascript:

    r.html.render()

Cuối cùng, mô-đun dường như cung cấp khả năng cạo .
Ngoài ra, chúng ta có thể thử cách sử dụng BeautifulSoup với tài liệu mà r.htmlchúng ta vừa kết xuất.


bạn có thể mở rộng làm thế nào để có được nội dung HTML đầy đủ, với các bit JS được tải, sau khi gọi .render () không? Tôi bị mắc kẹt sau thời điểm đó. Tôi không thấy tất cả các iframe được đưa vào trang thông thường từ JavaScript trong r.html.htmlđối tượng.
anon58192932

@ anon58192932 Vì hiện tại đây là một giải pháp thử nghiệm và tôi không biết chính xác những gì bạn đang cố gắng đạt được, tôi thực sự không thể đề xuất bất cứ điều gì ... Bạn có thể tạo một câu hỏi mới ở đây trên SO nếu bạn chưa đã tìm ra một giải pháp chưa
John Moutafis

2
Tôi đã gặp lỗi này: RuntimeError: Không thể sử dụng HTMLSession trong vòng lặp sự kiện hiện có. Sử dụng AsyncHTMLSession thay thế.
HuckIt

1
@Huck Đây có vẻ là một vấn đề được biết đến: github.com/psf/requests-html/issues/140
John Moutafis

47

Có lẽ selen có thể làm điều đó.

from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get(url)
time.sleep(5)
htmlSource = driver.page_source

3
Selenium thực sự rất nặng đối với loại điều này, nó sẽ chậm một cách không cần thiết và yêu cầu một trình duyệt nếu bạn không sử dụng PhantomJS, nhưng điều này sẽ hoạt động.
Joshua Hedges

@JoshuaHedges Bạn có thể chạy các trình duyệt tiêu chuẩn khác ở chế độ không đầu.
reynoldsnlp

22

Nếu bạn đã từng sử dụng Requestsmô-đun cho python trước đây, gần đây tôi phát hiện ra rằng nhà phát triển đã tạo ra một mô-đun mới gọi làRequests-HTML mà giờ đây cũng có khả năng hiển thị JavaScript.

Bạn cũng có thể truy cập https://html.python-requests.org/ để tìm hiểu thêm về mô-đun này hoặc nếu bạn chỉ quan tâm đến việc hiển thị JavaScript thì bạn có thể truy cập https://html.python-requests.org/?#javascript -ủng hộ để trực tiếp tìm hiểu cách sử dụng mô-đun để kết xuất JavaScript bằng Python.

Về cơ bản, khi bạn cài đặt chính xác Requests-HTMLmô-đun, ví dụ sau, được hiển thị trên liên kết ở trên , cho thấy cách bạn có thể sử dụng mô-đun này để cạo trang web và hiển thị JavaScript có trong trang web:

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('http://python-requests.org/')

r.html.render()

r.html.search('Python 2 will retire in only {months} months!')['months']

'<time>25</time>' #This is the result.

Gần đây tôi đã biết về điều này từ một video YouTube. Bấm vào đây!để xem video YouTube, cho thấy cách thức hoạt động của mô-đun.


3
Cần lưu ý rằng mô-đun này chỉ hỗ trợ cho Python 3.6.
nat5142

1
Tôi đã gặp lỗi này: SSLError: HTTPSConnectionPool (host = 'docs.python-requests.org', port = 443): Max đã thử lại vượt quá với url: / (Nguyên nhân là do SSLError (SSLError (1, '[SSL: TLSV1_ALERT_TER) lỗi nội bộ (_ssl.c: 1045) ')))
HuckIt

Các ứng dụng @HuckIt Tôi không quen với lỗi đó, tuy nhiên lỗi có vẻ như, trang web bạn đang cố truy cập có thể có vấn đề liên quan đến chứng nhận SSL. Xin lỗi, đây không phải là một giải pháp, nhưng tôi khuyên bạn nên đặt một câu hỏi mới, ở đây trong ngăn xếp tràn (nếu nó chưa được hỏi) và có thể cung cấp thêm chi tiết như url trang web bạn đang sử dụng và mã của bạn.
SShah

Có vẻ như đang sử dụng crom dưới mui xe. Hoạt động tuyệt vời cho tôi mặc dù
Sid

14

Đây dường như cũng là một giải pháp tốt, được lấy từ một bài đăng blog tuyệt vời

import sys  
from PyQt4.QtGui import *  
from PyQt4.QtCore import *  
from PyQt4.QtWebKit import *  
from lxml import html 

#Take this class for granted.Just use result of rendering.
class Render(QWebPage):  
  def __init__(self, url):  
    self.app = QApplication(sys.argv)  
    QWebPage.__init__(self)  
    self.loadFinished.connect(self._loadFinished)  
    self.mainFrame().load(QUrl(url))  
    self.app.exec_()  

  def _loadFinished(self, result):  
    self.frame = self.mainFrame()  
    self.app.quit()  

url = 'http://pycoders.com/archive/'  
r = Render(url)  
result = r.frame.toHtml()
# This step is important.Converting QString to Ascii for lxml to process

# The following returns an lxml element tree
archive_links = html.fromstring(str(result.toAscii()))
print archive_links

# The following returns an array containing the URLs
raw_links = archive_links.xpath('//div[@class="campaign"]/a/@href')
print raw_links

12

Có vẻ như dữ liệu bạn thực sự tìm kiếm có thể được truy cập thông qua URL thứ cấp được gọi bởi một số javascript trên trang chính.

Mặc dù bạn có thể thử chạy javascript trên máy chủ để xử lý việc này, nhưng cách tiếp cận đơn giản hơn có thể là tải trang bằng Firefox và sử dụng một công cụ như Charles hoặc Fireorms để xác định chính xác URL phụ đó là gì. Sau đó, bạn có thể chỉ cần truy vấn URL đó trực tiếp cho dữ liệu bạn quan tâm.


@Kris Chỉ trong trường hợp bất kỳ ai vấp phải điều này và muốn thử nó thay vì thứ gì đó nặng như selenium, đây là một ví dụ ngắn. Điều này sẽ mở trang chi tiết một phần cho một hex hex trên trang web McMaster-Carr. Nội dung trang web của họ chủ yếu được tìm nạp bằng Javascript và có rất ít thông tin trang gốc. Nếu bạn mở các công cụ dành cho nhà phát triển trình duyệt, điều hướng đến tab Mạng và làm mới trang, bạn có thể thấy tất cả các yêu cầu được tạo bởi trang và tìm dữ liệu liên quan (trong trường hợp này là chi tiết phần html).
SweepingsDemon

Đây là một url khác được tìm thấy trong tab Mạng devtool của Firefox, nếu được theo dõi, chứa html cho hầu hết các thông tin phần và hiển thị một số tham số cần thiết để dễ dàng điều hướng đến thông tin phần khác để dễ dàng quét hơn. Ví dụ cụ thể này không đặc biệt hữu ích vì giá được tạo bởi một chức năng Javascript khác, nhưng sẽ phục vụ đủ tốt để giới thiệu cho bất kỳ ai muốn làm theo lời khuyên của Stephen.
SweepingsDemon

12

Selenium là thứ tốt nhất để loại bỏ nội dung JS và Ajax.

Kiểm tra bài viết này để trích xuất dữ liệu từ web bằng Python

$ pip install selenium

Sau đó tải xuống Chrome webroll.

from selenium import webdriver

browser = webdriver.Chrome()

browser.get("https://www.python.org/")

nav = browser.find_element_by_id("mainnav")

print(nav.text)

Dễ thôi phải không?


8

Bạn cũng có thể thực thi javascript bằng cách sử dụng webdo.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get(url)
driver.execute_script('document.title')

hoặc lưu trữ giá trị trong một biến

result = driver.execute_script('var text = document.title ; return var')

hoặc bạn chỉ có thể sử dụng driver.titletài sản
Corey Goldberg

7

Cá nhân tôi thích sử dụng phế liệu và selen và neo cả hai trong các thùng chứa riêng biệt. Bằng cách này, bạn có thể cài đặt cả hai với rắc rối tối thiểu và thu thập dữ liệu các trang web hiện đại mà hầu như tất cả đều chứa javascript ở dạng này hay dạng khác. Đây là một ví dụ:

Sử dụng scrapy startprojectđể tạo cạp và viết con nhện của bạn, bộ xương có thể đơn giản như thế này:

import scrapy


class MySpider(scrapy.Spider):
    name = 'my_spider'
    start_urls = ['https://somewhere.com']

    def start_requests(self):
        yield scrapy.Request(url=self.start_urls[0])


    def parse(self, response):

        # do stuff with results, scrape items etc.
        # now were just checking everything worked

        print(response.body)

Phép thuật thực sự xảy ra trong phần mềm trung gian. Ghi đè hai phương thức trong phần mềm trung gian của trình tải xuống __init__process_request, theo cách sau:

# import some additional modules that we need
import os
from copy import deepcopy
from time import sleep

from scrapy import signals
from scrapy.http import HtmlResponse
from selenium import webdriver

class SampleProjectDownloaderMiddleware(object):

def __init__(self):
    SELENIUM_LOCATION = os.environ.get('SELENIUM_LOCATION', 'NOT_HERE')
    SELENIUM_URL = f'http://{SELENIUM_LOCATION}:4444/wd/hub'
    chrome_options = webdriver.ChromeOptions()

    # chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
    self.driver = webdriver.Remote(command_executor=SELENIUM_URL,
                                   desired_capabilities=chrome_options.to_capabilities())


def process_request(self, request, spider):

    self.driver.get(request.url)

    # sleep a bit so the page has time to load
    # or monitor items on page to continue as soon as page ready
    sleep(4)

    # if you need to manipulate the page content like clicking and scrolling, you do it here
    # self.driver.find_element_by_css_selector('.my-class').click()

    # you only need the now properly and completely rendered html from your page to get results
    body = deepcopy(self.driver.page_source)

    # copy the current url in case of redirects
    url = deepcopy(self.driver.current_url)

    return HtmlResponse(url, body=body, encoding='utf-8', request=request)

Đừng quên bật phần mềm trung gian này bằng cách bỏ ghi chú các dòng tiếp theo trong tệp settings.txt:

DOWNLOADER_MIDDLEWARES = {
'sample_project.middlewares.SampleProjectDownloaderMiddleware': 543,}

Tiếp theo cho dockerization. Tạo ảnh của bạn Dockerfiletừ một hình ảnh nhẹ (Tôi đang sử dụng python Alpine tại đây), sao chép thư mục dự án của bạn vào đó, yêu cầu cài đặt:

# Use an official Python runtime as a parent image
FROM python:3.6-alpine

# install some packages necessary to scrapy and then curl because it's  handy for debugging
RUN apk --update add linux-headers libffi-dev openssl-dev build-base libxslt-dev libxml2-dev curl python-dev

WORKDIR /my_scraper

ADD requirements.txt /my_scraper/

RUN pip install -r requirements.txt

ADD . /scrapers

Và cuối cùng kết hợp tất cả lại với nhau trong docker-compose.yaml:

version: '2'
services:
  selenium:
    image: selenium/standalone-chrome
    ports:
      - "4444:4444"
    shm_size: 1G

  my_scraper:
    build: .
    depends_on:
      - "selenium"
    environment:
      - SELENIUM_LOCATION=samplecrawler_selenium_1
    volumes:
      - .:/my_scraper
    # use this command to keep the container running
    command: tail -f /dev/null

Chạy đi docker-compose up -d. Nếu bạn đang làm điều này lần đầu tiên, sẽ mất một lúc để nó tìm nạp selenium / độc lập-chrome mới nhất và xây dựng hình ảnh cạp của bạn.

Khi đã xong, bạn có thể kiểm tra xem các thùng chứa của bạn có đang chạy không docker psvà cũng kiểm tra xem tên của thùng chứa selen có khớp với biến môi trường mà chúng ta đã chuyển đến thùng chứa cạp không (ở đây, nó làSELENIUM_LOCATION=samplecrawler_selenium_1 ).

Nhập bộ chứa cạp của bạn với docker exec -ti YOUR_CONTAINER_NAME sh, lệnh cho tôi là docker exec -ti samplecrawler_my_scraper_1 sh, cd vào thư mục bên phải và chạy bộ cạp của bạn với scrapy crawl my_spider.

Toàn bộ điều này nằm trên trang github của tôi và bạn có thể lấy nó từ đây


5

Một kết hợp của BeautifulSoup và Selenium hoạt động rất tốt đối với tôi.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup as bs

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
    try:
        element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))) #waits 10 seconds until element is located. Can have other wait conditions  such as visibility_of_element_located or text_to_be_present_in_element

        html = driver.page_source
        soup = bs(html, "lxml")
        dynamic_text = soup.find_all("p", {"class":"class_name"}) #or other attributes, optional
    else:
        print("Couldnt locate element")

PS Bạn có thể tìm thêm điều kiện chờ ở đây


4

Bạn sẽ muốn sử dụng trình điều khiển web urllib, request, beautifulSoup và selenium trong tập lệnh của mình cho các phần khác nhau của trang, (để đặt tên một vài).
Đôi khi bạn sẽ nhận được những gì bạn cần chỉ với một trong những mô-đun này.
Đôi khi bạn sẽ cần hai, ba hoặc tất cả các mô-đun này.
Đôi khi bạn sẽ cần tắt js trên trình duyệt của mình.
Đôi khi bạn sẽ cần thông tin tiêu đề trong kịch bản của bạn.
Không có trang web nào có thể được loại bỏ theo cùng một cách và không có trang web nào có thể được quét theo cùng một cách mãi mãi mà không phải sửa đổi trình thu thập thông tin của bạn, thường là sau một vài tháng. Nhưng tất cả đều có thể bị loại bỏ! Nơi nào có ý chí chắc chắn sẽ có cách. Chỉ cần tiếp tục tìm kiếm cách thử những gì với các mô-đun này, sao chép và dán lỗi của bạn vào Google.
Nếu bạn cần quét dữ liệu liên tục trong tương lai, chỉ cần cạo mọi thứ bạn cần và lưu trữ nó trong các tệp .dat với dưa chua.


3

Sử dụng PyQt5

from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtWebEngineWidgets import QWebEnginePage
import sys
import bs4 as bs
import urllib.request


class Client(QWebEnginePage):
    def __init__(self,url):
        global app
        self.app = QApplication(sys.argv)
        QWebEnginePage.__init__(self)
        self.html = ""
        self.loadFinished.connect(self.on_load_finished)
        self.load(QUrl(url))
        self.app.exec_()

    def on_load_finished(self):
        self.html = self.toHtml(self.Callable)
        print("Load Finished")

    def Callable(self,data):
        self.html = data
        self.app.quit()

# url = ""
# client_response = Client(url)
# print(client_response.html)

1

Tôi đã cố gắng tìm câu trả lời cho câu hỏi này trong hai ngày. Nhiều câu trả lời hướng bạn đến các vấn đề khác nhau. Nhưng câu trả lời của serpentr ở trên thực sự là vấn đề. Đó là giải pháp ngắn nhất, đơn giản nhất. Chỉ cần một lời nhắc nhở từ cuối cùng "var" đại diện cho tên biến , vì vậy nên được sử dụng như:

 result = driver.execute_script('var text = document.title ; return text')

Đây phải là một nhận xét về câu trả lời của serpentr, không phải là một câu trả lời riêng biệt.
Yserbius

1
Đó là hiển nhiên. Nhưng tôi chưa có 50 đại diện để bình luận về câu trả lời của người khác.
Abd_bgc

0

Tôi đã phải đối phó với vấn đề tương tự này trên một số dự án quét web của riêng tôi. Cách tôi xử lý bằng cách sử dụng thư viện yêu cầu python để thực hiện một yêu cầu http trực tiếp tới API, thay vì phải tải JS.

Thư viện yêu cầu python hoạt động tốt cho việc này và bạn có thể thấy các yêu cầu http bằng cách sử dụng phần tử kiểm tra và điều hướng đến tab mạng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.