无法从网页中抓取产品标题

2023-11-26

我正在尝试抓取此产品中可用的产品标题webpage使用请求模块,但脚本总是抛出AttributeError即使产品标题位于页面源代码中(ctrl + U).

我尝试过(throws AttributeError):

import requests
from bs4 import BeautifulSoup

link = 'https://www.cclonline.com/product/334427/GV-N3070AORUS-M-8GD-1-1/Graphics-Cards/Gigabyte-AORUS-GeForce-RTX-3070-MASTER-8GB-Overclocked-Graphics-Card-rev-1-1-/VGA5934/'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
}

res = requests.get(link, headers=headers)
soup = BeautifulSoup(res.text,"lxml")
try:
    product_title = soup.select_one("h1 > span").get_text(strip=True)
except AttributeError: product_title = ""
print(product_title)

预期输出:

Gigabyte GeForce RTX 3070 Aorus Master 8GB OC GPU

如何从该网页中抓取产品标题?

PS我尝试过这个库云楼也是如此,但没有运气。

EDIT:

这就是我得到的raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 403 Client Error: Forbidden for url当我运行以下代码时:

import cfscrape

url = 'https://www.cclonline.com/product/334427/GV-N3070AORUS-M-8GD-1-1/Graphics-Cards/Gigabyte-AORUS-GeForce-RTX-3070-MASTER-8GB-Overclocked-Graphics-Card-rev-1-1-/VGA5934/'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
}

token, agent = cfscrape.get_tokens(url, headers=headers)
print(token, agent)

我知道我可以利用的价值cf_clearance如果我可以从上面的尝试中获取令牌的值,则可以在 cookie 中访问页面内容。


这只是研究的占位符,可能对其他人有用Cloudflare 绕过 issue.

Use Case


从使用任一网站的网站上抓取信息Cloudflare CAPTCHA 或 Javascript 挑战以加强保护。

Python 请求


使用标准Python 请求.Get the 云耀服务将返回 403 Forbidden 错误代码。

import requests

URL = 'https://www.cclonline.com/product/334427/GV-N3070AORUS-M-8GD-1-1/Graphics-Cards/Gigabyte-AORUS-GeForce-RTX' \
      '-3070-MASTER-8GB-Overclocked-Graphics-Card-rev-1-1-/VGA5934/'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'}

response = requests.get(URL, headers=headers)
print(f'Status Code: {response.status_code}')
print(f'Status Code Reason: {response.reason}')
# output
Status Code: 403
Status Code Reason: Forbidden

如果我们看一下响应头我们可以看到云耀服务器正在将我们的请求代理到目标 URL。

...continued from the code above
for key, value in response.headers.items():
    print(f'KEY NAME: {key}')
    print(f'KEY VALUE: {value}')
    print('-----------------------')
    # output 
    KEY NAME: Date
    KEY VALUE: Sun, 13 Jun 2021 16:39:03 GMT
    -----------------------
    KEY NAME: Content-Type
    KEY VALUE: text/html; charset=UTF-8
    -----------------------
    KEY NAME: Transfer-Encoding
    KEY VALUE: chunked
    -----------------------
    KEY NAME: Connection
    KEY VALUE: close
    -----------------------
    KEY NAME: Permissions-Policy
    KEY VALUE: accelerometer=(),autoplay=(),camera=(),clipboard-read=(),clipboard-write=(),fullscreen=(),geolocation=(),gyroscope=(),hid=(),interest-cohort=(),magnetometer=(),microphone=(),payment=(),publickey-credentials-get=(),screen-wake-lock=(),serial=(),sync-xhr=(),usb=()
    -----------------------
    KEY NAME: Cache-Control
    KEY VALUE: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    -----------------------
    KEY NAME: Expires
    KEY VALUE: Thu, 01 Jan 1970 00:00:01 GMT
    -----------------------
    KEY NAME: X-Frame-Options
    KEY VALUE: SAMEORIGIN
    -----------------------
    KEY NAME: cf-request-id
    KEY VALUE: 0aa7d6c7c4000007ff7201b000000001
    -----------------------
    KEY NAME: Expect-CT
    KEY VALUE: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
    -----------------------
    KEY NAME: Set-Cookie
    KEY VALUE: __cf_bm=72427e2af66c7177feeb88a847fae9c26b66c681-1623602343-1800-AZAmqDfaHZU8IXOH/i3BBVf8pGcws0Gc1Tln5yKUepe3utWlCpagxvALDW6wiHd2pli9Zl45Mg8gC/QSoUFhoes=; path=/; expires=Sun, 13-Jun-21 17:09:03 GMT; domain=.cclonline.com; HttpOnly; Secure; SameSite=None
    -----------------------
    KEY NAME: Vary
    KEY VALUE: Accept-Encoding
    -----------------------
    KEY NAME: Server
    KEY VALUE: cloudflare
    -----------------------
    KEY NAME: CF-RAY
    KEY VALUE: 65ecc0b9383b07ff-ATL
    -----------------------
    KEY NAME: Content-Encoding
    KEY VALUE: gzip
    -----------------------

