scrapy 如何通过一个503错误,而刮

q43xntqr  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(142)

我尝试从网站https://www.etf.com/channels抓取ETF。然而,无论我尝试什么,当我尝试访问它时,它返回503错误。我尝试使用不同的用户代理和头文件,但它仍然不让我访问它。有时当我尝试通过浏览器访问网站时,弹出一个页面,“检查连接是否安全”所以我认为他们已经有了一些东西来停止刮擦。我看到其他人问同样的问题,答案总是说添加一个用户代理,但这对这个网站不起作用。
斯克拉皮

class BrandETFs(scrapy.Spider):
    name = "etfs"
    start_urls = ['https://www.etf.com/channels']

    headers = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "en-US,en;q=0.5",
        "Connection": "keep-alive",
        "Host": "www.etf.com",
        "Sec-Fetch-Dest": "document",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Site": "cross-site",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0"
    }

    custom_settings = {'DOWNLOAD_DELAY': 0.3, "CONCURRENT_REQUESTS": 4}

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

    def parse(self, response):
        test = response.css('div.discovery-slat')
        yield {
            "test": test
        }

请求数

import requests

url = 'https://www.etf.com/channels'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
    'Referer': 'https://google.com',
    'Origin': 'https://www.etf.com'
}
r = requests.post(url, headers=headers)
r.raise_for_status()

有办法绕过这些街区进入网站吗?

0ve6wy6x

0ve6wy6x1#

状态503 - Service Unavailable经常出现在这种情况下,你可能是对的,他们已经采取了措施来防止刮擦。为了完整起见,他们禁止你在他们的Terms of Service(No. 7 g)中尝试:
[...]您同意您将不会使用自动化的方式,包括蜘蛛,机器人,爬虫[...]

技术观点

当你试图隐藏你自动发送请求的事实时,头部的User-Agent只是你应该考虑的 * 许多事情之一 *。既然你看到一个页面,似乎证明你仍然/再次是一个人,很可能他们已经发现了发生了什么,并且已经盯上了您的IP。它可能没有被列入黑名单(尚未),因为无论您何时尝试访问该页面,他们都会注意到更改。
他们是怎么发现的?根据你的问题和代码,我猜只是你的IP没有改变,结合

*请求率:您发送(太多)请求的速度太快,即比他们认为的人类执行此操作的速度要快。
*定期请求:请求之间的静态延迟,因此他们认为自己的时间安排非常有规律。

还有其他几个方面可能会受到监控,也可能不会受到监控。但是,使用代理(即更改IP地址)将是朝着正确方向迈出的一步。

相关问题