数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.youkuaiyun.com/grd_java/article/details/140574349 |
---|
一、安装和基本使用
1. 安装
- 和解析库urllib几乎一摸一样,但是有些业务场景,用request更加方便
最好对比utllib学习:https://blog.youkuaiyun.com/grd_java/article/details/140589367
企业中用的最多的就是requests,底层实现就是urllib,在python2和python3中通用,方法完全一样;简单易用
安装requests |
---|
- 执行命令pip install requests即可安装
- 代码中导包不报错表示安装成功
2. 基本使用
基本使用 |
---|
'''导包(start)'''
import requests
'''导包(end)'''
url = 'http://www.baidu.com'
# 通过get方式请求url
response = requests.get(url)
# 设置编码格式
response.encoding = 'utf-8'
# response对象的类型为Response类型,和urllib的HttpResopnse对象是不一样的
print(type(response))
# 以字符串形式返回网页源码
print(response.text)
# 获取响应状态码
print(response.status_code)
# 获取请求的url
print(response.url)
# 获取响应头
print(response.headers)
# 获取响应的字节类型
print(response.content)
3. response常用属性
response.text # 响应体 str类型
response.encoding #从HTTP header中猜测的响应内容的编码方式
respones.content #响应体bytes类型
response.status_code #响应状态码
response.request.headers #响应对应的请求头
response.headers #响应头
response.cookies #响应的cookie(经过了set-cookie动作)
response.url #获取访问的url
response.json() #获取ison数据 得到内容为字典(如果接口响应体的格式是ison格式时)
response.ok
# 如果status code小于200,response.ok返回True。
# 如果status code大于200,response.ok返回False.
response.text和response.content的区别
- response.text
- 类型:str
- 解码类型: requests模块自动根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
- 如何修改编码方式:response.encoding=“gbk/UTF-8”
- response.content
- 类型:bytes
- 解码类型:没有指定
- 如何修改编码方式:response.content.deocde(“utf8")
获取网页源码的通用方式:
- response.content.decode()
- response.content.decode(“UTF-8”)
- response.text
以上三种方法从前往后尝试,能够100%的解决所有网页解码的问题。所以,更推荐使用 response.content.deocde()的方式获取响应的html页面
二、get请求
同样是百度,例如百度北京看搜索结果。requests库作为独属于python的,是不需要像urllib一样对参数编码的
'''导包(start)'''
import requests
'''导包(end)'''
url = 'http://www.baidu.com/s?' # 路径中的?可加可不加
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"}
data = {
'wd':'北京'
}
# def get(url, params=None, **kwargs):
# url 请求资源路径
# params 参数
# kwargs 字典
response = requests.get(url=url, params=data, headers=headers)
response.encoding = 'utf-8'
content = response.text
print(content)
# 也可以一行搞定哦
print(response.content.decode('utf-8'))
可见对比urllib有以下几点不同
- 参数使用params传递
- 参数无需urlencode编码
- 不需要请求对象的定制
- 请求资源路径(url)中的?可以加也可以不加
把网络上的图片(例如www.baidu.com的图片,随便找一张)保存到本地
'''导包(start)'''
import requests
'''导包(end)'''
url = 'https://inews.gtimg.com/om_bt/O6SG7dHjdG0kWNyWz6WPo2_3v6A6eAC9ThTazwlKPO1qMAA/641'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"}
# 响应体为二进制文件
response = requests.get(url = url, headers=headers)
# 二进制写入的方式打开文件
with open('test.png','wb') as fp:
# 写入response.content bytes 二进制类型
fp.write(response.content)
三、post请求
我们使用讲解urllib中的百度翻译的案例,看看实现同样的效果和urllib有何区别
- post请求,不需要编解码
- 请求参数是经典的data
- 不需要请求对象的定制
'''导包(start)'''
import requests
'''导包(end)'''
url = 'https://fanyi.baidu.com/sug'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"}
data = {
"kw":"spider"
}
# def post(url, data=None, json=None, **kwargs):
# url 请求资源路径
# data 参数对象
# json json对象
# kwargs 字典
# 我们以传输data对象为例,传输json同理,将data换成json即可
response = requests.post(url=url, data=data, headers=headers)
content = response.text
# 因为content返回的不是utf-8编码格式,我们看起来比较费劲
# 通过json库将其转为utf-8
import json
obj = json.loads(content)
print(obj)
四、代理
依然和urllib完全一样的操作
'''导包(start)'''
import requests
'''导包(end)'''
url = 'http://www.baidu.com/s?'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"}
data = {
"wd":"ip"
}
# 1. 获取代理handler对象,并指定代理ip字典proxies
proxies = {
'http': '218.87.205.38:20433',
}
'''
# 多个ip地址
proxy = [
{'http':'http://***.***.***.***:8080'},
{'http':'http://***.***.***.***:8080'}
]
import random
proxy = random.choice(proxy)
'''
response = requests.get(url = url, params=data, headers=headers,proxies=proxies)
content = response.text
with open('daili.html','w',encoding='utf-8') as fp:
fp.write(content)
1. 什么是代理
- 让服务器以为不是同一个客户端在请求
- 防止我们真实地址被泄露,防止被追究(国家机密网站用了代理也没用,分分钟人肉你。包括淘宝支付宝等,只要你在国内,干了违法事情,用什么都白费)
正向代理和反向代理的区别 |
---|
- 没有代理之前,直接使用浏览器向服务器请求数据。
- 反向代理是服务器端找代理,而不是我们访问者找代理。我们只能找到nginx(不是非nginx不可,只是他用的比较多,提供了负载均衡等功能),然后由nginx转发到对应服务器。浏览器不知道服务器的真实地址
- 正向代理:我们通过代理ip访问服务器。对于浏览器,是知道服务器的真实地址的,例如VPN
- 正向代理:是客户端与正向代理客户端在同一局域网,客户端发出请求,正向代理 替代客户端向服务器发出请求。服务器不知道谁是真正的客户端,正向代理隐藏了真实的请求客户端。
- 反向代理:服务器与反向代理在同一个局域网,客服端发出请求,反向代理接收请求,反向代理服务器会把我们的请求分转发到真实提供服务的各台服务器,Nginx就是性能非常好的反向代理服务器,用来做负载均衡
根据代理ip的匿名程度,代理ip可以分为 |
---|
- 透明代理(Transparent Proxy)
- 客户端根本不需要知道有代理服务器的存在,但是它传送的仍然是真实的IP
- 对方服务器是可以知道你使用了代理的,并且他们也知道你的真实IP。你要想隐藏的话,不要用这个。
- 他们将你的真实IP发送给了对方服务器,所以无法达到保护真实信息的目的
- 匿名代理(Anonymous Proxy):
- 隐藏了您的真实IP,但是访问对象可以检测是使用代理服务器访问他们的
- 会改变我们的请求信息,服务器端有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,当然某些能够侦测ip的网页也是可以查到你的ip。
高匿代理(Elite proxy或High Anonymity Proxy)
- 不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,完全用代理服务器的信息替代了您的所有信息
- 就象您就是完全使用那台代理服务器直接访问对象,同时服务器端不会认为我们使用了代理。IPDIEA覆盖全球240+国家地区ip高匿名代理不必担心被追踪
代理IP使用的注意点 |
---|
- 反反爬
- 使用代理ip是非常必要的一种 反反爬 的方式
- 但是即使使用了代理ip,对方服务器任然会有很多的方式来检测我们是否是一个爬虫
- 一段时间内,检测IP访问的频率,访问太频繁会屏蔽
- 检查Cookie,User-Agent,Referer等header参数,若没有则屏蔽
- 服务方购买所有代理提供商,加入到反爬虫数据库里,若检测是代理则屏蔽所以更好的方式在使用代理ip的时候使用随机的方式进行选择使用,不要每次都用一个代理ip
- 代理ip池的更新
购买的代理ip很多时候大部分(超过60%)可能都没办法使用,这个时候就需要通过程序去检测哪些可用,把不能用的删除掉。
- 代理服务器平台的使用:参考urllib文章中给出的
- 免费的也有,但大多不能用,下面给出一些常用的免费平台
- http://www.66ip.cn
- https://www.zdaye.com
- https://www.kuaidaili.com/free
2. 测试ip
要记住http://httpbin.org/这个网站,可以进行很多测试
而我们爬虫测试ip时,直接访问http://httpbin.org/ip即可
'''导包(start)'''
import requests
'''导包(end)'''
url = 'http://httpbin.org/ip'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0"}
proxy = {'http':'185.101.16.52:80'}
# 响应体为二进制文件
response = requests.get(url = url, headers=headers,proxies=proxy)
print(response.text)