如果我们看一下响应.文本与相关的Python 请求我们可以看到与此相关的其他证据云耀保护。

...continued from the code above
print(response.text)
# output

truncated...

<title>Please Wait... | Cloudflare</title>
<meta name="captcha-bypass" id="captcha-bypass" />

truncated...

<form class="challenge-form managed-form" id="challenge-form" action="/product/334427/GV-N3070AORUS-M-8GD-1-1/Graphics-Cards/Gigabyte-AORUS-GeForce-RTX-3070-MASTER-8GB-Overclocked-Graphics-Card-rev-1-1-/VGA5934/?__cf_chl_managed_tk__=7d4597196bb14948881846ca16631b64c55f06d3-1623602854-0-AcX2yHJM2sCalL03Opq9RiFjASeYE0Xs0KG4XeG1lezzhzEyu-bL8xsdHuEjNIIKaJkWEmha4DhViRlqWEP_HREOdA8YAY7nnNkBAHbNMs6p_AWgYNLPnSNM13PO2I96hdABtoaaKjOzV4AyJQJ8f08XEW2flN97rPxIMeiR0tI1a3PiON2dN9E_YCyneAuCUfaYWUNGL0Bqd_rkYp3Ljb2zk_kGWizckr1fvhodSEjEB-ByYVK8ODNox2oZ4XPcmCYJ6UNDmbNc406BjMeTf3e72Z7vgdnt3V714VrGN4w_Y4VQ2X1V0OVKUKEH9B5Rxa_4fEZiMAAdxZ6idg69JYMKftuuLemr53n5WAwTwyX2G7N9jmjtarxEQcCqoj9oY7oSFwQTb3ZVb9i5EeavKaE1_67wxpyPybNidBDxhLazDEMefPZGDsV9mSziuIQ90nS5vn-7sUvC8BJATNWPbh6OduchXy-QcMeYhurtukUCm3oDQMP7r4g4qvDCWI3_-ku7u-B4G2XI2kwM_tLVEZiH5uHPjWpHE6eFWohiCTxd4p7vHg7z5ug9feRalYqu3GfInd82GZ-j-7nCqLDmPh2Sjlu6sJGfopqM3XlBrd1kgRZU3Z4uw6JIIqfH0M6K3_weTtem0-Z1zhDUBbVDvgJVeHNNh_bTxHGWbFB0f80tALBMbt67RftO5u1XBUZ-TRftteXBwJ8gmYzOZTo4lQOGQ_771urYXsTuW_sp8PwxvQpEyCnY8zD8dmVz0-waZhOet8MQMwduN2nfGUOrCMwUYO9McsBqzfsT5PJZVkDm-rYBBwqw0PIwvm1-N8ymAjrpSN6ps4FerqK1uQOo77FLiOq8JCOVqdETIZ9NO07A" method="POST" enctype="application/x-www-form-urlencoded">

