为什么不能得到 json 作为正确的响应?

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

用浏览器打开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

为什么不能得到正确的响应?如何修复我的代码?

json python-3.x web-scraping response
2个回答
0
投票

要从 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

0
投票

根据 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?
我会收到我之前代码修改后的决议,这是你获得积分的机会。

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