【问题标题】:Is it possible to replicate this website's AJAX call? (web-scraping question)是否可以复制本网站的 AJAX 调用? (网络抓取问题)
【发布时间】:2019-11-13 14:01:02
【问题描述】:

我正在尝试从这个网站上抓取表格。

这似乎是一个简单的抓取,能够直接解析 HTML,虽然我遇到了以下问题。
在每个页面上,前 3 行与网页上显示的不同,最后 3 行没有被抓取。

我做了一些挖掘,并意识到网站正在从这个来源获取数据(这意味着我试图抓取的所有数据都不能直接通过网站源代码获得)-> https://www.saasmag.com/wp-admin/admin-ajax.php?action=companydatatable_action&year=2018

在预览 XHR 请求(在 chrome 上)时,网站请求的内容清晰可见 - 尽管当我访问同一个链接时,我只是看到了这个:{"draw":null,"recordsTotal":0,"recordsFiltered":0,"data":[]}

我认为它受到保护,或者可能需要某种身份验证。

有办法解决这类问题吗?

【问题讨论】:

  • 尝试将 XHR 从 chrome 复制为 CURL,然后查看它使用了哪些参数。很可能您缺少大量 cookie。
  • 是的,就是这样。直到 30 分钟前我才知道这件事。干杯人!欣赏它。
  • 有时注意它的请求的url,有一次某个网站想要一个/,请求库会自动删除,但urllib3没有,askjerri.com

标签: python ajax api web-scraping web-crawler


【解决方案1】:

以下代码成功了,我只需要使用会话处理程序。

import requests

url = r"https://www.saasmag.com/wp-admin/admin-ajax.php?action=companydatatable_action&year=2018"

session = requests.Session()
session.get("https://www.saasmag.com/saas-1000-2018")

formdata = {'draw': ['2'],
 'columns[0][data]': ['0'],
 'columns[0][name]': '',
 'columns[0][searchable]': ['true'],
 'columns[0][orderable]': ['false'],
 'columns[0][search][value]': '',
 'columns[0][search][regex]': ['false'],
 'columns[1][data]': ['1'],
 'columns[1][name]': '',
 'columns[1][searchable]': ['true'],
 'columns[1][orderable]': ['false'],
 'columns[1][search][value]': '',
 'columns[1][search][regex]': ['false'],
 'columns[2][data]': ['2'],
 'columns[2][name]': '',
 'columns[2][searchable]': ['true'],
 'columns[2][orderable]': ['false'],
 'columns[2][search][value]': '',
 'columns[2][search][regex]': ['false'],
 'columns[3][data]': ['3'],
 'columns[3][name]': '',
 'columns[3][searchable]': ['true'],
 'columns[3][orderable]': ['false'],
 'columns[3][search][value]': '',
 'columns[3][search][regex]': ['false'],
 'columns[4][data]': ['4'],
 'columns[4][name]': '',
 'columns[4][searchable]': ['true'],
 'columns[4][orderable]': ['false'],
 'columns[4][search][value]': '',
 'columns[4][search][regex]': ['false'],
 'columns[5][data]': ['5'],
 'columns[5][name]': '',
 'columns[5][searchable]': ['true'],
 'columns[5][orderable]': ['false'],
 'columns[5][search][value]': '',
 'columns[5][search][regex]': ['false'],
 'columns[6][data]': ['6'],
 'columns[6][name]': '',
 'columns[6][searchable]': ['true'],
 'columns[6][orderable]': ['false'],
 'columns[6][search][value]': '',
 'columns[6][search][regex]': ['false'],
 'columns[7][data]': ['7'],
 'columns[7][name]': '',
 'columns[7][searchable]': ['true'],
 'columns[7][orderable]': ['false'],
 'columns[7][search][value]': '',
 'columns[7][search][regex]': ['false'],
 'columns[8][data]': ['8'],
 'columns[8][name]': '',
 'columns[8][searchable]': ['true'],
 'columns[8][orderable]': ['false'],
 'columns[8][search][value]': '',
 'columns[8][search][regex]': ['false'],
 'columns[9][data]': ['9'],
 'columns[9][name]': '',
 'columns[9][searchable]': ['true'],
 'columns[9][orderable]': ['false'],
 'columns[9][search][value]': '',
 'columns[9][search][regex]': ['false'],
 'columns[10][data]': ['10'],
 'columns[10][name]': '',
 'columns[10][searchable]': ['true'],
 'columns[10][orderable]': ['false'],
 'columns[10][search][value]': '',
 'columns[10][search][regex]': ['false'],
 'columns[11][data]': ['11'],
 'columns[11][name]': '',
 'columns[11][searchable]': ['false'],
 'columns[11][orderable]': ['false'],
 'columns[11][search][value]': '',
 'columns[11][search][regex]': ['false'],
 'order[0][column]': ['11'],
 'order[0][dir]': ['asc'],
 'start': ['0'],
 'length': ['2500'],
 'search[value]': '',
 'search[regex]': ['false']}

while url:
    headers = {
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate, br",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Firefox/60.0"
    }
    r = session.post(url, headers=headers, data=formdata)
    for company in r.json()['data']:
        print(company)
    url = None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2013-01-24
    • 2020-03-21
    • 2015-06-24
    • 1970-01-01
    相关资源
    最近更新 更多