【问题标题】:Python - Can't scrape data from a specific website (CourseHero)Python - 无法从特定网站抓取数据 (CourseHero)
【发布时间】:2021-01-25 04:11:25
【问题描述】:

我最近想启动一个使用 Python 与网站 (https://www.coursehero.com/) 交互的机器人项目。 但是..看起来那个网站有一个高反机器人安全系统,在尝试登录时返回一个错误的html数据,所以我想唯一可能的方法是作为一个假的人机界面登录。

我在一个学习小组中,机器人的整个想法是让 参与者从我的高级帐户下载文档文件 网站,而无需向他们提供登录信息。

我已经非常擅长 Python,但对网页抓取很陌生。

有什么帮助吗?

【问题讨论】:

  • 使用selenium,它模拟人类用户
  • Course Hero 前端向https://www.coursehero.com/api/v2/search 发送 POST 请求,并从 JavaScript 呈现搜索结果。尝试从 Python 发送类似的 HTTP 请求,而不是获取 HTML 并解析 JSON 响应。此外,发送类似浏览器的用户代理并使用代理来接收正确的 HTML 响应。

标签: python web-scraping


【解决方案1】:

Course Hero 前端向 https://www.coursehero.com/api/v2/search 发送 POST 请求并从 JavaScript 呈现搜索结果。

只需通过 HTTP 请求获取 JSON。 Full example。我没有付费账户,所以代码的最后一部分被注释了,因为它是一个伪代码。

import requests

headers = {
    'User-Agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.3987.78 Safari/537.36'
}

data = {
    "client": "web",
    "query": "scrape",
    "view": "list_w",
    "filters": {
        "type": ["document"],
        "doc_type": [],
    },
    "sort": "relevancy",
    "limit": 20,
    "offset": 0,
    "callout_types": ["textbook"]
}

response = requests.post(
    'https://www.coursehero.com/api/v2/search/', headers=headers, json=data)

data = response.json()

for result in data['results']:
    url = f"https://www.coursehero.com/file/{result['document']['db_filename']}"
    print(f"'{result['core']['title']}' URL: {url}")

    # Login and extract download URL from HTML
    #
    # response = requests.get(url, headers=headers)
    # soup = BeautifulSoup(response.content, 'lxml')
    # download_url = soup.select('...')
    #
    # OR
    #
    # Download file via direct HTTP request if URL is returned via XHR request
    #
    # download_url = 'https://www.coursehero.com/...'
    # requests.get(download_url, headers=headers)

输出

'Week 6 - Web Scraping.pptx' URL: https://www.coursehero.com/file/38748386
'Python web_scraping train.docx' URL: https://www.coursehero.com/file/70193727
'ScrAPES Book' URL: https://www.coursehero.com/file/6219095
'scrape.py' URL: https://www.coursehero.com/file/43396377
'scrAPES - Rain didn't Boost Lakes' URL: https://www.coursehero.com/file/10042922
'orders cannot scrape.docx' URL: https://www.coursehero.com/file/75016027

...

【讨论】:

  • 感谢您的回复,您的方法工作了一段时间..但突然又开始返回相同的错误数据..dropbox.com/s/qnfke32c8sl0frz
  • @Shizuka 尝试通过fake-useragent 旋转用户代理字符串并使用多个代理以避免被阻止。
【解决方案2】:

我不知道您想与该网站进行什么互动。但我目前正在使用 ScraperAPI 等代理提供程序来抓取网站(包括 Google、Wikipedia、Quora...)。

优点:

  • 全球有数以千计的代理。
  • 成功率高。
  • 每月 1000 次免费计划请求。

缺点:

  • 请求时间很长。
  • 某些请求可能失败,需要多次请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多