因此,为我的目标提供了一个测验链接(或我要访问的一组抽认卡ID),以检索抽认卡的文本。我可以用他们的api完成此操作,但现在似乎不存在。我也可以很容易地对其进行网络爬虫,但是担心这会破坏他们的服务条款和/或可能导致IP禁令。还有其他访问数据的方法还是只能通过网络抓取?
答案 0 :(得分:1)
没有一个解决这个问题的灵丹妙药(请参阅this answer,有多少种可能的方法可以阻止网络抓取尝试)。但这是潜在的解决方案(难度递增)。
1。使用正确的HTTP user-agent
这是一个PIP package,可以帮助您进行管理。
2。发送并发请求时增加一些随机性
添加{requests.get(<url>)
。而不是在while循环中甚至在多进程/线程中运行time.sleep(<some random time>)
。
3。模拟真实的浏览器
您可以使用WebDriver,它将像在浏览器(例如Chromium或Firefox等)中一样运行并呈现抓取的页面。您甚至可以在 headless 模式下使用; Python Selenium将是一个潜在的选择。这样,如果Javascript本身试图阻止您的网页抓取尝试(例如,React渲染的页面或Google Webstore),则您完全不必担心此类事情。
4。获取大量的IP
您可以购买代理IP地址。这将是最简单的方法,并且对于公共Web服务进行阻止非常困难(或至少痛苦)。
或者,将以上两个或多个结合起来。从个人经验来看,我从来没有找到可以停止Web爬网尝试的单个Web服务。但是,在我的用例中,我会非常注意法律和道德方面的问题。
答案 1 :(得分:0)
如果您正在使用python请求,请使用标头。它会让您度过难关。
示例:
import requests
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'en-US,en;q=0.9',
'cache-control': 'max-age=0',
'cookie': 'yourcookie',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (X11; CrOS x86_64 12239.92.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.136 Safari/537.36',
}
response = requests.get('https://quizlet.com/173246204/mgmt-final-exam-flash-cards/', headers=headers)
text = response.text
print(text)