truncated...

 <input type="hidden" name="r" value="d5db3eb87c9b42ec7f076916611c296abfd2c842-1623602854-0-AXz7+uyFGbpY1aOLgfZMm0oIiiepEo5I5QmdTnvMmL9fDUc4OMEa2CNYXsbHVjOzdYO+PqegjpNL8R3D9LhDc+Xo0y0ira1zO7foozPj0qdcUpNNr2ZOHqgUyKws6dVgeBNUdF+v9+eNFxSHxOhc4DWDLIw9guBqJg1GaBjG3QCQdZmyFbPxXUQtXTFmtVVuqch9qBFLa/u9deMBCxCWi5fyKoOINtyBtyT4p79ITb9T+6T7fl2epMXNHO6xBW2dPnDP1FmjUQ04CG3ydOaDS5qoSFMPr4InVbMcI2NbQYJYPfWjmncMaga6K+NMNvv8wtiyXpEeWsUgFFeQoDJEuvLI+wkI8mT+vXAnXd8LWy9TpEDVK6uxtLF2C75aU7qJxI9RKANGluWYUXeqE1tXgppgZraIGfRWNPVsQZzqd6SK+Zsg8x8UH7oRRD9blMMPMaekcFQ3zT8QQ5BzEc8wEQ68OhmKbFuAeV/YhhWshpm808gcVHIFH17I+0MEidfV/ny5wBSRZJyQUfOSU9iAv/minNWF6ZA21E/+Zebda2lVF6gyEHgrjecxuOxzY2I2qMm0RCEHO4oSk/X8EtMYirGCQ3FD8PzSvZYx+34QZutXFLVvqT3CR/UcsXybG6wllvIGvZ6j/gdoAwfcS27MyO4mXDMk6TfDqdi+NqlItwgWNdp461RQmPdChRp9kKEy3sTsIAGW9Ky1k/xYYcTvLDpCGFICBEm2JhDyp/FEF9UBYia7XJ4aUEncSUeViqaQ8bXpPk6kEPH5RYEcfaX3he0W5aZHHIGcjgOFZsuu45MWREvbHjO+RcPMib4L+lU1cKQoYx+w5b9e4AJiRnGog3a6E3i/L75bSnk7L3qA+DofeeccI/RPitqDb/lX31fkhwHfdRWoLt+OILsUfHNni/olGABEUDruwDVpR32xlieS7vekdmQL3oOu5BkAOXoObbb+2nzo6Dvgw7M7rb4muC7US4yCTK0BeGSfu2XvFta228IoGIGa8BjUcb09K6nRdWUwrCXLYS+vIJTegKMeyxlMKNXw7vIaPh9vht4zblhN0bqkN/m/opyXEtzLfhsLuEkHdQ0GhTUk2nYgHeKX0j6eW0uQhAD/9TLf6UgILCk0+nQvXfEffQCCe/hEfBfkAgiPhr1E3uyPB4vp6Fpy2nnkkzmGv/3P5wg6afKDmU2Ic32u3U47hOlghnc7NlbzFb5R8Tx6vWrkXMDYHdOaaudLtPp5N9y1ceXXaMNAFMVmoqaiHWuV4KN+2rLolSOGUEFNEoRN6Jw9mlq/zniK23gQ2lSy+wIHPRGvRCxhRr5DeskvLgyviAk7IhLH3zMpqxd7i05BIPV3sB8orBzVE4Rqmam3evpTVEMMFRDt/Ol6XUJi66QrLgJyusuv5xL4pKPWZrw/hn3a5j0zrrChUbvM3S94BeWiJS48hA35S9mXLfaKMAZTYZTMqhbW77qwUuquwW2lPEAgSPY7WvvnNRUPXsS1KCPpiuE0TuDFaZQi9UTqlzkQIq84wqVRjQZ0Y0m3PQeI2BbJZ8woKIKiABWbSOuV/kyy5H4L+RVL7Jmc2ndl3HaQ4XlnwDmTuK/gMbRvZe1taVHOyYsXmfEY4XkiaDUneGjBEGnWyiv49DtiG2TLmmIpP1UITmO677eDSoNLHpxp1guMjwL5m3XHKOFNtpLzuiVH4UJdgTjtnmbGHmKGtyy0k3GPZrwyVkZRyS+FZZ5WhTs05rhS+1sg3oDCyTbWeYX9T4VVswRjxq1HsyH8NdZTN4f9BTn9VU0+9JnVAkgLM4JCkV6wqwQf+QMK/MaYWvBwSjYgFUxdEdT7Rls85/M+4GxcaGsiNmsA5Q==">
  <input type="hidden" name="cf_captcha_kind" value="h">
  <input type="hidden" name="vc" value="4845a44c225a1fa6a61708e11b613971">

truncated...

 <script type="text/javascript">
    //<![CDATA[
    (function(){
        var isIE = /(MSIE|Trident\/|Edge\/)/i.test(window.navigator.userAgent);
        var trkjs = isIE ? new Image() : document.createElement('img');
        trkjs.setAttribute("src", "/cdn-cgi/images/trace/managed/js/transparent.gif?ray=65eccd326d61f331");
        trkjs.id = "trk_managed_js";
        trkjs.setAttribute("alt", "");
        document.body.appendChild(trkjs);
        var cpo=document.createElement('script');
        cpo.type='text/javascript';
        cpo.src="/cdn-cgi/challenge-platform/h/g/orchestrate/managed/v1?ray=65eccd326d61f331";
        document.getElementsByTagName('head')[0].appendChild(cpo);
    }());
    //]]>
    </script>
  

