使用 BeautifulSoup 和 Python 抓取多个 table 页面

Scrape multiple table pages with BeautifulSoup and Python

http://www.indymini.com/p/mini-marathon/miniresults

我想使用 python BS4 废弃 url 上可用的 table,但是当我更改 table 大小或更改页面时,url 会没变。

在 table 中导航时,URL 不会改变,因为 table 似乎是使用 javascript(特别是 DataTables 库)实现的 - 并使用AJAX 获取要显示的相关数据。

所以,基本上,我看不出有什么方法可以使用 BS4 抓取页面并在页面加载时获取默认显示的数据以外的数据。

另一方面,由于数据是使用 AJAX 检索的,您可以尝试找出 AJAX 请求的格式(对于您想要的结果,什么参数做了什么,例如使用 Firebug) 并通过调用提供数据 table.

的 AJAX URL 直接以 JSON 格式检索数据

但是,根据您对数据的预期用途,您可能需要考虑向网站所有者申请下载和使用数据的许可。而且,谁知道呢 - 他们可能愿意提供帮助。

好吧,它是一个通过 GET 发送到服务器的 ajax 调用,这里是 python

中快速而肮脏的抓取代码

ajax url 是

import requests,time
c=0
data=list()
for i in range(1,2278):
    url='http://results.xacte.com/json/search?eventId=1387&callback=jQuery18309972286304579958_1494520029659&sEcho=8&iColumns=13&sColumns=&iDisplayStart='+str(c)+'&iDisplayLength=10&mDataProp_0=&mDataProp_1=bib&mDataProp_2=firstname&mDataProp_3=lastname&mDataProp_4=sex&mDataProp_5=age&mDataProp_6=city&mDataProp_7=state&mDataProp_8=country&mDataProp_9=&mDataProp_10=&mDataProp_11=&mDataProp_12=&sSearch=&bRegex=false&sSearch_0=&bRegex_0=false&bSearchable_0=false&sSearch_1=&bRegex_1=false&bSearchable_1=true&sSearch_2=&bRegex_2=false&bSearchable_2=true&sSearch_3=&bRegex_3=false&bSearchable_3=true&sSearch_4=&bRegex_4=false&bSearchable_4=true&sSearch_5=&bRegex_5=false&bSearchable_5=true&sSearch_6=&bRegex_6=false&bSearchable_6=true&sSearch_7=&bRegex_7=false&bSearchable_7=true&sSearch_8=&bRegex_8=false&bSearchable_8=true&sSearch_9=&bRegex_9=false&bSearchable_9=true&sSearch_10=&bRegex_10=false&bSearchable_10=true&sSearch_11=&bRegex_11=false&bSearchable_11=false&sSearch_12=&bRegex_12=false&bSearchable_12=false&iSortCol_0=0&sSortDir_0=asc&iSortingCols=1&bSortable_0=false&bSortable_1=true&bSortable_2=true&bSortable_3=true&bSortable_4=true&bSortable_5=true&bSortable_6=true&bSortable_7=true&bSortable_8=true&bSortable_9=false&bSortable_10=false&bSortable_11=false&bSortable_12=false&_='+str(time.time())
    r=requests.get(url)
    c+=1
    print (r.text,'-------------',)
    #do whatever you want to do with it, r.text will give the raw data.