我正在尝试创建一个脚本,我可以在不被封锁的情况下解析网站上的几个字段。我希望获得数据的网站需要凭据才能访问它的内容。如果不是为了登录,我可以使用代理的旋转绕过速率限制。
当我从一个基于登录的网站上抓取内容时,我试图找出避免被该网站禁止的任何方法,同时从那里抓取数据。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)如何避免在从基于登录的站点抓取数据时被禁止?
发布于 2021-03-03 19:45:03
直接说到“的任何有效方法都可以避免被禁止”,就没有办法。
我会把这种情况比作鲨鱼袭击。这是鲨鱼的决定不是你的。
然而,你可以用一些技巧来减轻“鲨鱼攻击”.但首先,让我们清楚地表明,你首先要“攻击”鲨鱼,在它的领地游泳。
该技术将是:“创建一个人工刮取脚本”。
这里的单词human指的是有时会犯随机错误。其中一些国家列于下:
然而,最有效的方法是联系网站所有者,如果他们有这种服务的话,通过API或类似的方式提供合作伙伴关系或支付访问数据的费用。
发布于 2021-03-09 13:49:08
我添加了一个类似的问题,使用selenium编写一个库,从网站中获取金融数据。
我发现的唯一有效的方法是在1秒左右添加一个随机延迟来模拟人类的行为,在每个请求之后(在循环结束时)使用下面的命令
time.sleep( 1.0 + numpy.random.uniform(0,1) )您将有大约60分钟的请求。您可以调整1.0有一个频率,这是可以的网站。
如果网站计算出你的请求频率,它会发现准确的一分钟,这是非常可疑的,但现在我没有找到一个这样做。
发布于 2021-03-08 16:08:05
当尝试刮不想被刮的网站的时候,是有可能的。你需要为你的代码设置代理来运行。我使用ScrapingHub来主持我的刮刮项目。它将通过代理自动更改其ip地址。
https://stackoverflow.com/questions/66413511
复制相似问题