Python爬虫 Day 4

爬虫网络请求模块Urllib案例补充+Requests上

有道翻译

1. 学习目标
(1)学习使用urllib发送post请求
(2)与requests模块进行对比
(3)制作翻译小软件
2. 学习思路
(1)获得目标url: XHS界面
(2)向目标url发送请求,得到响应
(3)得到数据之后进行数据分析
3. 注意事项
(1)如果urllib发送post请求需要携带数据data 有中文需要提前处理 携带的数据类型必须是bytes 还要注意编码方式
(2)有道翻译中的目标url需要删去_o
(3)使用json解析数据 可以将json类型的字符串转换为python类型的字典

Requests模块

1.安装方式
windows+R --> cmd --> pip install requests -i https://pypi.tuna.tsinghua.ed... (清华源,也可以选择其他)
2.Requests模块与Urllib模块的对比
(1)requests模块不需要处理中文
(2)requests模块不需要拼接url地址
(3)requests直接用get方式就可以传递headers
3.requests.get()与requests.post()

Requests设置代理ip

1.作用
(1)隐藏真实的ip
(2)反爬策略
2.匿名度级别
(1)透明 服务器知道你使用了代理ip 并且知道你的真实ip
(2)匿名 服务器知道你使用了代理ip 但不知道你的真实ip
(3)高匿 服务器不知道你使用了代理ip 也不知道你的真实ip
3.如何查询ip
(1)windows+R --> cmd --> ipconfig 内网ip 私有的地址 局域网
(2)https://www.ipip.net/或者http://httpbin.org/ip 外网ip 能够用于上网

代码

(1)代码 translation
使用urllib发送post请求制作翻译小软件

from urllib import request
from urllib import parse
import json

key = input('请输入要翻译的内容:')
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
# 目标url
url = 'https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# 需要先在搜索框中输入 奥运会等词 然后进行检查 选择XHR界面
# https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule 中的_o需要删去
# 需要数据data 同时将找到的数据转换为字典格式 (正则)
data1 = {
    'i': key,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '16286645140562',
    'sign': '89f380e8a9fec83b350152556662570b',
    'lts': '1628664514056',
    'bv': 'e8f74db749b4a06c7bd041e0d09507d4',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}
data2 = parse.urlencode(data1)
data3 = bytes(data2, encoding='utf-8')

# 1.创建请求对象
req = request.Request(url, headers=header)
# 2.发送请求 获取响应
res = request.urlopen(req, data=data3)  # 携带数据
# 3.获取响应对象的内容
html = res.read().decode('utf-8')

# json.loads() 可以将json类型的字符串 转换为python类型的字典
trans_dict = json.loads(html)
translateResult = trans_dict['translateResult']
print(translateResult[0][0]['tgt'])

(2)代码 requests_get(requests的入门)

import requests

# 目标url = 'https://tieba.baidu.com/f?kw=%E5%A5%A5%E8%BF%90%E4%BC%9A&pn=50'

# 第一种方式
url = 'https://tieba.baidu.com/f?'
# # url为基准的url 不包含任何参数
params = {
    'kw': '奥运会',
    'pn': '50',
}
# params以键值对的形式来添加参数
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
r = requests.get(url, params=params, headers=headers)
print(r.text)

# 第二种方式
url = 'https://qq.yh31.com/zjbq/2920180.html'  # 特殊而好玩的网站
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
res = requests.get(url, headers=header)
res.encoding = 'utf-8'
print(type(res.text), res.text)  # str

"""
res.content 直接从网上抓取数据 没有做任何的处理 没有做任何的解码 二进制

res.text 是requests模块将res.content解码之后得到的字符串 requests,模块会猜一个解码方式 有可能对 有可能不对 encoding
"""

(3)代码 requests_post(有道翻译)

import requests
import json

# 目标url
url = 'https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
key = input('请输入要翻译的内容:')
data1= {
    'i': key,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '16282514891344',
    'sign': 'af688b091ae35b8aa6fca61de6417e58',
    'lts': '1628251489134',
    'bv': '5b3e307b66a6c075d525ed231dcc8dcd',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME',
}

res = requests.post(url, data=data1, headers=header)
html = res.content.decode('utf-8')
# json.loads() 可以将json类型的字符串 转换为python类型的字典
trans_dict = json.loads(html)
translateResult = trans_dict['translateResult']
print(translateResult[0][0]['tgt'])

(4)代码 requests_ip 设置代理ip

import requests
import random

# 单个ip
url = 'http://httpbin.org/ip'  # 查询外网ip的网站
proxy = {
    'https': '219.159.38.198:56210'  # 是需要https是吗? 为什么老师的是http?
}

res = requests.get(url, proxies=proxy)
print(res.text)

# 多个ip
ips = [('180.113.13.110:5412'), ('36.62.195.231:36410'), ('100.127.77.167:36410'), ('117.57.22.179:36410')]
for i in range(4):
    try:
        proxy = random.choice(ips)
        res = requests.get(url, proxies={'https': proxy}, timeout=0.3)
        print(res.text)
    except Exception as e:
        print('出现异常:', e)

你可能感兴趣的:(爬虫)