如何从Quizlet中获取数据而不会被阻止进行网络抓取?

时间:2020-09-15 21:42:30

标签: python web-scraping

因此,为我的目标提供了一个测验链接(或我要访问的一组抽认卡ID),以检索抽认卡的文本。我可以用他们的api完成此操作,但现在似乎不存在。我也可以很容易地对其进行网络爬虫,但是担心这会破坏他们的服务条款和/或可能导致IP禁令。还有其他访问数据的方法还是只能通过网络抓取?

2 个答案:

答案 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)