从 url 不变的站点中抓取响应表
Posted
技术标签:
【中文标题】从 url 不变的站点中抓取响应表【英文标题】:scrape responsive table from site whose url doesnt change 【发布时间】:2022-01-15 21:11:58 【问题描述】:我想从这个网站上抓取价格历史记录:点击价格历史记录按钮后,表格会被加载,但 URL 保持不变。我想刮一下加载的表。
import requests
from bs4 import BeautifulSoup
rr = requests.get(url)
htmll = rr.text
soup = BeautifulSoup(htmll)
【问题讨论】:
欢迎来到 SO。你的问题到底是什么? @petezurich 我想从sharesansar.com/company/shl网站上抓取该公司的价格历史表 @LenovoLife - petezurich,你应该改进你的问题并添加更多细节,以便每个人都可以复制和帮助。 @HedgeHog 希望我现在清楚 此页面使用 javascript 加载数据。如果您在 Chrome/Firefox 中使用 DevTools (tabNetwork
),那么您会看到它从 https://www.sharesansar.com/company-price-history?draw=....
加载表格,您可以尝试使用此 url 来获取表格。它将它作为 JSON 数据获取,因此您不需要 BeautifulSoup
【参考方案1】:
在 Chrome/Firefox 中使用 DevTools
(标签:Network
),您可以看到此页面使用 JavaScript
从另一个 URL 加载数据。
https://www.sharesansar.com/company-price-history?draw=1&columns%5B0%5D%5Bdata%5D=DT_Row_Index&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=false&columns%5B0%5D%5Borderable%5D=false&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=published_date&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=false&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=open&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=false&columns%5B2%5D%5Borderable%5D=false&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=high&columns%5B3%5D%5Bname%5D=&columns%5B3%5D%5Bsearchable%5D=false&columns%5B3%5D%5Borderable%5D=false&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B4%5D%5Bdata%5D=low&columns%5B4%5D%5Bname%5D=&columns%5B4%5D%5Bsearchable%5D=false&columns%5B4%5D%5Borderable%5D=false&columns%5B4%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B4%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B5%5D%5Bdata%5D=close&columns%5B5%5D%5Bname%5D=&columns%5B5%5D%5Bsearchable%5D=false&columns%5B5%5D%5Borderable%5D=false&columns%5B5%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B5%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B6%5D%5Bdata%5D=per_change&columns%5B6%5D%5Bname%5D=&columns%5B6%5D%5Bsearchable%5D=false&columns%5B6%5D%5Borderable%5D=false&columns%5B6%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B6%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B7%5D%5Bdata%5D=traded_quantity&columns%5B7%5D%5Bname%5D=&columns%5B7%5D%5Bsearchable%5D=false&columns%5B7%5D%5Borderable%5D=false&columns%5B7%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B7%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B8%5D%5Bdata%5D=traded_amount&columns%5B8%5D%5Bname%5D=&columns%5B8%5D%5Bsearchable%5D=false&columns%5B8%5D%5Borderable%5D=false&columns%5B8%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B8%5D%5Bsearch%5D%5Bregex%5D=false&start=0&length=20&search%5Bvalue%5D=&search%5Bregex%5D=false&company=95&_=1639245456705'
将requests
与此网址一起使用,您可以将表格作为JSON 数据获取,而您不需要BeautifulSoup
在代码中,我将此 URL 中的所有值转换为 payload
- 因此您可以轻松替换值以获取不同的数据。
如果您更改'start'
(20
、40
等),您可能会获得表格中的下一页。
如果您使用'length": 50
,那么您会在一个请求中获得更多值 - 但更大的值不起作用。
顺便说一句:此 url 需要 X-Requested-With
的标头 AJAX
请求。
import requests
payload =
'_': '1639245456705',
'columns[0][data]': 'DT_Row_Index',
'columns[0][orderable]': 'false',
'columns[0][search][regex]': 'false',
'columns[0][searchable]': 'false',
'columns[1][data]': 'published_date',
'columns[1][orderable]': 'false',
'columns[1][search][regex]': 'false',
'columns[1][searchable]': 'true',
'columns[2][data]': 'open',
'columns[2][orderable]': 'false',
'columns[2][search][regex]': 'false',
'columns[2][searchable]': 'false',
'columns[3][data]': 'high',
'columns[3][orderable]': 'false',
'columns[3][search][regex]': 'false',
'columns[3][searchable]': 'false',
'columns[4][data]': 'low',
'columns[4][orderable]': 'false',
'columns[4][search][regex]': 'false',
'columns[4][searchable]': 'false',
'columns[5][data]': 'close',
'columns[5][orderable]': 'false',
'columns[5][search][regex]': 'false',
'columns[5][searchable]': 'false',
'columns[6][data]': 'per_change',
'columns[6][orderable]': 'false',
'columns[6][search][regex]': 'false',
'columns[6][searchable]': 'false',
'columns[7][data]': 'traded_quantity',
'columns[7][orderable]': 'false',
'columns[7][search][regex]': 'false',
'columns[7][searchable]': 'false',
'columns[8][data]': 'traded_amount',
'columns[8][orderable]': 'false',
'columns[8][search][regex]': 'false',
'columns[8][searchable]': 'false',
'company': '95',
'draw': '1',
'length': '20',
'search[regex]': 'false',
'start': '0'
headers =
'X-Requested-With': 'XMLHttpRequest'
url = 'https://www.sharesansar.com/company-price-history'
response = requests.get(url, params=payload, headers=headers)
data = response.json()
#print(data)
print('NR | DATA | OPEN | CLOSE |')
for number, item in enumerate(data['data'], 1):
print(f'number:3 |', item['published_date'], "|", item['open'], "|", item['close'], "|")
结果:
NR | DATA | OPEN | CLOSE |
1 | 2021-12-09 | 208.70 | 206.00 |
2 | 2021-12-08 | 214.90 | 205.00 |
3 | 2021-12-07 | 218.00 | 211.00 |
4 | 2021-12-06 | 208.00 | 214.00 |
5 | 2021-12-05 | 215.00 | 211.00 |
6 | 2021-12-02 | 225.00 | 217.10 |
7 | 2021-12-01 | 226.00 | 224.50 |
8 | 2021-11-30 | 224.60 | 225.00 |
9 | 2021-11-29 | 227.00 | 225.00 |
10 | 2021-11-28 | 233.00 | 227.00 |
11 | 2021-11-25 | 233.00 | 237.00 |
12 | 2021-11-24 | 228.00 | 230.00 |
13 | 2021-11-23 | 233.50 | 230.10 |
14 | 2021-11-22 | 238.00 | 237.00 |
15 | 2021-11-21 | 242.70 | 234.40 |
16 | 2021-11-18 | 236.00 | 240.00 |
17 | 2021-11-17 | 243.00 | 240.00 |
18 | 2021-11-16 | 232.00 | 239.90 |
19 | 2021-11-15 | 226.00 | 231.50 |
20 | 2021-11-14 | 228.00 | 225.60 |
【讨论】:
以上是关于从 url 不变的站点中抓取响应表的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python 从电子商务 Ajax 站点抓取 JSON 数据
如何使用来自 3rd 方站点的 URL 端点进行 JSON 响应
当 url 保持不变(但给出 ajax 响应)时,Web 抓取多个页面