我尝试从网站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()
有办法绕过这些街区进入网站吗?
1条答案
按热度按时间0ve6wy6x1#
状态
503 - Service Unavailable
经常出现在这种情况下,你可能是对的,他们已经采取了措施来防止刮擦。为了完整起见,他们禁止你在他们的Terms of Service(No. 7 g)中尝试:[...]您同意您将不会使用自动化的方式,包括蜘蛛,机器人,爬虫[...]
技术观点
当你试图隐藏你自动发送请求的事实时,头部的
User-Agent
只是你应该考虑的 * 许多事情之一 *。既然你看到一个页面,似乎证明你仍然/再次是一个人,很可能他们已经发现了发生了什么,并且已经盯上了您的IP。它可能没有被列入黑名单(尚未),因为无论您何时尝试访问该页面,他们都会注意到更改。他们是怎么发现的?根据你的问题和代码,我猜只是你的IP没有改变,结合
*请求率:您发送(太多)请求的速度太快,即比他们认为的人类执行此操作的速度要快。
*定期请求:请求之间的静态延迟,因此他们认为自己的时间安排非常有规律。
还有其他几个方面可能会受到监控,也可能不会受到监控。但是,使用代理(即更改IP地址)将是朝着正确方向迈出的一步。