上面的信息表明,发送到目标URL的Python请求被拦截了云耀服务器,正在挑战请求。在允许初始请求继续之前,必须绕过此挑战。

cfscrape 包


OP 表示他们试图使用cfscrapePython包获取token信息云耀 server.

标准 cfscrape 请求提供与以下相同的响应Python 请求。

import cfscrape

URL = 'https://www.cclonline.com/product/334427/GV-N3070AORUS-M-8GD-1-1/Graphics-Cards/Gigabyte-AORUS-GeForce-RTX' \
      '-3070-MASTER-8GB-Overclocked-Graphics-Card-rev-1-1-/VGA5934/'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'}

scraper = cfscrape.create_scraper(delay=10)
response = scraper.get(URL, headers=headers)
print(f'Status Code: {response.status_code}')
print(f'Status Code Reason: {response.reason}')
# output
Status Code: 403
Status Code Reason: Forbidden

The cfscrape包还支持以下功能拿到令牌 and 获取cookie字符串,但这两者都会产生 403 Forbidden 错误代码。

From cfscrape源代码:

def is_cloudflare_captcha_challenge(resp):
        return (
            resp.status_code == 403
            and resp.headers.get("Server", "").startswith("cloudflare")
            and b"/cdn-cgi/l/chk_captcha" in resp.content
        )


# the function above is called from this

def request(self, method, url, *args, **kwargs):
        resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs)

        # Check if Cloudflare captcha challenge is presented
        if self.is_cloudflare_captcha_challenge(resp):
            self.handle_captcha_challenge(resp, url)

        # Check if Cloudflare anti-bot "I'm Under Attack Mode" is enabled
        if self.is_cloudflare_iuam_challenge(resp):
            resp = self.solve_cf_challenge(resp, **kwargs)

        return resp

The 处理验证码挑战函数就是试图解决云耀JavaScript 挑战。这一段代码是什么失败了。目前还不清楚该部分的哪一部分失败了,因此需要进行额外的研究和测试。

请注意:据该软件包的开发者称该模块不再受支持.

云刮包


OP 还表示,他们尝试使用云楼Python包获取token信息云耀服务器。这毫无价值云楼被分叉自cf刮,所以语法是相似的。

云楼得到与以下相同的 403 Forbidden 错误代码cfscrape。

import cloudscraper

URL = 'https://www.cclonline.com/product/334427/GV-N3070AORUS-M-8GD-1-1/Graphics-Cards/Gigabyte-AORUS-GeForce-RTX' \
      '-3070-MASTER-8GB-Overclocked-Graphics-Card-rev-1-1-/VGA5934/'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'}

scraper = cloudscraper.create_scraper()
response = scraper.get(URL)
print(f'Status Code: {response.status_code}')
print(f'Status Code Reason: {response.reason}')
# output
Status Code: 403
Status Code Reason: Forbidden

The 云楼包还支持以下功能拿到令牌 and 获取cookie字符串,但这两者都会产生 403 Forbidden 错误代码。

硒包


OP 还表示,他们尝试使用seleniumPython 包。

特别说明:在我的测试过程中,我将 selenium 与 webdrivers 一起使用谷歌浏览器, 火狐浏览器 and 微软边缘.

在过去 12 个月内,这些选项可用于selenium绕过云耀保护。不幸的是,这些选项今天不起作用

chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
# additional disable-blink-features are available in Chromium source code on Github
chrome_options.add_argument("--disable-blink-features=AutomationControlled")

下面是一个selenium使用 Chrome Webdriver 和上述开关的代码示例。

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument(
    "user-agent=Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36")
chrome_options.add_argument("start-maximized")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=chrome_options)
URL = "https://www.cclonline.com/product/334427/GV-N3070AORUS-M-8GD-1-1/Graphics-Cards/Gigabyte-AORUS-GeForce-RTX-3070-MASTER-8GB-Overclocked-Graphics-Card-rev-1-1-/VGA5934"

driver.get(URL)

