如何避免在从基于登录的站点抓取数据时被禁止?

SMT*_*MTH 3 python beautifulsoup web-scraping python-3.x python-requests

我正在尝试创建一个脚本,使用它我可以解析网站中的几个字段而不会被阻止。我希望从中获取数据的站点需要凭据才能访问其内容。如果不是为了登录,我本可以使用代理轮换绕过速率限制。

当我从基于登录的站点抓取内容时,我试图找出任何方法来避免在从那里抓取数据时被该站点禁止。To be specific, my script currently can fetch content from that site flawlessly but my ip address gets banned along the way if I keep on scraping.

到目前为止,我已经写过(将以下站点地址视为占位符):

import requests
from bs4 import BeautifulSoup

url = "https://stackoverflow.com/users/login?ssrc=head&returnurl=https%3a%2f%2fstackoverflow.com%2f"

with requests.Session() as s:
    s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
    req = s.get(url)

    payload = {
        "fkey": BeautifulSoup(req.text,"lxml").select_one("[name='fkey']")["value"],
        "email": "some email",
        "password": "some password",
    }
    
    res = s.post(url,data=payload)
    soup = BeautifulSoup(res.text,"lxml")
    for post_title in soup.select(".summary > h3 > a.question-hyperlink"):
        print(post_title.text)
Run Code Online (Sandbox Code Playgroud)

从基于登录的站点抓取数据时如何避免被禁止?

Pau*_*ues 7

直接到“任何避免被禁止的有效方法”的地步是没有办法的

我会将这种情况与鲨鱼袭击进行比较。这是鲨鱼的决定,而不是你的决定。

但是,您可以使用一些技术来减轻“鲨鱼攻击”……但首先,让我们明确表示您首先要“攻击”鲨鱼,并在其领域内游动。

该技术将是:“创建人工抓取脚本”。

human这里的词指的是有时会犯一些随机错误。其中一些列在下面:

  • 在您的任务之间插入一些随机延迟;
  • 点击一些错误的链接,等待几秒钟,返回;
  • 退出系统,等一两分钟,重新登录;
  • 如果你有一个页面上的链接列表可以点击然后抓取每个页面的数据,不要这样做按顺序进行;
  • 如果您有一个页面显示页面中的结果,请不要执行获取结果按顺序(例如 1, 5, 2, 9, 10, 3, 7, 4, 8, 6)
  • 别急,每天获取的数据很少

但是,最有效的方法是联系网站所有者并提供合作伙伴关系或支付使用 API 或类似方式访问数据的费用(如果他们有此服务)。