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

时间:2017-12-15 19:10:00

标签: python ajax selenium web-scraping beautifulsoup

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

1 个答案:

答案 0 :(得分: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

结果(小预览)

20171213@901.00@863.00@893.00@901.00@901.00@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']
...

BTW:您也可以使用标准模块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