urllib的post请求

269 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

发送post请求

爬一下百度翻译,试试怎么才能返回正确结果 首先要先准备好url "https://fanyi.baidu.com/v2transapi?from=en&to=zh" 然后准备好data

{"from": "en", "to": "zh", "query": "cat", "transtype": "realtime", "simple_means_flag": "3",
        "sign": "661701.982004", "token": "token", "domain": "common"}

这个都是百度翻译时传的数据,然后这个data啊,需要urllib.parse.urlencode转一下,再encode一下,十分麻烦啊 返回的结果也是一个字节码。需要使用json.loads解析成utf-8格式的编码才能认识,


import urllib.request
import ssl

ssl._create_default_https_context = ssl._create_unverified_context
headers = {
    'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
    'Cookie':'xx'
}
url = "https://fanyi.baidu.com/v2transapi?from=en&to=zh"
data = {"from": "en", "to": "zh", "query": "cat", "transtype": "realtime", "simple_means_flag": "3",
        "sign": "661701.982004", "token": "471c5b3cbdada6147e8dd1d2dd0e76a0", "domain": "common"}
data = urllib.parse.urlencode(data).encode('utf-8')
print(data)
request = urllib.request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(request)
content = response.read().decode('utf-8')
import json

obj = json.loads(content)
print(obj)

如果header中不携带cookie,会返回未知错误。所以必须传入正确的cookie

爬行豆瓣网站的数据

基本流程都是一样

  1. 准备请求对象
  2. 获取响应数据
  3. 下载数据 首先让用户填写自己要抓取的开始页和结束页 根据用户选定的范围,循环遍历,然后请求多次,每次先准备数据,然后发送请求,获取数据,然后下载数据到本地保存为json文件。当循环结束,程序也就执行完成。数据保存完毕
if __name__=='__main__':
    start_page=int(input('起始的页码'))
    end_page=int(input('请输入结束的页码'))
    for page in range(start_page,end_page):
        request = creat_request(page)
        content = get_content(request)
        donw_load(content, page)

定制请求的request对象。封装成一个function

def creat_request(page):
    headers = {
        'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36",
    }
    baseurl = "https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action="
    data = {
        'start': (page - 1) * 20,
        'limit': 20
    }
    data = urllib.parse.urlencode(data)
    url = baseurl + data
    request = urllib.request.Request(url=url, headers=headers)
    return request

发送请求也是封装成一个函数,接受上一个函数的返回值作为参数,把上面的请求对象当成这个请求对象参数,然后获取响应数据,直接返回回去

def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content

再定义一个解析函数。把上面得到的结果转换成文本并且写入到文件系统中。所有的数据都保存成json文件。到此,程序执行完毕。

def donw_load(content, page):
    with open('douban' + str(page) + '.json', 'w', encoding='utf-8') as fp:
        fp.write((content))

上面就是完整的豆瓣分页获取电影的代码啦。