上面的代码打开一个浏览器会话,它面临着云耀JavaScript 挑战。在使用上述开关进行测试期间,这一挑战不会停止。这Cloudflare Ray ID,在我手动终止会话之前,每个请求的唯一 ID 会轮换多次。

enter image description here

硒线需要获取状态码

下面是一个headless模式 Chrome webdriver 会话,该会话还显示目标 URL 的 403 Forbidden 错误代码。会议还表明验证码网站反机器人技术现已融入其中。

from seleniumwire import webdriver

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("start-maximized")
chrome_options.add_argument("--headless")
chrome_options.add_argument(
    "user-agent=Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument("--disable-blink-features=AutomationControlled")

driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=chrome_options)
URL = "https://www.cclonline.com/product/334427/GV-N3070AORUS-M-8GD-1-1/Graphics-Cards/Gigabyte-AORUS-GeForce-RTX-3070-MASTER-8GB-Overclocked-Graphics-Card-rev-1-1-/VGA5934"
driver.get(URL)

for request in driver.requests:
    print(f'Status Code: {request.response}')
    print(f'Host Name: {request.host}')
    # output 
    Status Code: 403 
    Host Name: www.cclonline.com
    -----------------------
    Status Code: 200 
    Host Name: www.cclonline.com
    -----------------------
    Status Code: 200 
    Host Name: www.cclonline.com
    -----------------------
    Status Code: 200 
    Host Name: www.cclonline.com
    -----------------------
    Status Code: 200 
    Host Name: www.cclonline.com
    -----------------------
    Status Code: 200 
    Host Name: www.cclonline.com
    -----------------------
    Status Code: 200 
    Host Name: www.cclonline.com
    -----------------------
    Status Code: 200 
    Host Name: www.cclonline.com
    -----------------------
    Status Code: 302 
    Host Name: hcaptcha.com
    -----------------------
    Status Code: 200 
    Host Name: newassets.hcaptcha.com
    -----------------------
driver.quit()

使用 UI 的标准 Chrome Webdriver 会话显示带有以下内容的 iFrame“我是人”复选框。

enter image description here

如果我手动或使用单击按钮selenium会话中,系统会提示我使用图片验证码,这增加了绕过验证码的复杂性云耀保护。

enter image description here

cf_clearance cookie


When a 云耀验证码或 Javascript 挑战已解决cf_间隙cookie是在客户端浏览器中设置的。这cf_间隙cookie 的默认生存期为 30 分钟,但可以通过以下方式进行配置云耀 client.

如果您在 Google Chrome 浏览器中手动打开 OP 的目标 URL,您可以看到cf_间隙cookie 使用开发者工具

看来cf_间隙根据此会话开始的 UTC 时间和 cookie 设置的到期日期,cookie 生存期设置为 60 分钟。

到目前为止我还没有找到使用Python 提取这个cookie 的方法。

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法从网页中抓取产品标题 的相关文章

