如何使用 python 抓取所有页面而不突然被检测为机器人

How to scrape all the page without suddenly being detected as a bot using python

我想做的是使用给定的 URL 从数据库中抓取一家餐馆。主机是 https://www.just-eat.co.{tenant}。然后从响应中我会得到包含 json.

window.__INITIAL_STATE__
for resto in restos:
   host = resto['menu_url'].replace('https://', '').split('/')[0]
   headers = {
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'en-US,en;q=0.9',
                'Cache-Control': 'max-age=0',
                'Connection': 'keep-alive',
                'Content-Type': 'application/json',
                'Host': host,
                'sec-ch-ua': "\"Google Chrome\";v=\"93\", \" Not;A Brand\";v=\"99\", \"Chromium\";v=\"93\"",
                'sec-ch-ua-mobile': '?0',
                'Sec-Fetch-Dest': 'document',
                'Sec-Fetch-Mode': 'navigate',
                'Sec-Fetch-Site': 'same-origin',
                'Sec-Fetch-User': '?1',
                'Upgrade-Insecure-Requests': '1',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
            }

   response = requests.get(url=resto['menu_url'], headers=headers)
   data = re.search('(?<=window.__INITIAL_STATE__=)(.*)(?=<)', response.text).group(1)
   data = json.loads(data)

问题是: 当我抓取一组餐厅时,我可以从一开始就从大约 5 个餐厅收集数据(页面完整 HTML ), 然后突然我会得到这个 (HTML below), 然后突然我可以再次收集完整的 HTML, 等等.

<html>
    <head>
        <META NAME="robots" CONTENT="noindex,nofollow">
        <script src="/_Incapsula_Resource?SWJIYLWA=5074a7">
        </script>
    <body>
    </body>
</html>

获取此 HTML 会给我一个错误,因为我试图使用固定键访问 json。 Try-Except 不是解决方案,因为我可以在网络上访问 resto URL,除非找不到该页面。我要的是不要遇到上面的HTML,只遇到包含window.__INITIAL_STATE__的HTML,页面的全HTML .

<script>window.__INITIAL_STATE__={...

此外,我正在使用 VPN 访问 resto 平台,因为它在我的国家被封锁。

我在这里错过了什么?跟headers有关系吗?我在尝试访问 resto URL.

时,根据网络上的 header 复制了 header

可能原因:

1.抓取速度过快会导致系统将您检测为机器人。添加 time.sleep() 以减慢速度。

2. 根据我的经验,当抓取一个可以检测到您是机器人的网站时,它会检查您是否拥有它在用户访问时提供给用户的 cookie在网站上,因此请查看它提供给您的 cookie,看看使用相同的 cookie 是否有效。有多个库可以处理使用 cookie 的请求。 Reference

3. 一些网站还会检查您的客户端是否启用了 JS,如果禁用,可能会导致您被检测为机器人。 Reference

4. 最后,一些网站使用 Cloudflare 或其他服务来检测很难绕过的机器人程序。只是因为屏幕上显示“正在检查浏览器的 IP。由 Cloudflare 提供支持。”进入网站时不显示并不意味着他们没有使用 Cloudflare。 cfsrapecloudscrape 模块可能适用于某些网站,但通常不能。