爬虫(五):代理IP、Cookie
1. 代理IP
代理IP这个功能呢,在urllib和requests中都存在,但是这个在大的爬虫项目中是非常重要的,所以我拿出来单独讲解。
对于某些网站,如果同一个 IP 短时间内发送大量请求,则可能会将该 IP 判定为爬虫,进而对该 IP 进行封禁
所以我们有必要使用随机的 IP 地址来绕开这一层检查。我们可以去找那些提供免费IP地址的网站,但是这些网站的免费代理IP基本上是不稳定的,随时可能会更新,如果是自己小规模的爬取,可以使用免费代理IP。如果是那种大型的,就需要付费代理IP了。
1.1 urllib使用IP代理
import urllib.request
import random
ip_list = [
{'http':'61.135.217.7:80'},
{'http':'182.88.161.204:8123'}
]
proxy_handler = urllib.request.ProxyHandler(random.choice(ip_list))
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('https://www.httpbin.org/ip')
print(response.read().decode('utf-8'))
结果:

1.2 requests使用IP代理
使用requests添加代理也非常简单,只要在请求的方法中(比如get或者post)传递proxies参数就可以了。
import requests
url = 'https://httpbin.org/get'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
proxy = {
'http':'222.217.124.162:8118'
}
resp = requests.get(url,headers=headers,proxies=proxy)
with open('ip.html','w',encoding='utf-8') as fp:
fp.write(resp.text)
结果:
ip.html:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
},
"origin": "183.14.76.230, 183.14.76.230",
"url": "https://httpbin.org/get"
}
2. cookie
我以前学java的时候学过cookie了,一直以为自己博客中也写了,这里就来补充一下cookie基础知识了。
2.1 什么是cookie
在网站中,http请求是无状态的,也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能做到当前请求的是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二层请求的时候,就会自动的把上一次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是谁了。cookie存储的数据量邮箱,不同的浏览器有不同的存储大小,但一般不超过4KB,因此使用cookie只能存储少量的数据。
cookie的格式:
Set-Cookie: NAME=VALUE; Expires/Max-age=DATE; Path=PATH; Domain=DOMAIN_NAME; SECURE
参数意义:
NAME:cookie的名字。
VALUE:cookie的值。
Expires:cookie的过期时间。
Path:cookie作用的路径。
Domain:cookie作用的域名。
SECURE:是否只在https协议下起作用。
2.2 urllib操作cookie
一些需要登录的网站,实际上就是因为没有cookie信息。我们想要用代码的形式访问这种网站,就必须要有正确的cookie信息才能访问。
最简单的方法就是先使用浏览器,然后用抓包软件将数据包中的cookie信息复制下来,放到headers中。
from urllib import request targetUrl = 'http://www.baidu.com/'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
"Cookie": "BAIDUID=734868BB44ACDCE4FB2C49DB3AA14669:FG=1 for .baidu.com,BIDUPSID=734868BB44ACDCE4FC561F4D84999535 for .baidu.com,H_PS_PSSID=1429_21101_30211 for .baidu.com,PSTM=1576550373 for .baidu.com,delPer=0 for .baidu.com,BDSVRTM=0 for www.baidu.com,BD_HOME=0 for www.baidu.com"
}
reqObj = request.Request(url=targetUrl, headers=headers)
resp = request.urlopen(reqObj)
print(resp.read().decode('utf-8'))
http.cookiejar模块主要的类有 CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。这四个类的作用分别如下:
CookieJar
管理HTTPcookie的值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
FileCookieJar (filename, delayload=None, policy=None)
从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问文件,即只有在需要时才读取文件或在文件中存储数据。
MozillaCookieJar (filename, delayload=None, policy=None)
从FileCookieJar派生而来,创建与Mozilla浏览器cookies.txt兼容的FileCookieJar实例。
LWPCookieJar (filename, delayload=None, policy=None)
从FileCookieJar派生而来,创建与libwww-per标准的Set-Cookie3文件格式兼容的FileCookieJar实例。
利用http.cookiejar和request.HTTPCookieProcessor获取Cookie:
import urllib.request
import http.cookiejar
cookie = http.cookiejar.CookieJar()
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(cookie_handler)
response = opener.open('http://www.baidu.com/')
for item in cookie:
print(item.name + '=' + item.value)

保存Cookie到本地文件,并调用本地文件来进行请求:
import urllib.request
import http.cookiejar # 将 Cookie 保存到文件
cookie = http.cookiejar.MozillaCookieJar('cookie.txt')
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(cookie_handler)
response = opener.open('http://www.baidu.com/')
cookie.save(ignore_discard=True,ignore_expires=True) # 从文件读取 Cookie 并添加到请求中
cookie2 = http.cookiejar.MozillaCookieJar()
cookie2 = cookie2.load('cookie.txt',ignore_discard=True,ignore_expires=True)
cookie_handler = urllib.request.HTTPCookieProcessor(cookie2)
opener = urllib.request.build_opener(cookie_handler)
response = opener.open('http://www.baidu.com/')
# 此时已经得到带有 Cookie 请求返回的响应

