从使用Ajax请求的网站抓取数据

问题描述 投票:0回答:1

到目前为止,我已经制作了一个从网站上抓取数据的程序,我已经使用python和selenium以及beautifulsoup创建了一个程序,当它想要从this one这个网站的页面中抓取数据时,我必须点击一个名为“ سابقه“(在顶部,它是torquoise颜色)然后网站使用Ajax请求获取数据,然后我循环通过表,表格有多个页面,所以我必须点击表格下方的数字并收集新的数据再次。我的问题是这个方法真的很慢,因为我还必须从500页收集数据,每个页面包含35个表。有没有其他更快的方法来执行此操作?或者可能是一种在我的程序中触发Ajax请求并获得响应的方法。如果解决方案是在python中会更好。

python ajax selenium web-scraping beautifulsoup
1个回答
1
投票

Tab使用JavaScript从url获取所有数据

http://members.tsetmc.com/tsev2/data/InstTradeHistory.aspx?i=9211775239375291&Top=999999&A=0

后来只更改表中的数据。其他标签使用不同的网址,但休息应该类似。

您可以使用requests一次性获取所有内容

import requests

url = 'http://members.tsetmc.com/tsev2/data/InstTradeHistory.aspx?i=9211775239375291&Top=999999&A=0'

r = requests.get(url)

print(r.text[:50]) # first 50 chars

data = r.text.split(';')

print('number od days:', len(data))

for row in data: # data[:5]: # first 5 rows
    row = row.split('@')
    print('date:', row[0], '|', row[1:4]) # first 3 values

结果(小预览)

[email protected]@[email protected]@[email protected]@859.00

number od days: 1202

date: 20171213 | ['901.00', '863.00', '893.00']
date: 20171212 | ['859.00', '859.00', '859.00']
date: 20171211 | ['823.00', '782.00', '819.00']
date: 20171210 | ['796.00', '780.00', '784.00']
date: 20171209 | ['797.00', '781.00', '787.00']
...

顺便说一句:您也可以使用标准模块urllib.request,但服务器发送使用gzip压缩的数据,因此您必须使用模块gzipFile手动解压缩它。

或者您可以尝试使用标头Accept-Encoding: deflate发送请求,以通知服务器您需要未压缩的数据。


我不知道url在参数中是否总是具有相同的值

i=9211775239375291&Top=999999&A=0

但价值i也在页面网址

http://www.tsetmc.com/Loader.aspx?ParTree=151311&i=9211775239375291

© www.soinside.com 2019 - 2024. All rights reserved.