关于#python#的问题:尝试爬一下江西药监局做练习

刚开始学爬虫,尝试爬一下江西药监局做练习,如下是代码:

import json

import requests

if __name__ == '__main__':
    url = 'http://zhjg.mpa.jiangxi.gov.cn/yjlic-search-svr/search/list'
    headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76'
    }
    data = {
        'pageNumber': '1',
        'pageSize': '10',
        'lictypeid': "CO_PRO_XK",
        'status': "1"
    }
    page_json = requests.post(url = url, headers = headers,data=data).json()
    with open('./yaojian.json','w',encoding='utf-8') as fp:
        json.dump(page_json,fp,ensure_ascii=False)
    print("over!!!")

但结果是:{"code": 500, "msg": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported", "data": null},不知道如何解决

【以下回答由 GPT 生成】

这个问题是因为客户端请求中的Content-Type被服务器拒绝了。根据错误信息,服务器不支持Content-Type为'application/x-www-form-urlencoded;charset=UTF-8'。要解决这个问题,可以尝试以下几种方法:

  1. 使用requests库发送POST请求时,可以将请求数据通过json参数传递,而不是通过data参数传递。修改代码如下:
import json
import requests

if __name__ == '__main__':
    url = 'http://zhjg.mpa.jiangxi.gov.cn/yjlic-search-svr/search/list'
    headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76',
        "Content-Type": "application/json"
    }
    data = {
        'pageNumber': '1',
        'pageSize': '10',
        'lictypeid': "CO_PRO_XK",
        'status': "1"
    }
    page_json = requests.post(url=url, headers=headers, json=data).json()
    with open('./yaojian.json', 'w', encoding='utf-8') as fp:
        json.dump(page_json, fp, ensure_ascii=False)
    print("爬取完成!")

在修改后的代码中,将headers中的Content-Type设置为application/json,并且使用json参数传递请求数据。

  1. 如果第一种方法不起作用,可以尝试手动设置Content-Type为其他类型,例如application/x-www-form-urlencoded。修改代码如下:
import json
import requests

if __name__ == '__main__':
    url = 'http://zhjg.mpa.jiangxi.gov.cn/yjlic-search-svr/search/list'
    headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76',
        "Content-Type": "application/x-www-form-urlencoded"
    }
    data = {
        'pageNumber': '1',
        'pageSize': '10',
        'lictypeid': "CO_PRO_XK",
        'status': "1"
    }
    page_json = requests.post(url=url, headers=headers, data=data).json()
    with open('./yaojian.json', 'w', encoding='utf-8') as fp:
        json.dump(page_json, fp, ensure_ascii=False)
    print("爬取完成!")

在修改后的代码中,将headers中的Content-Type设置为application/x-www-form-urlencoded,并保持data参数不变。

  1. 如果以上方法都无效,说明服务器可能不支持直接通过POST请求提交表单数据。这种情况下,你可以尝试模拟表单提交,将数据以字符串的形式放在POST请求的body中,并且Content-Type设置为application/x-www-form-urlencoded。修改代码如下:
import json
import requests

if __name__ == '__main__':
    url = 'http://zhjg.mpa.jiangxi.gov.cn/yjlic-search-svr/search/list'
    headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.76',
        "Content-Type": "application/x-www-form-urlencoded"
    }
    data = 'pageNumber=1&pageSize=10&lictypeid=CO_PRO_XK&status=1'
    page_json = requests.post(url=url, headers=headers, data=data.encode('utf-8')).json()
    with open('./yaojian.json', 'w', encoding='utf-8') as fp:
        json.dump(page_json, fp, ensure_ascii=False)
    print("爬取完成!")

在修改后的代码中,将data参数修改为以字符串形式表示的表单数据,并将其编码为utf-8格式。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^