2.3 requests操作cookie
和代理IP一样,如果响应中包含了cookie,那么可以利用cookies属性拿到这个返回的cookie值。
import requests
url = 'http://www.httpbin.org/cookies'
cookies = {
'name1':'value1',
'name2':'value2'
}
response = requests.get(url=url,cookies=cookies)
print(response.text)

session:
urllib库,是可以使用opener发送多个请求,多个请求之间是可以共享cookie的。那么如果使用requests,也要达到共享cookie的目的,那么可以使用requests库给我们提供的session对象。注意,这里的session不是Web开发中的那个session,这个地方只是一个会话的对象而已。import requests
url = 'http://www.httpbin.org/cookies'
cookies = {
'name1':'value1',
'name2':'value2'
}
session = requests.session()
response = session.get(url=url,cookies=cookies)
print(response.text)

爬虫(五):代理IP、Cookie的更多相关文章
- 爬虫03 /代理、cookie处理、模拟登录、提升爬虫效率
爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 目录 爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 1. 代理 2. cookie处理 3. 模拟登录 4. 如何提升爬取数据 ...
- Python 爬虫的代理 IP 设置方法汇总
本文转载自:Python 爬虫的代理 IP 设置方法汇总 https://www.makcyun.top/web_scraping_withpython15.html 需要学习的地方:如何在爬虫中使用 ...
- python爬虫构建代理ip池抓取数据库的示例代码
爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...
- 爬虫-设置代理ip
1.为什么要设置代理ip 在学习Python爬虫的时候,经常会遇见所要爬取的网站采取了反爬取技术导致爬取失败.高强度.高效率地爬取网页信息常常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网 ...
- 爬虫前奏——代理ip的使用
如果同一个IP短时见内多次访问统一网页,可能会被系统识别出是爬虫,因此使用代理IP可以很大程度上解决这一问题 常用的代理有: 西刺免费代理:www.xicidaili.com 快代理:www.kuai ...
- node.js 爬虫动态代理ip
参考文章: https://andyliwr.github.io/2017/12/05/nodejs_spider_ip/ https://segmentfault.com/q/10100000081 ...
- Python实现爬虫设置代理IP和伪装成浏览器的方法(转载)
https://www.jb51.net/article/139587.htm chrome_options = webdriver.ChromeOptions() chrome_options.ad ...
- 实用爬虫-02-爬虫真正使用代理 ip
实用爬虫-02-爬虫真正使用代理 ip 因为这里呢,是实用爬虫,想要仔细学习一些基础的,可以去查看: Python 爬虫教程:https://www.cnblogs.com/xpwi/category ...
- 数据解析,懒加载,代理ip
在前面的requests流程中,还缺少了一步重要的流程,就是在持久化存储之前需要进行制定的数据解析.因为在大多数情况下,我们都会使用聚焦爬虫,也就是爬取页面中的指定部分数据值,而不是整个页面的数据. ...
随机推荐
- .NET高级特性-Emit(2.2)属性
关于Emit的博客已经进入第四篇,在读本篇博文之前,我希望读者能先仔细回顾博主之前所编写的关于Emit的博文,从该篇博文开始,我们就可以真正的使用Emit,并把知识转化为实战,我也会把之前的博文链接放 ...
- ganglia 一站式部署
1 ganglia集群监测系统简介 1.1 ganglia简介 ganglia是一款为HPC(高性能计算) 集群设计的可扩展性 的分布式监控系统,它可以监视和显示集群中节点的各种状 ...
- 【Android - 进阶】之Animation补间动画
补间动画也叫View动画,它只能针对View进行动画操作,且补间动画操作的只是View中可见的部分,即只操作界面,对于可点击区域等都不会进行操作. 在Android中,补间动画的顶级类是Animati ...
- 【RN - 基础】之FlexBox弹性布局
前言 弹性盒模型(The Flexible Box Module),又叫FlexBox,意为“弹性布局”,旨在通过弹性的方式来对齐和分布容器中内容的空间,使其能适应不同的屏幕,为盒装模型提供最大的灵活 ...
- 05-kubernetes Pod控制器应用进阶
目录 Pod 资源 标签 给资源打标签 标签选择器 Pod 生命周期 实际操作 livenessProbe 实战 livenessProbe exec 测试 livenessProbe httpGet ...
- Kafka topic Schema version mismatch error - org.apache.kafka.common.protocol.types.SchemaException
Problem description: There is error messge when run spark app using spark streaming Kafka version 0. ...
- 使用生成对抗网络(GAN)生成手写字
先放结果 这是通过GAN迭代训练30W次,耗时3小时生成的手写字图片效果,大部分的还是能看出来是数字的. 实现原理 简单说下原理,生成对抗网络需要训练两个任务,一个叫生成器,一个叫判别器,如字面意思, ...
- webpack4.0安装及使用(一)
前言 1.什么是webpack 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建 ...
- KETTLE教程实战
kettle初探 Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定.Kettle 中文名称叫水壶,该项目的主程 ...
- 小白学 Python 爬虫(15):urllib 基础使用(五)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...