在日常爬虫中我们经常会遇到一些目标网站需要带上cookie才能获取数据,cookie指某些网站为了辨别用户身份、进行sessionn跟踪而储存在用户本地终端上的数据(通常经过加密)。
举个例子,某些网站是需要登录后才能得到你想要的信息的,不登陆只能是游客模式,那么我们可以利用Urllib2库保存我们以前登录过的Cookie,之后载入cookie获取我们想要的页面,然后再进行抓取。所以cookie主要是为我们快捷模拟登录抓取目标网页做出准备。一般来说我们实现请求大致也有两种方式,第一种是selenium,第二种是包含requests,urllib等的其他类型,那么cookie的获取也是针对这样的结构而言的。比如这里我们可以利用selenium+phantomjs无界面浏览器的形式访问网站,再获取cookie值:
from selenium import webdriver
driver=webdriver.PhantomJS()
url="https://et.xiamenair.com/xiamenair/book/findFlights.action?lang=zh&tripType=0&queryFlightInfo=XMN,PEK,2018-01-15"
driver.get(url)
#接下来注意了,要开始获取cookie了.
# 获取cookie列表
cookie_list=driver.get_cookies()#这里主要是使用自带的get_cookies方法
# 格式化打印cookie
for cookie in cookie_list:
cookie_dict[cookie['name']]=cookie['value']
print(cookie_dict)
一般需要进行登陆后再操作的网站在爬取的时候对IP的限制都是比较严的,这种情况下就需要添加代理IP池,建议可以选择亿牛云提供的爬虫隧道加强版IP池,因为可以设置用户自主切换IP,爬虫程序可以通过设置HTTP头Proxy-Tunnel: 随机数,将不同的请求强制指定为一个代理IP或不同代理IP;该模式适合一些需要登陆(多个session使用相同IP)、Cookie缓存处理等需要精确控制IP切换时机的业务,代码实现过程如下:
import urllib2
import random
import httplib
class HTTPSConnection(httplib.HTTPSConnection):
def set_tunnel(self, host, port=None, headers=None):
httplib.HTTPSConnection.set_tunnel(self, host, port, headers)
if hasattr(self, 'proxy_tunnel'):
self._tunnel_headers['Proxy-Tunnel'] = self.proxy_tunnel
class HTTPSHandler(urllib2.HTTPSHandler):
def https_open(self, req):
return urllib2.HTTPSHandler.do_open(self, HTTPSConnection, req, context=self._context)
# 要访问的目标页面
targetUrlList = [
"https://httpbin.org/ip",
"https://httpbin.org/headers",
"https://httpbin.org/user-agent",
]
# 代理服务器(产品官网 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "31111"
# 代理验证信息
proxyUser = "username"
proxyPass = "password"
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host": proxyHost,
"port": proxyPort,
"user": proxyUser,
"pass": proxyPass,
}
# 设置 http和https访问都是用HTTP代理
proxies = {
"http": proxyMeta,
"https": proxyMeta,
}
# 设置IP切换头
tunnel = random.randint(1, 10000)
headers = {"Proxy-Tunnel": str(tunnel)}
HTTPSConnection.proxy_tunnel = tunnel
proxy = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy, HTTPSHandler)
urllib2.install_opener(opener)
# 访问三次网站,使用相同的tunnel标志,均能够保持相同的外网IP
for i in range(3):
for url in targetUrlList:
r = urllib2.Request(url)
print(urllib2.urlopen(r).read())