scrapy 从网页中提取隐藏链接

y3bcpkx1  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(142)

请检查此链接https://maroof.sa/businesses
这是一个网站的链接,我想从中提取链接。
例如,如果你向下滚动,你会发现一个商店的名称“Marwa商店”,如果你点击这张卡,这将重定向到商店页面
现在我需要报废的页面中的所有链接“https://maroof.sa/businesses“商店
经过检查,我发现它被藏在
我已经成功提取商店名称,但我找不到链接
thanks in advance

import time
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium import webdriver
from scrapy import Selector
import csv
driver = webdriver.Chrome()
driver.get(url="https://maroof.sa/businesses")
html = driver.page_source
names = driver.find_elements(By.CSS_SELECTOR , 'div.storeCard')

字符串

fhg3lkii

fhg3lkii1#

从card info中获取业务细节是不可能的,但是,它可以通过从url部分为business/search的请求中获取数据来构建。
业务链接可以通过模式{url}/details/{id}构建,其中id可以从响应json对象items获取。
您可以使用Chrome开发工具协议获得所需的响应,该协议现已在Selenium中提供。
此外,网站有反报废机制,它不加载每次为我,所以你需要使用代理/未检测到的 selenium /等我添加了一些隐形Chrome选项,但它并没有帮助每次避免机器人检测机制(网站认为,我是一个机器人,即使在普通浏览器,所以我认为他们的机器人检测是坏的)。

import json
import time

from selenium import webdriver

options = webdriver.ChromeOptions()
options.set_capability('goog:loggingPrefs', {'performance': 'ALL'})

def enable_stealth():
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-gpu")
    options.add_argument('--disable-blink-features=AutomationControlled')
    options.add_argument('--disable-dev-shm-usage')
    options.add_experimental_option("useAutomationExtension", False)
    options.add_argument("--enable-javascript")
    options.add_argument("--enable-cookies")
    options.add_argument('--disable-web-security')
    options.add_experimental_option("excludeSwitches", ["enable-automation"])

enable_stealth()
driver = webdriver.Chrome(options)
url = "https://maroof.sa/businesses"
driver.get(url)
logs = driver.get_log("performance")
time.sleep(5)
target_url = 'business/search'

def get_links():
    for log in logs:
        message = log["message"]
        if "Network.responseReceived" not in message:
            continue
        params = json.loads(message)["message"].get("params")
        if params is None:
            continue
        response = params.get("response")
        if response is None or target_url not in response["url"]:
            continue
        body = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': params["requestId"]})
        items = json.loads(body['body'])['items']
        for item in items:
            link = f"{url}/details/{item['id']}"
            print(link)

get_links()

字符串

相关问题