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 jsonkey = 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=https://www.it610.com/article/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=https://www.it610.com/article/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'])

【Python爬虫 Day 4】(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)

    推荐阅读