三、爬虫实战二(requests模块)

三、爬虫实战二(requests模块)

1. 需求:

  • 获取某个单词或某个句子的翻译结果(不再是整张页面而是局部的数据)【可以用也可以不用数据解析】
  • 百度翻译:当你在输入框输入信息,这里页面是做了局部的刷新,会自动的进行Ajax请求,Ajax请求成功之后,会将我们页面中局部的内容进行刷新。

请添加图片描述

  • XHR:是Ajax请求对应的数据包

  • 请添加图片描述

  • 我们发现:每录入一个字符,会对应的给这个字符发起ajax请求。当前是“cat”,三个字符,发起三个ajax请求,每个ajax请求对应的是每一个字符对应的翻译结果。

  • 最终我们要拿到“cat”这三个字符的翻译结果,所以我们要拿到第三个sug所对应的ajax请求数据包。

  • 确定哪一个数据包才是我们要捕获的数据包。

  • 拿到数据包后,就可以拿到此数据包对应的url,并且这个请求是个POST请求,POST请求还携带了一个参数,这个参数是cat

请添加图片描述

  • 由Response Headers中的Content-Type: application/json 可以知道服务器端响应回来的数据类型是json串

请添加图片描述

(1) 总结

  • POST请求(携带了参数)
  • 响应数据是一组json数据

2.代码实践:解析在代码中

# UA伪装需要替换
import requests
import json
# 1 url 地址 从抓包工具中获取到
url = 'https://fanyi.baidu.com/sug'
# 2 进行UA伪装
headers = {
    'User-Agent':'Mozilla。。。。。'
}
# data 封装post需携带的参数 这里我们用一个字典
# 3 post请求参数处理(同get请求一致)
keywords = input('请输入要查询的英文: ')
data = {
    'kw':keywords
}
# 4 请求发送,获得响应数据
# data 携带的参数
# 请求的URL、请求头(request headers)以及请求的表单data信息
response = requests.post(url, data = data, headers = headers)
# 5 获取响应数据:json()方法返回的是python中字典对象obj(如果确认响应数据是json类型的,才可以使用json())
dic_obj = response.json()
print(dic_obj)

# json.loads()是将json格式对象,转化Python可识别的字典对象。
# 解码python json格式,可以用这个模块的json.loads()函数的解析方法。
# 2、json.dumps()是将一个Python数据类型列表进行json格式的编码解析,可以将一个list列表对象,进行了json格式的编码转换。

# 3、json.dump和json.dumps很不同,json.dump主要用来json文件读写,和json.load函数配合使用。

# 持久化存储 (存在json的文本文件中)
filename = './' + keywords + '.json'
fp = open(filename, 'w', encoding='utf-8') # 存储前要打开文件

# json dump 将字典对象以json格式存储json文件
json.dump(dic_obj, fp = fp, ensure_ascii=False) # 因为涉及到中文,而中文不能用ASCII码编码,所以这里要“关掉”

print('结束============')

'''
    def json(self, **kwargs):
        r"""Returns the json-encoded content of a response, if any.

        :param \*\*kwargs: Optional arguments that ``json.loads`` takes.
        :raises requests.exceptions.JSONDecodeError: If the response body does not
            contain valid json.
        """

        if not self.encoding and self.content and len(self.content) > 3:
            # No encoding set. JSON RFC 4627 section 3 states we should expect
            # UTF-8, -16 or -32. Detect which one to use; If the detection or
            # decoding fails, fall back to `self.text` (using charset_normalizer to make
            # a best guess).
            encoding = guess_json_utf(self.content)
            if encoding is not None:
                try:
                    return complexjson.loads(
                        self.content.decode(encoding), **kwargs
                    )
                except UnicodeDecodeError:
                    # Wrong UTF codec detected; usually because it's not UTF-8
                    # but some other 8-bit codec.  This is an RFC violation,
                    # and the server didn't bother to tell us what codec *was*
                    # used.
                    pass

        try:
            return complexjson.loads(self.text, **kwargs)
        except JSONDecodeError as e:
            # Catch JSON-related errors and raise as requests.JSONDecodeError
            # This aliases json.JSONDecodeError and simplejson.JSONDecodeError
            if is_py2: # e is a ValueError
                raise RequestsJSONDecodeError(e.message)
            else:
                raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
                
# .json() 返回Python可识别的字典对象  complexjson.loads(self.text, **kwargs)
'''

# 将一个JSON编码的字符串转换回一个Python数据结构
# 要处理的是文件而不是字符串,你可以使用 json.dump() 和 json.load() 来编码和解码JSON数据
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值