随机推荐

  • URL 重写以在 url 开头添加目录

    在我的网站上 所有图像 样式表都位于 CMS 目录中 最近 我们的网站转移到新服务器的临时网址 他们引用了 newdirectory CMS 我们如何将 newdirectory 附加到所有 CMS 调用 在 的里面 htaccess fi
  • FD_CLOEXEC fcntl() 标志有什么作用?

    Like so if fcntl fd F SETFD FD CLOEXEC 1 虽然我读过man fcntl 我不明白它有什么作用 它设置了执行时关闭文件描述符的标志 这会导致文件描述符在任何时候自动 并且原子地 关闭exec 家庭功能成
  • R 中有吸引力的 3D 绘图

    我正在写一个提案 需要一个像这样的 3D 绘图 但最好更具吸引力 我需要每个点的大小来反映物种的丰富度以及通过连接点创建的体积轮廓 样本数据 input lt data frame label c sp1 sp2 sp3 sp4 trait
  • 存储过程/函数列表 Mysql 命令行

    如何在 mysql 命令行中查看存储过程或存储函数的列表 例如show tables or show databases 命令 SHOW PROCEDURE STATUS SHOW FUNCTION STATUS
  • 在 Asp.net Core 中设置 CultureInfo 以获得 .作为CurrencyDecimalSeparator 而不是 ,

    我要疯了 我只是希望将整个 Asp net core 应用程序中使用的区域性设置为 en US 但似乎没有任何作用 在哪里设置整个应用程序的文化 我对客户端浏览器文化之类的不感兴趣 唯一改变它的似乎是更改 Windows 的语言设置 我只是
  • HTML - 如何将段落分成同样宽的行?

    这是关于基本的 HTML CSS 页面渲染 当一个段落太长而无法容纳在一行中时 它会尽可能多地占据空间 然后换行 如此反复 我希望我的网页能够进行换行 以便生成的行尽可能相等 所以不要得到 包裹包裹包裹包裹包裹 包裹包裹包裹包裹包裹 包裹包
  • Windows 批处理文件不等待命令完成

    我有一个批处理文件 该文件一启动 以管理员身份运行 就存在 并且不执行其中的命令 但如果我在命令行指定它 它会正常运行并执行所有命令 这是其中的内容 start wait msiexec x SetupServices msi qn l S
  • 如何通过 Azure 资源管理器设置 Azure 应用服务在 .Net Core 上运行

    我使用以下 ARM 模板片段设置了应用服务 name variables webBackEnd type Microsoft Web sites location parameters location apiVersion 2015 08
  • 获取所有相关的 Django 模型对象

    如何获取具有指向对象的外键的所有模型对象的列表 类似于 DELETE CASCADE 之前 Django 管理中的删除确认页面 我试图想出一种合并数据库中重复对象的通用方法 基本上 我希望所有具有外键指向对象 B 的对象都更新为指向对象 A
  • 有没有办法指示 argparse (Python 2.7) 从 sys.argv 中删除找到的参数?

    我正处于开发过程中 这个项目正在变成一个相当重要的 Python 2 7 项目 现在我已经拥有了我的全部unittest类集中在自己的模块中 tests py 大约有3300行 这是疯狂的大 无法导航 到处都是不好的做法等等 所以 我当前的
  • 在 MVC 5 中正确获取 DataProtectionProvider 以进行依赖项注入

    当尝试创建一个DataProtectionProvider手动我偶然发现了 Microsoft 文档DpapiDataProtectionProvider其中说 用于提供源自于的数据保护服务 数据保护 API 这是您数据保护的最佳选择 应用
  • TranslateAnimated ImageView 动画后不可点击 [Android]

    我有2个ImageView我从屏幕顶部翻译到底部 这些视图是从 xml 中获取的 动画是从 java 代码中添加的 动画效果很完美 但是onClickListener我在java代码中添加似乎不起作用 我用了fillAfter动画的属性 使
  • 为什么“while(!feof(file))”总是错误?

    使用有什么问题feof 控制读循环 例如 include
  • 如何在 QTableWidget 中禁用选择突出显示?

    我有一个QTableWidget与残疾人setSelectionMode QTableWidget NoSelection 和QTableWidgetItems 我填写没有Qt ItemIsEditable flag 尽管如此 被单击的单元
  • 获取SDL 2应用程序的窗口句柄

    我想获取 SDL2 窗口的句柄 以便将其与 WinApi 一起使用 我使用以下代码检索该句柄 All the SDL initalisation SDL Window window SDL CreateWindow My Window SD
  • 如何在鼠标离开元素后继续 :hover 上的 CSS 动画?

    有动画示例 b ball bounce transform origin top webkit keyframes ball animation 20 transform rotate 9deg 40 transform rotate 6d
  • DataGridView-当我按 Enter 键时,它会转到下一个单元格

    我有一个包含 5 列的 datagridview 当我按 输入 时 它会转到下一个单元格 当它到达行的末尾时 当我按输入时 它会添加一个新行 但我的问题是当我移到上一个单元格时我按 Enter 键后的行会跳过行并且不会转到下一个单元格 有什
  • 在 PHP 中验证信用卡的最佳方法是什么?

    给定一个信用卡号码并且没有其他信息 PHP 中确定它是否是有效号码的最佳方法是什么 现在我需要一些可以与美国运通卡 Discover 万事达卡和维萨卡一起使用的东西 但如果它也可以与其他类型一起使用 那可能会有所帮助 卡号验证分为三个部分
  • Rails 4如何捕获ajax:成功事件

    我使用的是 Rails 4 0 我正在发送这样的事件 注意 remote gt true 我的控制器看起来像这样 def rate video Video find by hashed id params id action params
  • 无法从网页中抓取产品标题

    我正在尝试抓取此产品中可用的产品标题webpage使用请求模块 但脚本总是抛出AttributeError即使产品标题位于页面源代码中 ctrl U 我尝试过 throws AttributeError import requests fr