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'))
但是每次在访问需要cookie的页面都要从浏览器中复制cookie比较麻烦。Python处理cookie,一般是通过http.cookiejar模块和urllib模块的HTTPCookieProcessor处理器类一起使用。http.cookiejar模块主要作用是提供用于存储cookie的对象。而HTTPCookieProcessor处理器主要作用是处理这些cookie对象,并构建handler对象。

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的更多相关文章

  1. 爬虫03 /代理、cookie处理、模拟登录、提升爬虫效率

    爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 目录 爬虫03 /代理.cookie处理.模拟登录.提升爬虫效率 1. 代理 2. cookie处理 3. 模拟登录 4. 如何提升爬取数据 ...

  2. Python 爬虫的代理 IP 设置方法汇总

    本文转载自:Python 爬虫的代理 IP 设置方法汇总 https://www.makcyun.top/web_scraping_withpython15.html 需要学习的地方:如何在爬虫中使用 ...

  3. python爬虫构建代理ip池抓取数据库的示例代码

    爬虫的小伙伴,肯定经常遇到ip被封的情况,而现在网络上的代理ip免费的已经很难找了,那么现在就用python的requests库从爬取代理ip,创建一个ip代理池,以备使用. 本代码包括ip的爬取,检 ...

  4. 爬虫-设置代理ip

    1.为什么要设置代理ip 在学习Python爬虫的时候,经常会遇见所要爬取的网站采取了反爬取技术导致爬取失败.高强度.高效率地爬取网页信息常常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网 ...

  5. 爬虫前奏——代理ip的使用

    如果同一个IP短时见内多次访问统一网页,可能会被系统识别出是爬虫,因此使用代理IP可以很大程度上解决这一问题 常用的代理有: 西刺免费代理:www.xicidaili.com 快代理:www.kuai ...

  6. node.js 爬虫动态代理ip

    参考文章: https://andyliwr.github.io/2017/12/05/nodejs_spider_ip/ https://segmentfault.com/q/10100000081 ...

  7. Python实现爬虫设置代理IP和伪装成浏览器的方法(转载)

    https://www.jb51.net/article/139587.htm chrome_options = webdriver.ChromeOptions() chrome_options.ad ...

  8. 实用爬虫-02-爬虫真正使用代理 ip

    实用爬虫-02-爬虫真正使用代理 ip 因为这里呢,是实用爬虫,想要仔细学习一些基础的,可以去查看: Python 爬虫教程:https://www.cnblogs.com/xpwi/category ...

  9. 数据解析,懒加载,代理ip

    在前面的requests流程中,还缺少了一步重要的流程,就是在持久化存储之前需要进行制定的数据解析.因为在大多数情况下,我们都会使用聚焦爬虫,也就是爬取页面中的指定部分数据值,而不是整个页面的数据. ...

随机推荐

  1. 使用Xdroid进行端口映射,出现adb server version (36) doesn't match this client (39); killing...的解决方案

    第一反应就是adb冲突了,因为Xdroid这个产品看起来就不像是给开发人员用的模拟器,因为不能选择各种版本进行适配,所以肯定自带了一个adb. whereis命令发现果然有两个adb,一个直接是安装在 ...

  2. linux hwclock

    在Linux中,系统时间(软件时间)和硬件时间,并不会自动同步,系统时间和硬件时间以异步的方式运行,互不干扰.硬件时间的运行,是靠Bios电池来维持,而系统时间,是在系统开机的时候,会自动从Bios中 ...

  3. Java基础IO类之字节输入输出流

    一.IO流概述 1.IO流:输入输出流(Input/Output) 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在设备间的传输流, 流的本质是数据传输,根据数据传输特性将 ...

  4. JDK1.8新特性(一):stream

    一.什么是stream? 1.概述 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管 ...

  5. Mac OS 终端利器 iTerm2(怕以后找不到,自存自用)

    之前一直使用 Mac OS 自带的终端,用起来虽然有些不太方便,但总体来说还是可以接受的,是有想换个终端的想法,然后今天偶然看到一个终端利器 iTerm2,发现真的很强大,也非常的好用,按照网上配置了 ...

  6. 使用IDEA创建SpringMVC项目

    作为一名从.NET转Java的小渣渣,之前都是听说Java配置复杂,今天算是见识到了.甚是怀念宇宙第一IDE VS和.NET高效的开发. 网上大多教程是基于Eclipse的,即使按照IDEA的教程做, ...

  7. 不要再造轮子了:聊一聊 JavaScript 的 URL 对象是什么?

    本文由葡萄城技术团队于博客园翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 如果我们自己编写从URL中分析和提取元素的代码,那么有可能会比较痛苦 ...

  8. MATLAB中cell函数用法

    cell元包是matlab中提供的一种数据类型,功能强大. 关于cell的创建: 1.跟一般创建举证一样,直接使用C = {A B D E}这种形式,不过这里把"[]"改成了}&q ...

  9. 【JMX】jmx结合jmx_exporter实现promethues监控

    JMX JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理.监控正在运行中的Java程序.常用于管理线程,内存,日志Lev ...

  10. 【HUAWEI Mate30】抽奖啦!华为IoT新福利上线!

    华为云OceanConnect IoT云服务包括应用管理.设备管理.系统管理等能力,实现统一安全的网络接入.各种终端的灵活适配.海量数据的采集分析,从而实现新价值的创造. 华为云OceanConnec ...