用浏览器打开url
https://hnx.vn/en-gb/cophieu-etfs/chung-khoan-ny.html
,然后点击page 2,可以看到响应的内容是一个json。
我使用 urllib 构建请求以获取 json:
import urllib.request
import ssl,json
base_url = "https://hnx.vn/ModuleIssuer/List/ListSearch_Datas"
proxy_handler = urllib.request.ProxyHandler({'https': '127.0.0.1:10801'})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
headers={
"Host": "hnx.vn",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0",
"Accept": "*/*",
"Accept-Language": "en-GB,en;q=0.5",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/x-www-form-urlencoded",
"__RequestVerificationToken": "mKy3wwtZXopsLE5cIKMSnVxK934KPWzUievs0TWY7W9C9Hgu61EKzt1KTaxOGGTX5zvXIs0V_fPwWmEuDXLvXSfcSQNjY6uzwNCAeaQgyu01",
"X-Requested-With": "XMLHttpRequest",
"Content-Length": "113",
"Origin": "https://hnx.vn",
"Connection": "keep-alive",
"Referer": "https://hnx.vn/en-gb/cophieu-etfs/chung-khoan-ny.html",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin"
}
data = {
"p_issearch":"0",
"p_keysearch":"",
"p_market_code":"",
"p_orderby":"STOCK_CODE",
"p_ordertype":"ASC",
"p_currentpage":"2",
"p_record_on_page":"10",
}
postdata = bytes(json.dumps(data), "utf-8")
req=urllib.request.Request(url=base_url,headers=headers,data=postdata,method='POST')
ssl._create_default_https_context = ssl._create_unverified_context
response = opener.open(req)
data = response.read()
我们得到响应,但它不是 json,列出数据的标题
data[0:50]
b'<!DOCTYPE html>\r\n<html>\r\n\r\n<script>\r\n '
json(响应数据)的前50个字符如下:
'{"Content":"\r\n\u003cstyle\u003e.STT,.td_action{min-width:40p
为什么不能得到正确的响应?如何修复我的代码?
要从 URL 加载数据,您可以使用下一个示例:
import requests
import pandas as pd
requests.packages.urllib3.disable_warnings()
data = {
"p_issearch": "0",
"p_keysearch": "",
"p_market_code": "",
"p_orderby": "STOCK_CODE",
"p_ordertype": "ASC",
"p_currentpage": "2", # <-- change page here
"p_record_on_page": "10"
}
url = 'https://hnx.vn/ModuleIssuer/List/ListSearch_Datas'
headers = {'X-Requested-With': 'XMLHttpRequest'}
data = requests.post(url, headers=headers, data=data, verify=False).json()
df = pd.read_html(data['Content'])[0]
print(df)
印花:
STT Mã CK Tên tổ chức phát hành Ngành Ngày GD đầu tiên Khối lượng NY KLLH (Cổ phiếu)
0 11 ATS Công ty cổ phần Tập đoàn dược phẩm Atesco Thương mại và dịch vụ lưu trú, ăn uống 29/03/2016 3.500.000 3.500.000
1 12 BAB Ngân hàng Thương mại Cổ phần Bắc Á Tài chính 03/03/2021 813.386.340 833.426.644
2 13 BAX CTCP Thống Nhất Hoạt động kinh doanh bất động sản 24/03/2017 8.200.000 8.200.000
3 14 BBS Công ty CP Vicem bao bì Bút Sơn Công nghiệp 28/12/2005 6.000.000 6.000.000
4 15 BCC CTCP Xi măng Bỉm Sơn Công nghiệp 24/11/2006 123.209.812 123.209.812
5 16 BCF CTCP Thực phẩm Bích Chi NaN 16/03/2020 27.830.412 27.830.412
6 17 BDB CTCP Sách và thiết bị Bình Định Thương mại và dịch vụ lưu trú, ăn uống 29/01/2010 1.126.474 1.126.474
7 18 BED CTCP Sách và Thiết bị trường học Đà Nẵng Thương mại và dịch vụ lưu trú, ăn uống 21/10/2009 3.000.000 3.000.000
8 19 BII CTCP Đầu tư và Phát triển Công nghiệp Bảo Thư Hoạt động kinh doanh bất động sản 22/09/2014 57.680.000 57.680.000
9 20 BKC CTCP Khoáng Sản Bắc Kạn Khai khoáng và Dầu khí 18/08/2009 11.737.728 11.737.728
根据 Andrej Kesely 的代码添加代理:
import requests
import pandas as pd
requests.packages.urllib3.disable_warnings()
proxies = {
'http': '127.0.0.1:10801',
'https': '127.0.0.1:10801',
}
data = {
"p_issearch": "0",
"p_keysearch": "",
"p_market_code": "",
"p_orderby": "STOCK_CODE",
"p_ordertype": "ASC",
"p_currentpage": "1",
"p_record_on_page": "600"
}
url = 'https://hnx.vn/ModuleIssuer/List/ListSearch_Datas'
headers = {'X-Requested-With': 'XMLHttpRequest'}
data = requests.post(url, headers=headers, data=data, verify=False, proxies=proxies).json()
df = pd.read_html(data['Content'])[0]
print(df)
虽然我得到了json,上面的代码是基于requests库的,我不能接受它作为一个正式的答案,我的问题仍然存在,为什么我的urllib库的代码不能得到json?
我会收到我之前代码修改后的决议,这是你获得积分的机会。